嵌入式操作系统_第1页
嵌入式操作系统_第2页
嵌入式操作系统_第3页
嵌入式操作系统_第4页
嵌入式操作系统_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式操作系统嵌入式操作系统陈香兰http:/ 2007中国科学技术大学计算机系xlanchen2007.6.11Embedded Operating Systems2上周一上周一l嵌入式Linux开发技术l嵌入式Linux开发综述lLinux的配置和编译l根文件系统及其制作xlanchen2007.6.11Embedded Operating Systems3上周二上周二l基于i386体系结构的Linux启动代码分析llinux/arch/i386/boot/bootsect.Sllinux/arch/i386/boot/setup.Sllinux/arch/i386/boot/compre

2、ssed/head.Sllinux/arch/i386/kernel/head.Sllinux/arch/init/main.cxlanchen2007.6.11Embedded Operating Systems4本次课本次课l基于i386体系结构的Linux操作系统内核分析l一些基本概念l堆栈l用户态/内核态l虚拟内存l内存寻址基于基于i386体系结构的体系结构的Linux内核分析:内核分析:一些预备知识一些预备知识xlanchen2007.6.11xlanchen2007.6.11Embedded Operating Systems6声明声明l本课内容涉及到的Linux的内核分析,是基于

3、Linux2.4.18内核源代码的,具有一定的典型性,但不一定适用于所有其他的Linux内核版本xlanchen2007.6.11Embedded Operating Systems7操作系统的基本概念操作系统的基本概念l任何计算机系统都包含一个基本的程序集合,称为操作系统。l内核(进程管理,进程调度,进程间通讯机制,内存管理,中断异常处理,文件系统,I/O系统,网络部分)l其他程序(例如函数库,shell程序等等)l操作系统的目的l与硬件交互,管理所有的硬件资源l为用户程序(应用程序)提供一个良好的执行环境xlanchen2007.6.11Embedded Operating Systems

4、8一个典型的一个典型的Linux操作系统的结构操作系统的结构 (the users) Shells and commands Compilers and interpreters System libraries System-call interface to the kernel Signals terminal handling character I/O system terminal drivers File system swapping block I/O system disk and tape driver CPU scheduling page replacement de

5、mand paging virtual memoryr Kernel interface to the hardware Terminal controllers terminals Device controllers disks and tapes Memory controllers physical memory 用户应用程序用户应用程序System call对硬件资对硬件资源的管理源的管理Shell,libKernel implementationxlanchen2007.6.11Embedded Operating Systems9最简单也是最复杂的操作最简单也是最复杂的操作在控制

6、台下输入在控制台下输入ls命令命令Shell程序分析输入参程序分析输入参数,确定这是数,确定这是ls命令命令调用系统调用调用系统调用fork生成生成一个一个shell本身的拷贝本身的拷贝什么是系统调用?为什么我们敲击键盘就会在终端上显示?fork是什么?为什么要调用fork?中断的概念,终端控制台设备驱动的概念保护模式和实模式,内存保护,内核态用户态相关问题进程的描述,进程的创建。COW技术系统调用是怎么实现的?软中断、异常的概念。陷阱门,系统门调用调用exec系统调用将系统调用将ls的可执行文件装入内存的可执行文件装入内存内存管理模块,进程的地址空间,分页机制,文件系统从系统调用返回从系统调

7、用返回如何做到正确的返回?堆栈的维护,寄存器的保存与恢复Shell和和ls都得以执行都得以执行进程的调度,运行队列等待队列的维护xlanchen2007.6.11Embedded Operating Systems10一些基本但很重要的概念一些基本但很重要的概念l堆栈l内核态 vs 用户态l虚拟内存xlanchen2007.6.11Embedded Operating Systems11堆栈堆栈l堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间l函数调用框架l传递参数l保存返回地址l提供局部变量空间l等等lC语言编译器对堆栈的使用有一套的规则l了解堆栈存在的目的和编译器对堆栈使用的规则

8、是理解操作系统一些关键性代码的基础xlanchen2007.6.11Embedded Operating Systems12堆栈寄存器和堆栈操作堆栈寄存器和堆栈操作l堆栈相关的寄存器lesp,堆栈指针(stack pointer)lebp,基址指针(base pointer)l堆栈操作lpush栈顶地址减少4个字节(32位)lpop栈顶地址增加4个字节lebp在C语言中用作记录当前函数调用基址espebp高地址低地址espxlanchen2007.6.11Embedded Operating Systems13利用堆栈实现函数调用和返回利用堆栈实现函数调用和返回l其他关键寄存器lcs : ei

