嵌入式操作系统

物理内存  时间:2021-01-16  阅读:()
陈香兰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:

justhost:“第4次VPS测评”,8.3元/月,200M带宽,不限流量,KVM虚拟,4个俄罗斯机房应有适合你的

justhost.ru官方来消息说已经对网络进行了比较全面的优化,针对中国电信、联通、移动来说,4个机房总有一个适合中国用户,让站长进行一下测试,这不就有了这篇有关justhost的VPS的第四次测评。本帖主要关注的是网络,对于其他的参数一概不管! 官方网站:https://justhost.ru 最低配VPS:8.3元/月,KVM,512M内存,5G硬盘,200M带宽,不限流量 购买链接:...

国内云服务器 1核 2G 2M 15元/月 萤光云

标题【萤光云双十二 全场6折 15元/月 续费同价】今天站长给大家推荐一家国内云厂商的双十二活动。萤光云总部位于福建福州,其成立于2002 年。主打高防云服务器产品,主要提供福州、北京、上海 BGP 和香港 CN2 节点。萤光云的高防云服务器自带 50G 防御,适合高防建站、游戏高防等业务。这家厂商本次双十二算是性价比很高了。全线产品6折,上海 BGP 云服务器折扣更大 5.5 折(测试了一下是金...

SugarHosts糖果主机商更换域名

昨天,遇到一个网友客户告知他的网站无法访问需要帮他检查到底是什么问题。这个同学的网站是我帮他搭建的,于是我先PING看到他的网站是不通的,开始以为是服务器是不是出现故障导致无法打开的。检查到他的服务器是有放在SugarHosts糖果主机商中,于是我登录他的糖果主机后台看到服务器是正常运行的。但是,我看到面板中的IP地址居然是和他网站解析的IP地址不同。看来官方是有更换域名。于是我就问 客服到底是什...

物理内存为你推荐
免费国外空间国外免费空间有哪些好用?免费国内空间网站免费空间(国内的)那里有?免费域名空间求速度快的 免费空间 带域名的 谢谢大家香港虚拟主机虚拟主机大陆的还是香港的好?独立ip虚拟主机独立ip的虚拟主机和vps的区别和优势??虚拟主机评测浅谈建站新手如何挑选虚拟主机论坛虚拟主机我想买个论坛虚拟主机,但是去了好多网站都不怎么样?长沙虚拟主机长沙哪里虚拟主机和主机托管比较关好!花生壳域名用花生壳可申请免费域名吗?百度域名www.baidu.com.cn是百度的网址吗
厦门虚拟主机 域名注册中心 哈尔滨服务器租用 hkbn linode la域名 国外私服 http500内部服务器错误 web服务器架设软件 南昌服务器托管 建立邮箱 cloudlink 创建邮箱 域名与空间 台湾google cxz 贵阳电信测速 iki 申请免费空间 lamp的音标 更多