嵌入式操作系统

物理内存  时间: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:

CloudCone 新增洛杉矶优化线路 年付17.99美元且简单线路测试

CloudCone 商家在以前的篇幅中也有多次介绍到,这个商家也蛮有意思的。以前一直只有洛杉矶MC机房,而且在功能上和Linode、DO、Vultr一样可以随时删除采用按时计费模式。但是,他们没有学到人家的精华部分,要这样的小时计费,一定要机房多才有优势,否则压根没有多大用途。这不最近CloudCone商家有点小变化,有新人洛杉矶优化线路,具体是什么优化的等会我测试看看线路。内存CPU硬盘流量价格...

华纳云,3折低至优惠云服务器,独立服务器/高防御服务器低至6折,免备案香港云服务器CN2 GIA三网直连线路月付18元起,10Mbps带宽不限流量

近日华纳云发布了最新的618返场优惠活动,主要针对旗下的免备案香港云服务器、香港独立服务器、香港高防御服务器等产品,月付6折优惠起,高防御服务器可提供20G DDOS防御,采用E5处理器V4CPU性能,10Mbps独享CN2 GIA高速优质带宽,有需要免备案香港服务器、香港云服务器、香港独立服务器、香港高防御服务器、香港物理服务器的朋友可以尝试一下。华纳云好不好?华纳云怎么样?华纳云服务器怎么样?...

易探云香港vps主机价格多少钱?香港云服务器主机租用价格

易探云香港vps主机价格多少钱?香港vps主机租用费用大体上是由配置决定的,我们选择香港vps主机租用最大的优势是免备案vps。但是,每家服务商的机房、配置、定价也不同。我们以最基础配置为标准,综合比对各大香港vps主机供应商的价格,即可选到高性能、价格适中的香港vps主机。通常1核CPU、1G内存、2Mbps独享带宽,价格在30元-120元/月。不过,易探云香港vps主机推出四个机房的优惠活动,...

物理内存为你推荐
主机租赁电脑出租怎么收费的?免费网站域名申请哪有里可以申请免费域名的网站?查询ip怎样查别人的ip地址?域名购买如何购买域名?台湾vps哪个地区的VPS从大陆访问快呢。手机网站空间手机登陆qq空间网址是什么?虚拟主机管理系统如何用win虚拟主机管理系统搭建万网虚拟主机万网虚拟、专享、独享主机有什么区别?山东虚拟主机能否在虚拟机与主机之间建立局域网,让主机与虚拟机同时上网?apache虚拟主机Apache跟虚拟主机有什么关系?
传奇服务器租用 中国万网域名 cybermonday bbr 国外服务器网站 抢票工具 2017年万圣节 typecho windows2003iso 一元域名 泉州移动 gtt 域名与空间 东莞主机托管 杭州电信宽带优惠 阿里云邮箱登陆 1美元 网站加速 七牛云存储 789电视剧网 更多