9、p:总是指向下一条的指令地址l顺序执行:总是指向地址连续的下一条指令l跳转/分支:执行这样的指令的时候,cs : eip的值会根据程序需要被修改lcall:将当前cs : eip的值压入栈顶,cs : eip指向被调用函数的入口地址lret:从栈顶弹出原来保存在这里的cs : eip的值,放入cs : eip中l发生中断时?l?xlanchen2007.6.11Embedded Operating Systems14/ 调用者call target/建立被调用者函数的堆栈框架pushl %ebpmovl %esp, %ebp/拆除被调用者函数的堆栈框架movl %ebp,%esppopl %e

10、bp ret/被调用者函数体/do sth.call指令:1)将下一条指令的地址A保存在栈顶2)设置eip指向被调用程序代码开始处将地址A恢复到eip中xlanchen2007.6.11Embedded Operating Systems15函数堆栈框架的形成函数堆栈框架的形成lcall xxxl执行call之前l执行call时,cs : eip原来的值指向call下一条指令,该值被保存到栈顶,然后cs : eip的值指向xxx的入口地址l进入xxxl第一条指令: pushl %ebpl第二条指令: movl %esp, %ebpl函数体中的常规操作,可能会压栈、出栈l退出xxxlmovl %

11、ebp,%esplpopl %ebplretespebp高地址低地址cs : eipespebpespebpespxlanchen2007.6.11Embedded Operating Systems16lC语言中还使用堆栈进行l参数的传递l局部变量的使用xlanchen2007.6.11Embedded Operating Systems17一段小程序一段小程序源文件:test.c这是一个很简单的C程序 main函数中调用了函数p1和p2首先使用gcc生成test.c的可执行文件test然后使用objdump S获得test的反汇编文件xlanchen2007.6.11Embedded Op

12、erating Systems18观察观察p2的堆栈框架的堆栈框架l从test的反汇编文件中找到p2的反汇编代码int p2(int x,int y)push %ebpmov %esp,%ebpreturn x+y;mov 0 xc(%ebp),%eaxadd 0 x8(%ebp),%eaxpop %ebpret建立框架拆除框架ebpespebp调用者堆栈框架espebpyx高地址低地址xlanchen2007.6.11Embedded Operating Systems19观察观察main函数是如何传递参数给函数是如何传递参数给p2的的z=p2(x,y); pushl 0 xfffffff8

13、(%ebp) pushl 0 xfffffff4(%ebp) call 804839b add $0 x8,%esp mov %eax,0 xfffffffc(%ebp)printf(%d=%d+%dn,z,x,y); pushl 0 xfffffff8(%ebp) pushl 0 xfffffff4(%ebp) pushl 0 xfffffffc(%ebp) push $0 x8048510 call 80482b0 p2的返回值是如何返回给main的?调用者堆栈框架espebpy的值x的值高地址低地址被调用者堆栈框架ebpcs:eipespebpespespxlanchen2007.6.1

14、1Embedded Operating Systems20ebp观察观察main中的局部变量中的局部变量int main(void)push %ebpmov %esp,%ebpsub $0 x18,%esp char c=a; movb $0 x61,0 xfffffff3(%ebp)int x,y,z;x=1; movl $0 x1,0 xfffffff4(%ebp)y=2; movl $0 x2,0 xfffffff8(%ebp)调用者ebpespebpespespc=ax=1y=2高地址低地址xlanchen2007.6.11Embedded Operating Systems21eip

15、eipeipeip观察程序运行时堆栈的变化观察程序运行时堆栈的变化mainp1(c)p2(x,y)p1p2mainp2p1程序的代码段堆栈eipespmain堆栈ceipeipeipp1的堆栈espeipeipeipx,yeipp2堆栈eipxlanchen2007.6.11Embedded Operating Systems22另一段小程序另一段小程序和前一段小程序稍有不同和前一段小程序稍有不同在这个小程序中,在这个小程序中,main函数中调用了函数函数中调用了函数p2,而在,而在p2的执行过程中又调用了函数的执行过程中又调用了函数p1xlanchen2007.6.11Embedded Op

16、erating Systems23观察程序运行时堆栈的变化观察程序运行时堆栈的变化eipeipeipeipmainp2(x,y)p1p2p1(c)mainp2p1程序的代码段堆栈eipespmain堆栈espeipeipx,yeipp2堆栈eipeipeipeipceipp1堆栈espxlanchen2007.6.11Embedded Operating Systems24观察堆栈在内核中的使用观察堆栈在内核中的使用l在内核代码中经常有这样的函数,它的参数是struct pt_regs *regs可以往回一层层的寻找这个参数是怎么传递过来的,最后我们可以发现最源头的函数使用了这样的参数stru

