内存寻址 嵌入式系统实验室 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FOR ADVANCED STUDY OF USTC
内存寻址
内容提要 X86微处理器的存储器寻址 Linux在X86上的寻址实现 大 4 1958 嵌入式系统实验室 2023/7/14 Linux OS Analysis 4/54 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FON ADVANCED STUDY OF USTC
2023/7/14 Linux OS Analysis 4/54 内容提要 ❖X86微处理器的存储器寻址 ❖Linux在X86上的寻址实现
存储器地址 冬在intelx86处理器下,有三种不同的地址 >逻辑地址:每个逻辑地址由一个段(segment)和偏移量 (offset)组成 >线性地址: 32位无符号整数,可表示4G大小的地址空 间 >物理地址: 芯片级内存单元寻址。它们与从CPU的地 址引脚发送到内存总线上的电信号相对应 冬地址转换过程 逻辑地址 分段单元 线性地址 分页单元 物理地址 嵌入式系统实验室 2023/7/14 Linux OS Analysis 5/54 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FON ADVANCED STUDY OF USTC
2023/7/14 Linux OS Analysis 5/54 存储器地址 ❖在intelx86处理器下,有三种不同的地址 ➢逻辑地址:每个逻辑地址由一个段(segment)和偏移量 (offset)组成 ➢线性地址:32位无符号整数,可表示4G大小的地址空 间 ➢物理地址:芯片级内存单元寻址。它们与从CPU的地 址引脚发送到内存总线上的电信号相对应 ❖地址转换过程 逻辑地址 分段单元 线性地址 分页单元 物理地址
为什么需要内存寻址机制? 冬保护内核不受恶意或者无意的破坏 必隔离各个用户进程 冬方便程序的编写,使程序员可以抛开对物理内存 的考虑,而且理论上可以使用任意大小的空间 1958 嵌入式系统实验室 2023/7/14 Linux OS Analysis 6/54 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FON ADVANCED STUDY OF USTC
2023/7/14 Linux OS Analysis 6/54 为什么需要内存寻址机制? ❖保护内核不受恶意或者无意的破坏 ❖隔离各个用户进程 ❖方便程序的编写,使程序员可以抛开对物理内存 的考虑,而且理论上可以使用任意大小的空间
硬件的分段单元(1) 段寄存器(segment register) 冬386体系结构采用分段机制 >逻辑地址=段:段内偏移 使用16位段寄存器来指明当前所使用的段 >有六个:cs,Ss,ds,es,fs和gs CPU规定了3个寄存器的专门的用途 ●cs 代码段寄存器,指向存放程序指令的段 ●Ss堆栈段寄存器,指向存放当前堆栈的段 ●ds 数据段寄存器,指向存放数据的段 oI science and Technoie 嵌入式系统实验室 2023/7/14 Linux OS Analysis 7154 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FON ADVANCED STUDY OF USTC
2023/7/14 Linux OS Analysis 7/54 硬件的分段单元(1) 段寄存器(segment register) ❖I386体系结构采用分段机制 ➢逻辑地址=段:段内偏移 ❖使用16位段寄存器来指明当前所使用的段 ➢有六个:cs, ss, ds, es, fs和gs CPU规定了3个寄存器的专门的用途 ⚫cs 代码段寄存器,指向存放程序指令的段 ⚫ss堆栈段寄存器,指向存放当前堆栈的段 ⚫ds 数据段寄存器,指向存放数据的段
从80386开始,Intel微处理器以两种不同的方 式执行地址转换 冬实模式(20位 > 16位段寄存器只记录段基址的高16位,因此段基址必 须4位对齐(末4位为0) >不采用虚拟地址空间,直接采用物理地址空间 >物理地址=段寄存器值*16+段内偏移 保护模式(32位)958 >16位段寄存器无法直接记录段的信息,因此需要与全 局描述符表GDT配合使用 >GDT中记录了每个段的信息(段描述符),段寄存器 只需记录段在GDT中的序号 Cience and TTech人 嵌入式系统实验室 2023/7/14 Linux OS Analysis 8154 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FON ADVANCED STUDY OF USTC
2023/7/14 Linux OS Analysis 8/54 从80386开始,Intel微处理器以两种不同的方 式执行地址转换 ❖实模式(20位) ➢16位段寄存器只记录段基址的高16位,因此段基址必 须4位对齐(末4位为0) ➢ 不采用虚拟地址空间,直接采用物理地址空间 ➢ 物理地址=段寄存器值*16+段内偏移 ❖保护模式(32位) ➢16位段寄存器无法直接记录段的信息,因此需要与全 局描述符表GDT配合使用 ➢GDT中记录了每个段的信息(段描述符),段寄存器 只需记录段在GDT中的序号
>注意:cs寄存器还有一个很重要的功能:它含有一个两 位的域,用以指明CPU的当前特权级CPL(current privilege level)),值为0代表最高优先级,值为3代表最 低优先级 >线性地址=段基地址+段内偏移 ●其中,段基地址是根据段寄存器所指明的GDT中的段描述符 中的信息得到的 >物理地址:根据页表对线性地址进行转换而得到 oor Science and Technolod 嵌入式系统实验室 2023/7/14 Linux OS Analysis 9/54 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FON ADVANCED STUDY OF USTC
2023/7/14 Linux OS Analysis 9/54 ➢注意:cs寄存器还有一个很重要的功能:它含有一个两 位的域,用以指明CPU的当前特权级CPL (current privilege level),值为0代表最高优先级,值为3代表最 低优先级 ➢线性地址=段基地址+段内偏移 ⚫其中,段基地址是根据段寄存器所指明的GDT中的段描述符 中的信息得到的 ➢物理地址:根据页表对线性地址进行转换而得到
GDT和段描述符(segment descriptor) 每个段由一个段描述符来表示,一个段描述符长度为8个 字节 冬全局描述符表GDT(global description table)就用来存放段 描述符 GDT表也存放在RAM中,并使用一个专门的寄存器GDTR来指示 GDT表在RAM中的位置(物理起始地址) 局部描述符表LDT(Local Description Table) >根据x86,每个进程可以设置一个LDT >LDT表也存放在RAM中,使用LDTR来指示当前的LDT表 cience and Techi 嵌入式系统实验室 2023/7/14 Linux OS Analysis 10/54 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FON ADVANCED STUDY OF USTC
2023/7/14 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表
由于段的用途不一样,Intelx86提供下列几种 段描述符 数据段描述符(Data Segment Descriptor) >可以描述各种用户数据段和堆栈段 代码段描述符(Code Segment Descriptor >描述一个用户代码段 任务状态段描述符(Task State Segment Descriptor) >描述一个任务的状态段 局部描述符表描述符 >描述一个LDT段 系统段描述符(System Segment Descriptor) Cience and TTechil 嵌入式系统实验室 2023/7/14 Linux OS Analysis 11154 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FON ADVANCED STUDY OF USTC
2023/7/14 Linux OS Analysis 11/54 由于段的用途不一样,Intelx86提供下列几种 段描述符 ❖ 数据段描述符(Data Segment Descriptor) ➢ 可以描述各种用户数据段和堆栈段 ❖ 代码段描述符(Code Segment Descriptor) ➢ 描述一个用户代码段 ❖ 任务状态段描述符(Task State Segment Descriptor) ➢ 描述一个任务的状态段 ❖ 局部描述符表描述符 ➢ 描述一个LDT段 ❖ 系统段描述符(System Segment Descriptor)
段描述符主要描述如下内容 段的物理起始地址(base字段,32位) 段长度(limit字段,20位) 段长度的单位(粒度,G标志,1位) >0:字节为单位 >1:4KB为单位1958 Science and Technoloocn 是否系统段(S标志,1位) >0:系统段 >1:普通的段 嵌入式系统实验室 2023/7/14 Linux OS Analysis 12/54 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FON ADVANCED STUDY OF USTC
2023/7/14 Linux OS Analysis 12/54 段描述符主要描述如下内容 ❖段的物理起始地址(base字段,32位) ❖段长度(limit字段,20位) ❖段长度的单位(粒度,G标志,1位) ➢0:字节为单位 ➢1:4KB为单位 ❖是否系统段(S标志,1位) ➢0:系统段 ➢1:普通的段