当前位置: 首页 > Linux kernrl, 内存管理 > 正文

内存管理器(十八)kernel 内存管理—浅析内存寻址

前言

内存管理序列还在持续更新,slab 后边在说,这里说点内核内存寻址的基础知识。这里我不打算说一些具体的标志位,寄存器什么的。一位很厉害的学长曾说过“掉进硬件的漩涡时很可怕的”,为了不让想了解的读者掉进这“可怕的硬件漩涡”我决定还是不要说硬件了。

分段

最早的处理器比如inter 早期处理器,8086 按照分段模式工作的,就是使用“段基地址 + 偏移量”这种方式将一个虚拟地址转化为一个线性地址。当然这还是第一次提出“段”的概念。

因为段的使用,程序不在需要硬编码,并且可以支持更大的内存寻址,程序员开始获得了更大的自由。

保护模式-24位及32位寻址

后来inter 推出了80286 处理器,它的地址总线增加到了24位,可以访问16M的地址空间。更重要的是从此开始引进了一个全新的概念“保护模式”。

保护模式:

保护模式与实模式相对应。在80286以前,CPU只有实时模式,地址总线有20位,而内存地址是16位,也就是最多能够访问2^20=1M的内存空间。在80286及以后,内存地址改为16位或32位,至少可以访问到2^32=4G的内存空间。但为了保证后续的CPU能够运行旧的CPU,只能保持向下兼容。因此,80286及以后的CPU首先进入实模式,然后通过切换机制再进入到保护模式。

再后来出现了80386  这是一块32位寻址的处理器,再保护模式下完全可以做到寻址4G空间,大大提高了程序员发挥的空间。

但是这些处理器的本质并没有发生变化,所以统称为IA32.

 

IA32寄存器

这个版本的寄存器新增加了8个通用寄存器。

EAX 一般用作累加器

EBX 一般用作基址寄存器(Base)

ECX 一般用来计数(Count)

EDX 一般用来存放数据(Data)

EBP 一般用作堆栈指针(Stack Pointer)

EBP 一般用作基址指针(Base Pointer)

ESI 一般用作源变址(Source Index)

EDI 一般用作目标变址(Destinatin Index)

状态寄存器

EIP 状态寄存器  存储的是下一条将要执行指令的偏移量

控制寄存器

CR0:指定一些信息,如分页允许,任务转换,处理器扩展什么的

CR1:未定义的控制寄存器,供将来的处理器使用

CR2:页故障线性寄存器,保存最后一次出故障的全32位线性地址

CR3:页目录基址寄存器,保存页目录表的物理地址,后12位为0

 

系统地址寄存器

IA32 有4个系统地址寄存器,它保护操作系统要保护的信息和地址转换表信息。

这4个专用寄存器用于再保护模式下所需要的表和段。

全局描述符表寄存器 GDTR(Global Descriptor Table Register ),是 48 位寄存 器,用来保存全局描述符表(GDT)的 32 位基地址和 16 为 GDT 的界限。 ·

中断描述符表寄存器 IDTR(Interrupt Descriptor Table Register),是 48 位寄存 器,用来保存中断描述符表(IDT)的 32 位基地址和 16 为 IDT 的界限。

局部描述符表寄存器 LDTR(Global Descriptor Table Register ),是 16 位寄存器, 保存局部描述符表 LDT 段的选择符。

任务状态寄存器 TR(Task State Register)是 16 位寄存器,用于保存任务状态段 TSS 段的 16 位选择符。 用以上 4 个寄存器给目前正在执行的任务(或进程)定义任务环境、地址空间和中断 向量空间。

调试寄存器和测试寄存器

IA32 为调试提供了硬件支撑。在 IA32 芯片内有 8 个 32 位的调试寄存器 DR0~DR7。

这些寄存器可以使系统程序设计人员定义 4 个断点,用它们可以规定指令执行和数 据读写的任何组合。DR0~DR3 是线性断点地址寄存器,其中保存着 4 个断点地址。DR5、DR6 是两个备用的调试寄存器,目前尚未定义。DR6 是断点状态寄存器,其低序位是指示符位, 当允许故障调试并检查出故障而进入异常调试处理程序(debug())时,由硬件把指示符 位置 1,调试异常处理程序在退出之前必须把这几位清 0。DR7 是断点控制寄存器,它的高 序半个字又被分为 4 个字段,用来规定断点字段的长度是 1 个字节、2 个字节、4 个字节及 规定将引起断点的访问类型。低序半个字的位字段用于“允许”断点和“允许”所选择的 调试条件。

2. 测试寄存器

IA32 有两个 32 位的测试寄存器 TR6 和 TR7。这两个寄存器用于在转换旁视缓冲器 ( Translation Lookaside Buffer ) 中 测 试 随 机 存 储 器 ( RAM ) 和 相 联 存 储 器 (CAM )。TR6 是测试命令寄存器,其内存放测试控制命令。TR7 是数据寄存器,其内保存 转换旁路缓冲器测试的数据。

IA32内存寻址机制

简单来说就是CPU将虚拟地址送到MMU ,MMU 把物理地址送给存储器。

2015-12-17 22:10:49 的屏幕截图

 

当我们使用理解寻址机制的时候,我们必须区分以下三种不同的寻址方式。

逻辑地址:

机器语言指令仍用这种地址指定一个操作数的地址或一条指令的地址。这种寻址方式 在Intel的分段结构中表现得尤为具体,它使得MS-DOS或Windows程序员把程序分为 若干段。每个逻辑地址都由一个段和偏移量组成。

线性地址:

线性地址是一个32位的无符号整数,可以表达高达2 32(4GB)的地址。通常用16进制 表示线性地址,其取值范围为0x00000000~0xffffffff。

物理地址:

也就是内存单元的实际地址,用于芯片级内存单元寻址。物理地址也由32位无符号整 数表示。

 

然后转换关系时这样的:

2015-12-17 22:13:17 的屏幕截图

这就是基本情况了。

本文固定链接: http://zmrlinux.com/2015/12/17/%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86%e5%99%a8%ef%bc%88%e5%8d%81%e5%85%ab%ef%bc%89kernel-%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86-%e6%b5%85%e6%9e%90%e5%86%85%e5%ad%98%e5%af%bb%e5%9d%80/ | Kernel & Me

该日志由 root 于2015年12月17日发表在 Linux kernrl, 内存管理 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 内存管理器(十八)kernel 内存管理—浅析内存寻址 | Kernel & Me