陈香兰xlanchen@ustc.
edu.
cnhttp://staff.
ustc.
edu.
cn/~xlanchenSpring2007中国科学技术大学计算机系上周一嵌入式Linux开发技术嵌入式Linux开发综述Linux的配置和编译根文件系统及其制作上周二基于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.
c本次课基于i386体系结构的Linux操作系统内核分析一些基本概念堆栈用户态/内核态虚拟内存内存寻址基于i386体系结构的Linux内核分析:一些预备知识xlanchen@2007.
6.
11声明本课内容涉及到的Linux的内核分析,是基于Linux2.
4.
18内核源代码的,具有一定的典型性,但不一定适用于所有其他的Linux内核版本操作系统的基本概念任何计算机系统都包含一个基本的程序集合,称为操作系统.
内核(进程管理,进程调度,进程间通讯机制,内存管理,中断异常处理,文件系统,I/O系统,网络部分)其他程序(例如函数库,shell程序等等)操作系统的目的与硬件交互,管理所有的硬件资源为用户程序(应用程序)提供一个良好的执行环境一个典型的Linux操作系统的结构用户应用程序Systemcall对硬件资源的管理Shell,libKernelimplementation最简单也是最复杂的操作在控制台下输入ls命令Shell程序分析输入参数,确定这是ls命令调用系统调用fork生成一个shell本身的拷贝什么是系统调用为什么我们敲击键盘就会在终端上显示fork是什么为什么要调用fork中断的概念,终端控制台设备驱动的概念保护模式和实模式,内存保护,内核态用户态相关问题进程的描述,进程的创建.
COW技术系统调用是怎么实现的软中断、异常的概念.
陷阱门,系统门调用exec系统调用将ls的可执行文件装入内存内存管理模块,进程的地址空间,分页机制,文件系统从系统调用返回如何做到正确的返回堆栈的维护,寄存器的保存与恢复Shell和ls都得以执行进程的调度,运行队列等待队列的维护一些基本但很重要的概念堆栈内核态vs用户态虚拟内存堆栈堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间函数调用框架传递参数保存返回地址提供局部变量空间等等C语言编译器对堆栈的使用有一套的规则了解堆栈存在的目的和编译器对堆栈使用的规则是理解操作系统一些关键性代码的基础堆栈寄存器和堆栈操作堆栈相关的寄存器esp,堆栈指针(stackpointer)ebp,基址指针(basepointer)堆栈操作push栈顶地址减少4个字节(32位)pop栈顶地址增加4个字节ebp在C语言中用作记录当前函数调用基址espebp高地址低地址esp利用堆栈实现函数调用和返回其他关键寄存器cs:eip:总是指向下一条的指令地址顺序执行:总是指向地址连续的下一条指令跳转/分支:执行这样的指令的时候,cs:eip的值会根据程序需要被修改call:将当前cs:eip的值压入栈顶,cs:eip指向被调用函数的入口地址ret:从栈顶弹出原来保存在这里的cs:eip的值,放入cs:eip中发生中断时//调用者…calltarget…//建立被调用者函数的堆栈框架pushl%ebpmovl%esp,%ebp//拆除被调用者函数的堆栈框架movl%ebp,%esppopl%ebpret//被调用者函数体//dosth.
…call指令:1)将下一条指令的地址A保存在栈顶2)设置eip指向被调用程序代码开始处将地址A恢复到eip中函数堆栈框架的形成callxxx执行call之前执行call时,cs:eip原来的值指向call下一条指令,该值被保存到栈顶,然后cs:eip的值指向xxx的入口地址进入xxx第一条指令:pushl%ebp第二条指令:movl%esp,%ebp函数体中的常规操作,可能会压栈、出栈退出xxxmovl%ebp,%esppopl%ebpretespebp高地址低地址cs:eipespebpespebpespC语言中还使用堆栈进行参数的传递局部变量的使用一段小程序源文件:test.
c这是一个很简单的C程序main函数中调用了函数p1和p2首先使用gcc生成test.
c的可执行文件test然后使用objdump–S获得test的反汇编文件观察p2的堆栈框架从test的反汇编文件中找到p2的反汇编代码intp2(intx,inty){push%ebpmov%esp,%ebpreturnx+y;mov0xc(%ebp),%eaxadd0x8(%ebp),%eax}pop%ebpret建立框架拆除框架ebpespebp调用者堆栈框架espebpyx高地址低地址观察main函数是如何传递参数给p2的…z=p2(x,y);pushl0xfffffff8(%ebp)pushl0xfffffff4(%ebp)call804839badd$0x8,%espmov%eax,0xfffffffc(%ebp)printf("%d=%d+%d\n",z,x,y);pushl0xfffffff8(%ebp)pushl0xfffffff4(%ebp)pushl0xfffffffc(%ebp)push$0x8048510call80482b0…p2的返回值是如何返回给main的调用者堆栈框架espebpy的值x的值高地址低地址被调用者堆栈框架ebpcs:eipespebpespespebp观察main中的局部变量intmain(void){push%ebpmov%esp,%ebpsub$0x18,%esp…charc='a';movb$0x61,0xfffffff3(%ebp)intx,y,z;x=1;movl$0x1,0xfffffff4(%ebp)y=2;movl$0x2,0xfffffff8(%ebp)…调用者ebpespebpespespc='a'x=1y=2高地址低地址eipeipeipeip观察程序运行时堆栈的变化main…p1(c)…p2(x,y)…p1p2mainp2p1程序的代码段堆栈eipespmain堆栈ceipeipeipp1的堆栈espeipeipeipx,yeipp2堆栈eip另一段小程序和前一段小程序稍有不同在这个小程序中,main函数中调用了函数p2,而在p2的执行过程中又调用了函数p1观察程序运行时堆栈的变化eipeipeipeipmain…p2(x,y)…p1p2…p1(c)…mainp2p1程序的代码段堆栈eipespmain堆栈espeipeipx,yeipp2堆栈eipeipeipeipceipp1堆栈esp观察堆栈在内核中的使用在内核代码中经常有这样的函数,它的参数是structpt_regs*regs可以往回一层层的寻找这个参数是怎么传递过来的,最后我们可以发现最源头的函数使用了这样的参数structpt_regsregs比如voiddo_IRQ(structpt_regsregs)如果再进一步寻找是谁调用了这个do_IRQ,我们会发现只是一条简单的汇编语句calldo_IRQ为什么要有pt_regs结构用户态vs内核态寄存器上下文从用户态切换到内核态时必须保存用户态的寄存器上下文要保存哪些保存在哪里中断/int指令会在堆栈上保存一些寄存器的值如:用户态栈顶地址、当时的状态字、当时的cs:eip的值pt_regs结构SAVE_ALL和RESTORE_ALLdo_IRQ的调用方式仔细阅读一下与之相连的汇编码pushl$n-256SAVE_ALLcalldo_IRQjmpret_from_intrdo_IRQ的函数定义方式regparm(x)x!
=0:告诉gcc不通过堆栈而通过寄存器传.
x是参数个数,寄存器依此使用EAX,EDX,ECX…而asmlinkage则使得编译器不通过寄存器(x=0)而使用堆栈传递参数因此,do_IRQ将栈顶的内容看成pt_regs结构的参数,在必要时可以通过访问这里的内容获得信息用户态和内核态的概念Why假定不区分用户直接修改操作系统的数据用户直接调用操作系统的内部函数用户直接操作外设用户任意读/写物理内存因此,要区分用户态和内核态:禁止用户程序和底层硬件直接打交道(最简单的例子,如果用户程序往硬件控制寄存器写入不恰当的值,可能导致硬件无法正常工作)禁止用户程序访问任意的物理内存(否则可能会破坏其他程序的正常执行,如果对核心内核所在的地址空间写入数据的话,会导致系统崩溃)什么是用户态和内核态一般现代CPU都有几种不同的指令执行级别在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态而在相应的低级别执行状态下,代码的掌控范围会受到限制.
只能在对应级别允许的范围内活动举例:intelx86CPU有四种不同的执行级别0-3,Linux只使用了其中的0级和3级分别来表示内核态和用户态如何区分一段代码是核心态还是用户态cs寄存器的最低两位表明了当前代码的特权级CPU每条指令的读取都是通过cs:eip这两个寄存器:其中cs是代码段选择寄存器,eip是偏移量寄存器.
上述判断由硬件完成一般来说在Linux中,地址空间是一个显著的标志:0xc0000000以上的地址空间只能在内核态下访问,0x00000000-0xbfffffff的地址空间在两种状态下都可以访问注意:这里所说的地址空间是逻辑地址而不是物理地址虚拟内存物理内存有限,是一种稀缺资源局部性原理空间局部性时间局部性按需调页页框利用磁盘上的交换空间进程的虚拟地址空间独立的地址空间(32位,4GB),每个进程一个在Linux中,3G以上是内核空间,3G以下是用户空间4G的进程地址空间使用进程私有的二级页表进行地址转换(虚拟地址物理地址)页面大小:4KB页目录、页表若对应的内容在内存中,则对应的二级页表项记录相应的物理页框信息否则根据需要进行装载或者出错处理进程调度后,执行一个新的被调度的进程之前,要先进行页表切换Linux中的内核空间每个进程3G以上的空间用作内核空间从用户地址空间进入内核地址空间不经过页表切换而是通过中断/异常/系统调用入口(也只能如此)站在CPU执行指令的角度CPUeipesp0xc0000000c=gets()main…someaction进程管理waitkeyboradqueue进程x进程xidleintr8259keyboard中断处理Wakeupprogress内核其他模块espeipespcsds等等esp系统调用处理idtr从内存的角度来看物理内存0x00000000内核代码内核静态数据0x004000000x20000000用户代码或数据0xc0000000虚拟空间(512M)(3G)在Linux中,物理内存总是被映射在3G以上的空间中,若物理内存过大,需使用其他的映射技术0x000000000xe00000000xffffffff作业5:
这两天Linode发布了十八周年的博文和邮件,回顾了过去取得的成绩和对未来的展望。作为一家运营18年的VPS主机商,Linode无疑是有一些可取之处的,商家提供基于KVM架构的VPS主机,支持随时删除(按小时计费),可选包括美国、英国、新加坡、日本、印度、加拿大、德国等全球十多个数据中心,所有机器提供高出入网带宽,最低仅$5/月($0.0075/小时)。This month marks Linod...
HostYun是一家成立于2008年的VPS主机品牌,原主机分享组织(hostshare.cn),商家以提供低端廉价VPS产品而广为人知,是小成本投入学习练手首选,主要提供基于XEN和KVM架构VPS主机,数据中心包括中国香港、日本、德国、韩国和美国的多个地区,大部分机房为国内直连或者CN2等优质线路。本月商家全场9折优惠码仍然有效,以KVM架构产品为例,优惠后韩国VPS月付13.5元起,日本东京...
易探云产品限时秒杀&QQ音乐典藏活动正在进行中!购买易探云香港/美国云服务器送QQ音乐绿钻豪华版1年,价值180元,性价比超级高。目前,有四大核心福利产品推荐:福利一、香港云服务器1核1G2M,仅218元/年起(香港CN2线路,全球50ms以内);福利二、美国20G高防云服务器1核1G5M,仅336元/年起(美国BGP线路,自带20G防御);福利三、2G虚拟主机低至58.8元/年(更有免费...
物理内存为你推荐
虚拟主机价格谁知道租虚拟主机多少钱?免费虚拟主机空间谁知道有没有免费的虚拟主机空间linux主机linux优点和缺点有哪些啊?租服务器租个服务器?哪里租?云服务器租用谁知道租用服务器、云主机去哪里租?服务器租用费用价格是多少呀免备案虚拟空间想买个免备案的虚拟主机,不知道哪里的好点成都虚拟空间五星网络隶属于成都冠一科技有限公司,虚拟空间购买了不到一个月不能访问2次,质量真差啊!网站空间购买怎么购买一个网站空间及购买注意事项合肥虚拟主机哪里的虚拟主机空间实惠?虚拟主机mysql在虚拟主机如何打开数据库?
域名停靠 国外永久服务器 59.99美元 512av 英语简历模板word 双12活动 鲜果阅读 服务器cpu性能排行 国外网站代理服务器 魔兽世界台湾服务器 牛人与腾讯客服对话 上海域名 有益网络 北京双线 idc是什么 河南移动m值兑换 带宽租赁 上海电信测速 免备案jsp空间 accountsuspended 更多