内存寻址-xlanchen@2007918.ppt
《内存寻址-xlanchen@2007918.ppt》由会员分享,可在线阅读,更多相关《内存寻址-xlanchen@2007918.ppt(56页珍藏版)》请在三一文库上搜索。
1、Linux操作系统分析,中国科学技术大学计算机系 陈香兰(051287161316) Spring 2011,2019/7/23,Linux OS Analysis,2/54,上次课内容回顾,源代码简介 启动代码简介 Linux内核代码组成分析 Linux的启动层次 Linux的启动分析,内存寻址,2019/7/23,Linux OS Analysis,4/54,内容提要,X86微处理器的存储器寻址 Linux在X86上的寻址实现,2019/7/23,Linux OS Analysis,5/54,存储器地址,在intelx86处理器下,有三种不同的地址 逻辑地址:每个逻辑地址由一个段(segm
2、ent)和偏移量(offset)组成 线性地址:32位无符号整数,可表示4G大小的地址空间 物理地址:芯片级内存单元寻址。它们与从CPU的地址引脚发送到内存总线上的电信号相对应 地址转换过程,物理地址,线性地址,分段单元,分页单元,逻辑地址,2019/7/23,Linux OS Analysis,6/54,为什么需要内存寻址机制?,保护内核不受恶意或者无意的破坏 隔离各个用户进程 方便程序的编写,使程序员可以抛开对物理内存的考虑,而且理论上可以使用任意大小的空间,2019/7/23,Linux OS Analysis,7/54,硬件的分段单元(1) 段寄存器(segment register)
3、,I386体系结构采用分段机制 逻辑地址=段:段内偏移 使用16位段寄存器来指明当前所使用的段 有六个:cs, ss, ds, es, fs和gs CPU规定了3个寄存器的专门的用途 cs 代码段寄存器,指向存放程序指令的段 ss 堆栈段寄存器,指向存放当前堆栈的段 ds 数据段寄存器,指向存放数据的段,2019/7/23,Linux OS Analysis,8/54,从80386开始,Intel微处理器以两种不同的方式执行地址转换,实模式(20位) 16位段寄存器只记录段基址的高16位,因此段基址必须4位对齐(末4位为0) 不采用虚拟地址空间,直接采用物理地址空间 物理地址=段寄存器值*16
4、+段内偏移 保护模式(32位) 16位段寄存器无法直接记录段的信息,因此需要与全局描述符表GDT配合使用 GDT中记录了每个段的信息(段描述符),段寄存器只需记录段在GDT中的序号,2019/7/23,Linux OS Analysis,9/54,注意:cs寄存器还有一个很重要的功能:它含有一个两位的域,用以指明CPU的当前特权级CPL (current privilege level),值为0代表最高优先级,值为3代表最低优先级 线性地址=段基地址+段内偏移 其中,段基地址是根据段寄存器所指明的GDT中的段描述符中的信息得到的 物理地址:根据页表对线性地址进行转换而得到,2019/7/23,
5、Linux OS Analysis,10/54,GDT和段描述符 (segment descriptor),每个段由一个段描述符来表示,一个段描述符长度为8个字节 全局描述符表GDT (global description table)就用来存放段描述符 GDT表也存放在RAM中,并使用一个专门的寄存器GDTR来指示GDT表在RAM中的位置(物理起始地址) 局部描述符表LDT(Local Description Table) 根据x86,每个进程可以设置一个LDT LDT表也存放在RAM中,使用LDTR来指示当前的LDT表,2019/7/23,Linux OS Analysis,11/54,由
6、于段的用途不一样,Intelx86提供下列几种段描述符,数据段描述符(Data Segment Descriptor) 可以描述各种用户数据段和堆栈段 代码段描述符(Code Segment Descriptor) 描述一个用户代码段 任务状态段描述符(Task State Segment Descriptor) 描述一个任务的状态段 局部描述符表描述符 描述一个LDT段 系统段描述符(System Segment Descriptor),2019/7/23,Linux OS Analysis,12/54,段描述符主要描述如下内容,段的物理起始地址(base字段,32位) 段长度(limit字
7、段,20位) 段长度的单位(粒度,G标志,1位) 0:字节为单位 1:4KB为单位 是否系统段(S标志,1位) 0:系统段 1:普通的段,2019/7/23,Linux OS Analysis,13/54,类型字段(Type字段,4位) 例如代码段、数据段、任务状态段、局部描述符段等等 段的特权级描述字段(DPL字段,2位) 00b:只能被CPL=00b的内核代码段访问 11b:可以被任意代码段访问 段存在标志(1位) 0:该段当前不在内存中 1:该段当前在内存中 ,Descriptor Privilege Level,2019/7/23,Linux OS Analysis,14/54,段描述
8、符的格式,段基址、 段长度、 其他属性,例如,0x00cf9a000000ffff,2019/7/23,Linux OS Analysis,15/54,段选择子(Segment Selector),16位段寄存器与GDT或LDT配合起来对相应的段进行寻址 段寄存器中的值称为段选择子,16位 13位的索引,指定GDT表中的相应的段描述符 1位的TI(Table Indicator) (跟LDT表有关,Linux中基本未使用) 2位RPL(request privilege level) 当相应的段选择符装入到cs寄存器中时,表明了CPU的当前特权级(用户/内核),2019/7/23,Linux
9、OS Analysis,16/54,段选择子的使用和段描述符的快速访问,段寄存器,段选择子,段描述符,描述符表,段,( ),非编程寄存器,段描述符,2019/7/23,Linux OS Analysis,17/54,逻辑地址到线性地址的转换,GDT或LDT,GDTR或LDTR,选择子,偏移,线性地址,逻 辑 地 址,2019/7/23,Linux OS Analysis,18/54,Linux中的段,基于下面两个原因,linux中只使用了几个段 段和页的同时存在在一定程度上有点多余。 因为两者都可以划分进程的物理空间 所有的进程希望使用同样的0-4G的逻辑空间。 这样程序员不必考虑进程地址的问
10、题,也让内核的内存管理变得简单一些,2019/7/23,Linux OS Analysis,19/54,Linux下的全局描述符表(部分),在arch/x86/kernel/head_32.S中,内核数据段,用户代码段,用户数据段,Linux中的GDT,在include/asm-x86/segment.h中,2019/7/23,Linux OS Analysis,20/54,在arch/x86/boot/pm.c中,在arch/x86/boot/pm.c中,2019/7/23,arch/x86/kernel/cpu/common.c,2019/7/23,2019/7/23,Linux OS A
11、nalysis,23/54,_BOOT_CS,0x10=0000 0000 0001 0000b 内核代码段,在GDT中相应的段描述符各个域有如下值,Index=2,RPL=0,特权级,4GB,内核代码段,内核数据段,用户代码段,用户数据段,0x00cf9a000000ffff,2019/7/23,Linux OS Analysis,24/54,_BOOT_DS,0x18=0000 0000 0001 1000b 内核数据段,在GDT中相应的段描述符各个域有如下值,Index=3,RPL=0,特权级,内核代码段,内核数据段,用户代码段,用户数据段,4GB,0x00cf92000000ffff,
12、2019/7/23,Linux OS Analysis,25/54,Linux下GDT表的初始化,1)在i386/boot/herder.Si386/boot/main.c: main() arch/x86/boot/pm.c:go_to_protected_modesetup_gdt中 GDT表中的内容 GDT表基址的装载(此时还没有切换到保护模式) 切换到保护模式之后,(代码)段寄存器的装载 2)在i386/boot/compressed/head_32.S中 各个数据段寄存器的装载 3)在i386/kernel/head_32.S中 boot_gdt和GDT基址的装载 各段寄存器的重新装
13、载 early_gdt_descr和per_cpu_gdt_page,参见arch/x86/kernel/cpu/common.c,2019/7/23,Linux OS Analysis,26/54,硬件的分页单元,分页单元:线性地址=物理地址 为了效率起见,线性地址被分成以固定长度为单位的组,称为页。 页内连续的线性地址被映射到连续的物理地址中。 把线性地址映射到物理地址的数据结构叫做页表(page table)。 页表存放在内存中,并在启用分页单元以前由内核对之进行初始化 Intel处理器中,通过设置CR0寄存器的一个标志位来启用分页单元。,2019/7/23,Linux OS Analy
14、sis,27/54,硬件的分页单元,区分一下页和页框的概念 一页指一系列的线性地址和包含于其中的数据 页框(page frame) 分页单元认为所有的RAM被分成了固定长度的页框 每个页框可以包含一页,也就是说一个页框的长度和一个页的长度是一样的 页框是内存的一部分,是一个实际的存储区域。 页只是一组数据块,可以存放在任何页框中,2019/7/23,Linux OS Analysis,28/54,常规分页,从i386起,intel处理器的分页单元处理4KB的页 32位的线性地址被分成3个域 目录(directory) 最高的10位 页表(Table) 中间的10位 偏移量(offset) 最低
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内存 寻址 xlanchen 2007918
链接地址:https://www.31doc.com/p-3189409.html