版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
xlanchen@2006.6.7EmbeddedOperatingSystems1上周三嵌入式Linux开发技术嵌入式Linux开发综述Linux的配置和编译根文件系统及其制作xlanchen@2006.6.7EmbeddedOperatingSystems2上周四基于i386体系结构的Linux启动代码分析linux/arch/i386/boot/bootsect.Slinux/arch/i386/boot/setup.Slinux/arch/i386/boot/compressed/head.Slinux/arch/i386/kernel/head.Slinux/arch/init/main.cxlanchen@2006.6.7EmbeddedOperatingSystems3本次课课程第二部分:Linux操作系统内核分析一些基本概念内存寻址Linux内核分析:
一些预备知识xlanchen@2006.6.7xlanchen@2006.6.7EmbeddedOperatingSystems5操作系统的基本概念任何计算机系统都包含一个基本的程序集合,称为操作系统。内核(进程管理,进程调度,进程间通讯机制,内存管理,中断异常处理,文件系统,I/O系统,网络部分)其他程序(例如函数库,shell程序等等)操作系统的目的与硬件交互,管理所有的硬件资源为用户程序(应用程序)提供一个良好的执行环境xlanchen@2006.6.7EmbeddedOperatingSystems6一个典型的Linux操作系统的结构用户应用程序Systemcall对硬件资源的管理Shell,libKernelimplementationxlanchen@2006.6.7EmbeddedOperatingSystems7最简单也是最复杂的操作在控制台下输入ls命令Shell程序分析输入参数,确定这是ls命令调用系统调用fork生成一个shell本身的拷贝什么是系统调用?为什么我们敲击键盘就会在终端上显示?fork是什么?为什么要调用fork?中断的概念,终端控制台设备驱动的概念保护模式和实模式,内存保护,内核态用户态相关问题进程的描述,进程的创建。COW技术系统调用是怎么实现的?软中断、异常的概念。陷阱门,系统门调用exec系统调用将ls的可执行文件装入内存内存管理模块,进程的地址空间,分页机制,文件系统从系统调用返回如何做到正确的返回?堆栈的维护,寄存器的保存与恢复Shell和ls都得以执行进程的调度,运行队列等待队列的维护xlanchen@2006.6.7EmbeddedOperatingSystems8一些基本但很重要的概念堆栈内核态vs
用户态xlanchen@2006.6.7EmbeddedOperatingSystems9堆栈堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间函数调用框架传递参数保存返回地址提供局部变量空间等等C语言编译器对堆栈的使用有一套的规则了解堆栈存在的目的和编译器对堆栈使用的规则是理解操作系统一些关键性代码的基础xlanchen@2006.6.7EmbeddedOperatingSystems10//调用者…calltarget…函数调用和返回//建立函数框架
pushl%ebp
movl%esp,%ebp//拆除函数框架
movl%ebp,%esp
popl%ebp
ret//被调用者函数体
//dosth.…保存返回地址设置eip指向被调用程序将返回地址恢复到eip中xlanchen@2006.6.7EmbeddedOperatingSystems11堆栈相关的寄存器esp,堆栈指针(stackpointer)ebp,基址指针(basepointer)ebp在C语言中用作记录当前函数调用基址举例说明参数的传递局部变量的使用函数调用框架的形成xlanchen@2006.6.7EmbeddedOperatingSystems12一段小程序
这是一个很简单的C程序的结构main函数中调用了函数p1和p2源文件:test.c首先使用gcc获得test.c的可执行文件test然后使用objdump–S获得test的反汇编文件xlanchen@2006.6.7EmbeddedOperatingSystems13观察p2的函数调用框架从test的反汇编文件中找到p2的反汇编代码intp2(intx,inty){ push%ebp mov%esp,%ebp
returnx+y; mov0xc(%ebp),%eax add0x8(%ebp),%eax} pop%ebp ret建立框架拆除框架ebpespebp调用者函数框架espebpyxxlanchen@2006.6.7EmbeddedOperatingSystems14观察main函数是如何传递参数给p2的
…z=p2(x,y); pushl0xfffffff8(%ebp) pushl0xfffffff4(%ebp) call804839b<p2> add$0x8,%esp mov%eax,0xfffffffc(%ebp)printf("%d=%d+%d\n",z,x,y); pushl0xfffffff8(%ebp) pushl0xfffffff4(%ebp) pushl0xfffffffc(%ebp) push$0x8048510 call80482b0<printf@plt>
…p2的返回值是如何返回给main的?xlanchen@2006.6.7EmbeddedOperatingSystems15ebp观察main中的局部变量intmain(void){ push%ebp mov%esp,%ebp sub$0x18,%esp
… charc='a'; movb$0x61,0xfffffff3(%ebp) intx,y,z; x=1; movl$0x1,0xfffffff4(%ebp) y=2; movl$0x2,0xfffffff8(%ebp)
…调用者ebpespebpespespcxyxlanchen@2006.6.7EmbeddedOperatingSystems16eipeipeipeip观察程序运行时堆栈的变化main…p1(c)…p2(x,y)…p1p2mainp2p1程序的代码段堆栈eipespmain堆栈ceipeipeipp1的堆栈espeipeipeipx,yeipp2堆栈eipxlanchen@2006.6.7EmbeddedOperatingSystems17另一段小程序
和前一段小程序稍有不同在这个小程序中,main函数中调用了函数p2,而在p2的执行过程中又调用了函数p1xlanchen@2006.6.7EmbeddedOperatingSystems18观察程序运行时堆栈的变化eipeipeipeipmain…p2(x,y)…p1p2…p1(c)…mainp2p1程序的代码段堆栈eipespmain堆栈espeipeipx,yeipp2堆栈eipeipeipeipceipp1堆栈espxlanchen@2006.6.7EmbeddedOperatingSystems19观察堆栈在内核中的使用在内核代码中经常有这样的函数,它的参数是structpt_regs*regs
可以往回一层层的寻找这个参数是怎么传递过来的,最后我们可以发现最源头的函数使用了这样的参数structpt_regsregs
比如voiddo_IRQ(structpt_regsregs)
如果再进一步寻找是谁调用了这个do_IRQ,我们会发现只是一条简单的汇编语句
calldo_IRQ
xlanchen@2006.6.7EmbeddedOperatingSystems20pt_regs结构xlanchen@2006.6.7EmbeddedOperatingSystems21SAVE_ALL和RESTORE_ALLxlanchen@2006.6.7EmbeddedOperatingSystems22do_IRQ的调用方式仔细阅读一下与之相连的汇编码pushl$n-256SAVE_ALLcalldo_IRQjmpret_from_intrxlanchen@2006.6.7EmbeddedOperatingSystems23do_IRQ的函数定义方式
regparm(x)x!=0:告诉gcc不通过堆栈而通过寄存器传。
x是参数个数,寄存器依此使用EAX,EDX,ECX…而asmlinkage则使得编译器不通过寄存器(x=0)而使用堆栈传递参数xlanchen@2006.6.7EmbeddedOperatingSystems24用户态和内核态的概念什么是用户态和内核态?一般现代CPU都有几种不同的指令执行级别在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态而在相应的低级别执行状态下,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动举例:
intelx86CPU有四种不同的执行级别0-3,Linux只使用了其中的0级和3级分别来表示内核态和用户态xlanchen@2006.6.7EmbeddedOperatingSystems25为什么要区分用户态和内核态?禁止用户程序和底层硬件直接打交道
(最简单的例子,如果用户程序往硬件控制寄存器写入不恰当的值,可能导致硬件无法正常工作)禁止用户程序访问任意的物理内存
(否则可能会破坏其他程序的正常执行,如果对核心内核所在的地址空间写入数据的话,会导致系统崩溃)xlanchen@2006.6.7EmbeddedOperatingSystems26如何区分一段代码是核心态还是用户态cs寄存器的最低两位表明了当前代码的特权级CPU每条指令的读取都是通过cs:eip这两个寄存器:
其中cs是代码段选择寄存器,eip是偏移量寄存器。上述判断由硬件完成一般来说在Linux中,地址空间是一个显著的标志:0xc0000000以上的地址空间只能在内核态下访问,0x00000000-0xbfffffff的地址空间在两种状态下都可以访问注意:这里所说的地址空间是逻辑地址而不是物理地址xlanchen@2006.6.7EmbeddedOperatingSystems27站在CPU执行指令的角度CPUeipesp0xc0000000c=gets()main…someaction进程管理waitkeyboradqueue进程x进程xidleintr8259keyboard中断处理Wakeupprogress内核其他模块espeipespcsds等等esp系统调用处理
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《老年人能力综合评估规范》标准修订编制说明
- DB11T 1031-2013 低层蒸压加气混凝土承重建筑技术规程
- 农业机械采购招投标文件范本
- 智慧城市解决方案研发外包制度
- 活动策划师聘用合同模板
- 汽车维修招投标操作规程
- 医药电商子公司用户体验改进
- 教育机构硬化地面施工合同
- 城镇医疗救助管理办法综合
- 教育公司消防管道安装合同
- 无违反计划生育证明(3篇)
- 湖南省建设工程施工合同(示范文本)(HNJS-2014)
- 水稻的形态结构分析课件
- 叙事学之结构模式-课件
- 对比剂不良反应预防和处理课件
- 印象江苏课件
- 口腔材料学知识点
- 《污水处理技术》术语英语词汇大全
- 化学品安全技术说明书 MSDS(甲胺)
- 学校发展规划课件
- 锚喷支护施工质量验收评定表(2022版)
评论
0/150
提交评论