《Linux操作系统分析3.ppt》由会员分享,可在线阅读,更多相关《Linux操作系统分析3.ppt(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Linux操作系统分析操作系统分析中国科学技中国科学技术术大学大学计计算机系算机系陈陈香香兰兰(051287161316)Autumn 2009上次上次课课内容回内容回顾顾源代码简介启动代码简介Linux内核代码组成分析Linux的启动层次Linux的启动分析12/22/20222Linux OS Analysis内存寻址内存寻址内容提要内容提要X86微处理器的存储器寻址Linux在X86上的寻址实现12/22/20224Linux OS Analysis存存储储器地址器地址在intelx86处理器下,有三种不同的地址逻辑地址:每个逻辑地址由一个段(segment)和偏移量(offset)组成
2、线性地址:32位无符号整数,可表示4G大小的地址空间物理地址:芯片级内存单元寻址。它们与从CPU的地址引脚发送到内存总线上的电信号相对应地址转换过程物理地址线性地址分段单元分页单元逻辑地址12/22/20225Linux OS Analysis为为什么需要内存什么需要内存寻寻址机制址机制?保护内核不受恶意或者无意的破坏隔离各个用户进程方便程序的编写,使程序员可以抛开对物理内存的考虑,而且理论上可以使用任意大小的空间12/22/20226Linux OS Analysis硬件的分段硬件的分段单单元(元(1)段寄存器段寄存器(segment register)I386体系结构采用分段机制逻辑地址=
3、段:段内偏移使用16位段寄存器来指明当前所使用的段有六个:cs,ss,ds,es,fs和gsCPU规定了3个寄存器的专门的用途cs代码段寄存器,指向存放程序指令的段ss堆栈段寄存器,指向存放当前堆栈的段ds数据段寄存器,指向存放数据的段12/22/20227Linux OS Analysis从从80386开始,开始,Intel微微处处理器以两种不同的方理器以两种不同的方式式执执行地址行地址转换转换实模式(20位)16位段寄存器只记录段基址的高16位,因此段基址必须4位对齐(末4位为0)不采用虚拟地址空间,直接采用物理地址空间 物理地址=段寄存器值*16+段内偏移保护模式(32位)16位段寄存器
4、无法直接记录段的信息,因此需要与全局描述符表GDT配合使用GDT中记录了每个段的信息(段描述符),段寄存器只需记录段在GDT中的序号12/22/20228Linux OS Analysis注意:cs寄存器还有一个很重要的功能:它含有一个两位的域,用以指明CPU的当前特权级CPL(current privilege level),值为0代表最高优先级,值为3代表最低优先级线性地址=段基地址+段内偏移其中,段基地址是根据段寄存器所指明的GDT中的段描述符中的信息得到的物理地址:根据页表对线性地址进行转换而得到12/22/20229Linux OS AnalysisGDT和段描述符和段描述符(seg
5、ment descriptor)每个段由一个段描述符来表示,一个段描述符长度为8个字节全局描述符表GDT(global description table)就用来存放段描述符GDT表也存放在RAM中,并使用一个专门的寄存器GDTR来指示GDT表在RAM中的位置(物理起始地址)局部描述符表LDT(Local Description Table)根据x86,每个进程可以设置一个LDTLDT表也存放在RAM中,使用LDTR来指示当前的LDT表12/22/202210Linux OS Analysis由于段的用途不一由于段的用途不一样样,Intelx86提供下列几种提供下列几种段描述符段描述符数据段描
6、述符(Data Segment Descriptor)可以描述各种用户数据段和堆栈段代码段描述符(Code Segment Descriptor)描述一个用户代码段任务状态段描述符(Task State Segment Descriptor)描述一个任务的状态段局部描述符表描述符描述一个LDT段系统段描述符(System Segment Descriptor)12/22/202211Linux OS Analysis段描述符主要描述如下内容段描述符主要描述如下内容段的物理起始地址物理起始地址(base字段,32位)段长长度度(limit字段,20位)段长度的单单位位(粒度,G标志,1位)0:字
7、节为单位1:4KB为单位是否系统段(S标标志志,1位)0:系统段1:普通的段12/22/202212Linux OS Analysis类类型型字段(Type字段,4位)例如代码段、数据段、任务状态段、局部描述符段等等段的特特权级权级描述字段(DPL字段,2位)00b:只能被CPL=00b的内核代码段访问.11b:可以被任意代码段访问段存在存在标标志志(1位)0:该段当前不在内存中1:该段当前在内存中Descriptor Privilege Level12/22/202213Linux OS Analysis段描述符的格式段描述符的格式段基址、段长度、其他属性例如,0 x00cf9a000000
8、ffff12/22/202214Linux OS Analysis段段选择选择子(子(Segment Selector)16位段寄存器与GDT或LDT配合起来对相应的段进行寻址段寄存器中的值称为段选择子,16位13位的索引,指定GDT表中的相应的段描述符1位的TI(Table Indicator)(跟LDT表有关,Linux中基本未使用)2位RPL(request privilege level)当相应的段选择符装入到cs寄存器中时,表明了CPU的当前特权级(用户/内核)indexTIRPL 2 1 015Segment selector12/22/202215Linux OS Analysi
9、s段段选择选择子的使用和段描述符的快速子的使用和段描述符的快速访问访问段寄存器段选择子段描述符描述符表段()非编程寄存器段描述符12/22/202216Linux OS Analysis逻辑逻辑地址到地址到线线性地址的性地址的转换转换GDT或LDTGDTR或LDTR选择子偏移线性地址逻 辑 地 址12/22/202217Linux OS AnalysisLinux中的段中的段基于下面两个原因,linux中只使用了几个段段和页的同时存在在一定程度上有点多余。因为两者都可以划分进程的物理空间所有的进程希望使用同样的0-4G的逻辑空间。这样程序员不必考虑进程地址的问题,也让内核的内存管理变得简单一些
10、12/22/202218Linux OS AnalysisLinux下的全局描述符表(部分下的全局描述符表(部分)在arch/x86/kernel/head_32.S中内核数据段用户代码段用户数据段Linux中的GDT 在include/asm-x86/segment.h中12/22/202219Linux OS Analysis在arch/x86/boot/pm.c中在arch/x86/boot/pm.c中12/22/202220Linux OS Analysisarch/x86/kernel/cpu/common.c11/17/09_BOOT_CS0 x10=0000 0000 0001
11、0000b内核代码段,在GDT中相应的段描述符各个域有如下值Index=2RPL=0特权级4GB内核代码段内核数据段用户代码段用户数据段 0 x00cf9a000000ffff12/22/202223Linux OS Analysis_BOOT_DS0 x18=0000 0000 0001 1000b内核数据段,在GDT中相应的段描述符各个域有如下值Index=3RPL=0特权级内核代码段内核数据段用户代码段用户数据段4GB 0 x00cf92000000ffff12/22/202224Linux OS AnalysisLinux下下GDT表的初始化表的初始化1)在i386/boot/herd
12、er.S-i386/boot/main.c:main()-arch/x86/boot/pm.c:go_to_protected_mode-setup_gdt中GDT表中的内容GDT表基址的装载(此时还没有切换到保护模式)切换到保护模式之后,(代码)段寄存器的装载2)在i386/boot/compressed/head_32.S中各个数据段寄存器的装载3)在i386/kernel/head_32.S中boot_gdt和GDT基址的装载各段寄存器的重新装载early_gdt_descr和per_cpu_gdt_page 参见arch/x86/kernel/cpu/common.c12/22/202
13、225Linux OS Analysis硬件的分硬件的分页单页单元元分页单元:线性地址=物理地址为了效率起见,线性地址被分成以固定长度为单位的组,称为页。页内连续的线性地址被映射到连续的物理地址中。把线性地址映射到物理地址的数据结构叫做页表(page table)。页表存放在内存中,并在启用分页单元以前由内核对之进行初始化Intel处理器中,通过设置CR0寄存器的一个标志位来启用分页单元。12/22/202226Linux OS Analysis硬件的分硬件的分页单页单元元区分一下页和页框的概念一页指一系列的线性地址和包含于其中的数据页框(page frame)分页单元认为所有的RAM被分成了
14、固定长度的页框每个页框可以包含一页,也就是说一个页框的长度和一个页的长度是一样的页框是内存的一部分,是一个实际的存储区域。页只是一组数据块,可以存放在任何页框中12/22/202227Linux OS Analysis常常规规分分页页从i386起,intel处理器的分页单元处理4KB的页32位的线性地址被分成3个域目录(directory)最高的10位页表(Table)中间的10位偏移量(offset)最低的12位线性地址的转换分两步完成,每一步都基于一种转换表第一种称为页目录表(page directory)第二种称为页表(page table)正在使用的页目录表的物理地址存放在CPU的CR
15、3寄存器中12/22/202228Linux OS AnalysisIntel 80 x86处理器的分页线性地址CR3页目录页目录页表页表页页12/22/202229Linux OS Analysis页页目目录录表表项项和和页页表表项项页目录表项和页表项存储的都是页框的基址页目录表项存储对应页表的物理地址页表项存储对应物理页面的起始地址4KB,12位对齐,因此最后12位被用来存放该页的标志位,包括:Present标志、Accessed标志、Dirty标志、Read/Write标志、User/Supervisor标志、如果present标志为0,分页单元就把这个线性地址存放在处理器的CR2寄存器
16、中,并产生一个14号异常(缺页异常)12/22/202230Linux OS Analysis硬件的分硬件的分页单页单元元扩展分页pentium处理器引进了扩展分页,允许页框的大小为4K或者4M线性地址线性地址页目录页目录4M 页页CR312/22/202231Linux OS Analysis硬件保硬件保护护方案方案级别由前面提到的User/Spuervisor标志控制若这个标志为0,只有当CPL小于3(对linux来说,即处理器处于内核态)时才能对此页寻址;若这个标志为1,则总能对此页寻址存取权限由Read/Write标志控制标志为0,页是只读的标志为1,则是可读写的12/22/20223
17、2Linux OS Analysis0 x20000000:0010 0000 0000 0000 0000 0000 0000 0000b分分页举页举例例假设内核给一个正在运行的进程p1分配的线性地址空间是0 x20000000到0 x2003ffff(256KB)这段空间大小为0 x40000,即0 x40个页(64页)有效的线性地址范围为:页目录索引(0 x80=128)页表索引(0 x0=0)0 x20003ffff:0010 0000 0000 0011 1111 1111 1111 1111b页目录索引(0 x80=128)页表索引(0 x3f=63)12/22/202233Lin
18、ux OS Analysisp1的的页页表和虚表和虚拟拟空空间间010231280631023p1的页目录p1的页表p1的页p1的页数据/代码数据/代码12/22/202234Linux OS Analysis分分页举页举例例假设进程需要读取0 x20021406中的字节。分页单元将该地址划分为3个部分:0 x20021406=0010 0000 0000 0010 0001 0100 0000 0110b当进程无论何时试图访问0 x20000000到0 x2003ffff范围之外的线性地址时,都将产生一个保护错误页目录索引(0 x80=128)页表索引(0 x21)页内偏移(0 x406)C
19、R3+p1的页目录p1的页表+Present=0缺页异常XxxxxxXxxxxXxxxxxxx12/22/202235Linux OS AnalysisLinux的分的分页页Linux采用3级分页模式页全局目录(Page Global Directory)页中间目录(Page Middle Directory)页表(Page Table)12/22/202236Linux OS AnalysisLinux 的分的分页页模式模式CR3全局全局页目录页目录中间中间页目录页目录页表页表页页线性地址线性地址12/22/202237Linux OS AnalysisLinux进进程的分程的分页页Linu
20、x对进程的处理很大程度上依赖于分页。实际上,由硬件提供的MMU将线性地址自动转换为物理地址使得下面的设计目标变得可行:给每个进程分配一块不同的物理地址空间,这种机制确保了对寻址错误提供有效的保护区别页(即一组数据)和页框(实际的物理空间)之间的不同。这是虚拟存储器机制的基本因素12/22/202238Linux OS Analysis每个进程都有它自己的页全局目录和自己的页表集合,当进程切换发生时,linux把CR3寄存器的值保存在跟进程相关的一个数据结构中,然后用另外一个进程相应的值填充CR3寄存器。因此,当新进程恢复在CPU上执行时,分页单元将使用一组与新进程对应的页表12/22/2022
21、39Linux OS AnalysisLinux对页表的处理函数硬件提供了这种转换机制,而软件所要做的就是准备好正确的数据,使得硬件能够准确无误的执行Linux中实现很多对页表进行设置,操作和处理的函数include/asm_x86/page.hinclude/asm_x86/pgtable.hinclude/asm_x86/pgtable_2level.h.12/22/202240Linux OS Analysis线线性地址字段性地址字段PAGE_SHIFTPMD_SHIFTPGDIR_SHIFTPTRS_PER_PTEPTRS_PER_PMDPTRS_PER_PGD12/22/202241
22、Linux OS Analysis页页表的表的处处理理表项类型:include/asm_1386/page_32.hpte_t,pmd_t,pgd_t页的保护:include/asm_1386/page.hpgprot_t无符号整数与上述各类型的转换_pte(),_pmd(),_pgd(),_pgprot()pte_val(),pmd_val(),pgd_val(),pgprot_val()12/22/202242Linux OS Analysis判断/读/写/修改各表项的操作pte_none(),pmd_none(),pgd_none()判断对应表项值是否为0pte_present(),pm
23、d_present(),pgd_present()判断对应表项的present标志是否1pte_clear(),pmd_clear(),pgd_clear()清除相应页表的一个表项pmd_bad(),pgd_bad()检查相应目录项是否不能使用pte_read(),pte_write(),pte_exec(),12/22/202243Linux OS Analysis保留的保留的页页框框内核代码和静态数据结构存放在一组保留的页框中。这些页框所含的页从来不会被动态的分配或者交换到磁盘上作为一条常规,linux内核被安装在物理地址0 x00100000开始的地方。一个Linux内核所需的页框总数依
24、赖于该内核的配置方案基于典型配置的内核可以被安装在小于2MB的RAM中1MB12/22/202244Linux OS Analysis为为什么什么选择选择从从1MB开始?开始?观察01MB的使用情况0 x00 x1000:BIOS使用0 x000a00000 x000fffff:BIOS例程、VRAM等等为为避免使用不避免使用不连续连续的物理内存的物理内存,Linux选择从1MB开始12/22/202245Linux OS AnalysisLinux2.4内核的前内核的前512个个页页框,框,2MB(假定内核所需内存假定内核所需内存1MB)不可用的页框可用的页框内核代码初始化过的内核数据未初始
25、化过的内核数据12/22/202246Linux OS Analysis进进程程页页表表一个进程的线性地址空间被分成两部分03G:用户态和内核态都可以访问3G4G:只有内核态可以访问进程的页全局目录前768项:用来映射低于0 xc0000000的线性地址,具体内容与进程相关。剩余的表项:用来映射内核空间,对所有进程都一样12/22/202247Linux OS Analysis内核空内核空间间Linux把内核代码映射到了0 xc0000000以上的空间以前的链接描述文件12/22/202248Linux OS Analysis内核内核页页表表实际上,内核映象在被装入内存以后,CPU仍然运行于实
26、模式下,分页单元还没有被启动在i386/kernel/head_32.S中启动内核分两个阶段初始化自己的页表一,仅创建够自己使用的空间二,利用剩余的RAM并恰当的建立映射整个物理内存的页表12/22/202249Linux OS AnalysisLinux的的临时临时内核内核页页表表i386/kernel/head_32.Sarch/x86/kernel/head_32.S参见vmlinux_32.lds.S12/22/202250Linux OS AnalysisLinux的分的分页页开启分页单元12/22/202251Linux OS Analysis首先填写页目录项(低地址端+3G高地址
27、端)指向pg0等(由edi指向)然后填写pg0中的1024项物理地址底端4M,页表项的值由eax维护12/22/202252Linux OS Analysis页表初始化结束条件11/17/09最最终终内核内核页页表表最终内核页全局目录仍然保留在变量swapper_pg_dir中。它由函数pagetable_init初始化参见arch/x86/mm/init_32.c低端页目录项的失效mem_initzap_low_mappingskernel_physical_mapping_init12/22/202254Linux OS Analysis其他其他关于cache处于分页单元与MM之间关于TL
28、B重写CR3,会导致TLB更新12/22/202255Linux OS Analysis作作业业:_USER_CS、_USER_DS的值分别是多少?它们分别对应GDT表中的哪一项?RPL分别是多少,对应Linux的哪个级别(用户级还是内核级)?在32位pc中,结合Linux2.6.26/arch/x86/kernel/head_32.S中228-251行相关代码,关于临时2级页表的初始化过程,假设pg0所在的物理地址是0 x567000,回答下列问题(以下涉及到数值的地方,请用16进制表示):1.填写在swapper_pg_dir中第0 x0项的内容是什么,有什么含义?2.若填写了swapper_pg_dir中第0 x1项,则此内容是什么?3.填写在pg0的第0 x0项、第0 x1项和第0 x3FF项的内容是多少,有什么含义?4.根据swapper_pg_dir的第0 x0项和pg0的内容,这个临时页表所代表的地址空间中,04MB-1的空间被映射的物理地址空间范围是什么?5.若内核地址空间从3G开始,那么填写在swapper_pd_dir中第0 x300项和0 x301项的内容是什么,与上述第0项和第1项有什么关系,有什么含义?12/22/202256Linux OS Analysis