嵌入式操作系统

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

美国Cera 2核4G 20元/45天 香港CN2 E5 20M物理机服务器 150元 日本CN2 E5 20M物理机服务器 150元 提速啦

提速啦 成立于2012年,作为互联网老兵我们一直为用户提供 稳定 高速 高质量的产品。成立至今一直深受用户的喜爱 荣获 “2021年赣州安全大赛第三名” “2020创新企业入围奖” 等殊荣。目前我司在美国拥有4.6万G总内存云服务器资源,香港拥有2.2万G总内存云服务器资源,阿里云香港机房拥有8000G总内存云服务器资源,国内多地区拥有1.6万G总内存云服务器资源,绝非1 2台宿主机的小商家可比。...

飞讯云E5-2678V3 64GB,湖北十堰100G高防物理机330元/月

飞讯云官网“飞讯云”是湖北飞讯网络有限公司旗下的云计算服务品牌,专注为个人开发者用户、中小型、大型企业用户提供一站式核心网络云端部署服务,促使用户云端部署化简为零,轻松快捷运用云计算。飞讯云是国内为数不多具有ISP/IDC双资质的专业云计算服务商,同时持有系统软件著作权证书、CNNIC地址分配联盟成员证书,通过了ISO27001信息安全管理体系国际认证、ISO9001质量保证体系国际认证。 《中华...

香港云服务器 1核 256M 19.9元/月 Mineserver Ltd

Mineserver(ASN142586|UK CompanyNumber 1351696),已经成立一年半。主营香港日本机房的VPS、物理服务器业务。Telegram群组: @mineserver1 | Discord群组: https://discord.gg/MTB8ww9GEA7折循环优惠:JP30(JPCN2宣布产品可以使用)8折循环优惠:CMI20(仅1024M以上套餐可以使用)9折循...

物理内存为你推荐
独立ip空间如何给网站申请独立的IP空间域名服务域名服务器是什么?有什么作用域名主机电脑域名是什么查询ip怎样查别人的ip地址?美国vps租用如何选择国外vps服务器?深圳网站空间求免费稳定空间网站?便宜虚拟主机麻烦各位给我推荐一个比较便宜的虚拟主机,要质量好的。谢谢大家了1g虚拟主机打算买个1G的虚拟主机,用来做什么好?山东虚拟主机青岛网络公司哪家好中文域名中文域名有哪些?
美国免费主机 台湾虚拟主机 域名管理 我的世界服务器租用 flashfxp怎么用 香港cdn 密码泄露 美国php空间 地址大全 警告本网站美国保护 100x100头像 193邮箱 移动王卡 建站技术 winserver2008下载 ftp是什么东西 以下 大硬盘分区 ddos攻击 次时代主机 更多