陈香兰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:
老薛主机,虽然是第一次分享这个商家的信息,但是这个商家实际上也有存在有一些年头。看到商家有在进行夏季促销,比如我们很多网友可能有需要的香港VPS主机季度及以上可以半价优惠,如果有在选择不同主机商的香港机房的可以看看老薛主机商家的香港VPS。如果没有记错的话,早年这个商家是主营个人网站虚拟主机业务的,还算不错在异常激烈的市场中生存到现在,应该算是在众多商家中早期积累到一定的用户群的,主打小众个人网站...
HostKvm商家我们也不用多介绍,这个服务商来自国内某商家,旗下也有多个品牌的,每次看到推送信息都是几个服务商品牌一起推送的。当然商家还是比较稳定的,商家品牌比较多,这也是国内商家一贯的做法,这样广撒网。这次看到黑五优惠活动发布了,针对其主打的香港云服务器提供终身6折的优惠,其余机房服务器依然是8折,另还有充值50美元赠送5美元的优惠活动,有需要的可以看看。HostKvm是一个创建于2013年的...
官方网站:https://www.akkocloud.com/AkkoCloud新品英国伦敦CN2 GIA已上线三网回程CN2 GIA 国内速度优秀.电信去程CN2 GIALooking Glass:http://lonlg.akkocloud.com/Speedtest:http://lonlg.akkocloud.com/speedtest/新品上线刚好碰上国庆节 特此放上国庆专属九折循环优惠...
物理内存为你推荐
me域名注册什么是ME域名,为什么注册ME域名asp主机asp虚拟主机租用哪里好?com域名空间域名解析,我是一个新手站长,我买了一个空间跟一个COM域名,空间自带一个2级域名,我想把这个COM域名绑定到空间上,咋么办?急急急!求大神帮我,我创建一个游戏论坛,也查不到资料,可以给20元,我的手机13685455534,谢谢免费虚拟主机申请在哪个网站申请的免费虚拟主机可以绑定顶级域名?求高手指点!代理主机如何将我工作的电脑设置为代理主机 让我回家以后可以用家里的电脑连接店里的主机访问网络台湾vps台湾服务器租用托管那里好深圳网站空间深圳网站设计 哪家好一些?云南虚拟主机云南虚拟主机,公司网站用本地客户,云南数据港怎么样?长沙虚拟主机长沙IDC,求长沙本地虚拟主机,大伙推荐推荐四川虚拟主机222.214.218.100 请问这个IP是哪个服务商提供的?
免费试用vps 购买域名和空间 winscp hawkhost优惠码 rak机房 空间打开慢 正版win8.1升级win10 lighttpd 青果网 轻量 panel1 好看qq空间 权嘉云 免费mysql 789电视网 国外代理服务器软件 免费申请网站 最好的qq空间 1美金 smtp虚拟服务器 更多