17、ct pt_regs regs比如void do_IRQ(struct pt_regs regs)如果再进一步寻找是谁调用了这个do_IRQ,我们会发现只是一条简单的汇编语句call do_IRQxlanchen2007.6.11Embedded Operating Systems25为什么要有为什么要有pt_regs结构结构l用户态 vs 内核态l寄存器上下文l从用户态切换到内核态时l必须保存用户态的寄存器上下文l要保存哪些?l保存在哪里?l中断/int指令会在堆栈上保存一些寄存器的值l如:用户态栈顶地址、当时的状态字、当时的cs:eip的值xlanchen2007.6.11Embedded

18、 Operating Systems26pt_regs结构结构 struct pt_regs long ebx; long ecx; long edx; long esi; long edi; long ebp; long eax; int xds; int xes; long orig_eax; long eip; int xcs; long eflags; long esp; int xss; ; 1 SAVE_ALL 和 RESTORE_ALL 保存和恢复的寄存器 2 异常处理函数中的 Error_code为保持一致而保存的数 CPU在进入中断或者异常前自动保存的寄存器 1. 中断(狭)

19、和系统调用保存的中断号和系统调用号 2. 或者,CPU 为产生硬件错误码的异常保存的硬件错误码 3. 或者,为保持一致,在异常处理函数中,随便保存的一个无效的数 xlanchen2007.6.11Embedded Operating Systems27SAVE_ALL和和RESTORE_ALLxlanchen2007.6.11Embedded Operating Systems28do_IRQ的调用方式的调用方式l仔细阅读一下与之相连的汇编码pushl $n-256SAVE_ALLcall do_IRQjmp ret_from_intrxlanchen2007.6.11Embedded Ope

20、rating Systems29do_IRQ的函数定义方式的函数定义方式regparm(x) x!=0:告诉gcc不通过堆栈而通过寄存器传。x是参数个数,寄存器依此使用EAX,EDX,ECX而asmlinkage则使得编译器不通过寄存器(x=0)而使用堆栈传递参数因此,do_IRQ将栈顶的内容看成pt_regs结构的参数,在必要时可以通过访问这里的内容获得信息xlanchen2007.6.11Embedded Operating Systems30用户态和内核态的概念用户态和内核态的概念lWhy?l假定不区分l用户直接修改操作系统的数据l用户直接调用操作系统的内部函数l用户直接操作外设l用户任

21、意读/写物理内存xlanchen2007.6.11Embedded Operating Systems31l因此,要区分用户态和内核态:l禁止用户程序和底层硬件直接打交道(最简单的例子,如果用户程序往硬件控制寄存器写入不恰当的值,可能导致硬件无法正常工作)l禁止用户程序访问任意的物理内存(否则可能会破坏其他程序的正常执行,如果对核心内核所在的地址空间写入数据的话,会导致系统崩溃)xlanchen2007.6.11Embedded Operating Systems32l什么是用户态和内核态?l一般现代CPU都有几种不同的指令执行级别l在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这

22、种CPU执行级别就对应着内核态l而在相应的低级别执行状态下,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动l举例:intel x86 CPU有四种不同的执行级别0-3,Linux只使用了其中的0级和3级分别来表示内核态和用户态xlanchen2007.6.11Embedded Operating Systems33l如何区分一段代码是核心态还是用户态lcs寄存器的最低两位表明了当前代码的特权级lCPU每条指令的读取都是通过cs:eip这两个寄存器:其中cs是代码段选择寄存器,eip是偏移量寄存器。l上述判断由硬件完成l一般来说在Linux中,地址空间是一个显著的标志:0 xc0000000以上的地址空间只能在内核态下访问,0 x000000000 xbfffffff的地址空间在两种状态下都可以访问注意:这里所说的地址空间是逻辑地址而不是物理地址xlanchen2007.6.11Embedded Operating Systems34虚拟内存虚拟内存l物理内存有限,是一种稀缺资源l局部性原理l空间局部性l时间局部性l按需调页l页框l利用磁盘上的交换空间xlanchen2007.6.11Embedded Operating Systems35l进程的虚拟地址空间l独立的地址空间(32位,4GB),每个进程一个l在Linux中,3G以上是内核空间,3G以下是用户空间l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论