内核地址空间
逻辑地址->线性地址->物理地址
8086
物理地址 = 段地址左移4位 + 段内偏移量
这种方式的寻址最大地址为0xFFFF; 0xFFFF = 0x10FFEF, 这段内存大于1M空间,该如何寻址,8086的做法就是自动从物理内存0地址寻址,按0xFFFF取模寻址。
80386:
80386cpu当需要访问内存时,首先给出的逻辑地址,然后通过MMU内存单元分段机制,转换为线性地址, 然后再通过MMU管理单元分页机制转换为物理地址。
当处理器需要访问内存时,给出的逻辑地址是:选择符+偏移量,然后通过MMU的分段机制,即可获取这个段的描述符,然后存入描述符寄存器,取出段基地址 + 偏移量,即可获得这个逻辑地址对应的线性地址。
线性地址 = 目录项(dir)+ 页表项(page)+ 页面偏移(offset)
一个线性地址由10位目录表+10位页表+12位偏移量组成,当给定一个线性地址时,
- 首先从控制寄存器CR3获取页目录基地址,然后加上线性地址的前10位页目录偏移量即可得到页表的基地址;
- 接着页表基地址+线性地址第二个10位的页表偏移,即可得到内存页的首地址;
- 最后内存页的首地址+线性地址的最后12位偏移量,即可得到最后的物理地址;
以32位的操作系统为例,内核地址空间占1G, 用户地址空间占3G。内核代码访问或线程访问内存时,访问的都是逻辑地址。从逻辑地址映射到物理地址,则是页表负责的事。内核逻辑地址空间访问为0xc0000000-0xffffffff,这一限制导致只能访问前1g的物理内存。
简单的映射是行不通的。
段选择符->全局段描述符->段基址-》线性地址-》多级页表-》物理地址