程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

Linux学习笔记 逻辑、线性地址、物理地址、虚拟地址是个什么鬼

balukai 2025-05-03 12:09:41 文章精选 2 ℃

在很久很久以前,设计者认为20位的地址线已经足够用了,最大地址空间是0xFFFFF,不会超过16M的内存。

在分页机制下,1个页目录表最多有1024个页目录项(页表)1个页表最多包含1024个页表项(页)1页是4KB,因为有12位偏移地址

所以1个页目录表 + 4个页表就能表达 16M的地址空间。

4(页表数)* 1024(页表项数) * 4KB(一页大小)= 16MB

所以就先把页目录表放在内存的最前面,这样就把system那部分代码覆盖了。

_pg_dir:
_startup_32:
    mov eax,0x10
    mov ds,ax
    ...

在后面放4个页表。

.org 0x1000 pg0:
.org 0x2000 pg1:
.org 0x3000 pg2:
.org 0x4000 pg3:
.org 0x5000

接着开启分页机制。

接着我们就要告诉CPU这些页表的位置了。

xor eax,eax
mov cr3,eax
setup_paging:
    ...
    mov eax,_pg_dir
    mov [eax],pg0+7
    mov [eax+4],pg1+7
    mov [eax+8],pg2+7
    mov [eax+12],pg3+7
    mov edi,pg3+4092
    mov eax,00fff007h
    std
L3: stosd
    sub eax, 1000h
    jpe L3
    ...

这段代码主要是映射内存的情况。 先是指向了4个页表。 比如 mov [eax],pg0+7
这里的pg0+7 因为页表地址为0x1000,页属性为0x07,所以最终地址是 0x00001007。

这里页属性是0x07 二进制表示是111

  • 该页存在(P=1)
  • 用户可读写(RW=1)
  • 特权为用户态(US=1)

后面的代码是填充4个页表里的 每一项。

地址转换

逻辑地址、线性地址、物理地址、虚拟地址。 线性地址空间、物理地址空间、虚拟地址空间。 傻傻分不清?

Intel体系的内存管理的两大部分是分段分页

  • 分段:目的是为了让每个程序有自己单独的 代码段(cs),数据段(ds),栈段(ss),起到隔离的作用。
  • 分页:目的是按需使用物理内存,同时可以在多任务时,起到隔离作用(怎么做到的?)。

各种地址及空间

  • 逻辑地址:我们程序员写代码时给出的地址叫逻辑地址,其中包含段选择子和偏移地址两部分。
  • 线性地址:通过分段机制,将逻辑地址转换后的地址,叫做线性地址。而这个线性地址是有个范围的,这个范围就叫做线性地址空间,32 位模式下,线性地址空间就是 4G。
  • 物理地址:就是真正在内存中的地址,它也是有范围的,叫做物理地址空间。那这个范围的大小,就取决于你的内存有多大了。
  • 虚拟地址:如果没有开启分页机制,那么线性地址就和物理地址是一一对应的,可以理解为两者相等。如果开启了分页机制,那么线性地址将被视为虚拟地址,这个虚拟地址将会通过分页机制的转换,最终转换成物理地址。

这么一说 还真是清楚了不少。

如果你觉得有点收获,欢迎点个关注, 也欢迎分享给你身边的朋友。


#头条创作挑战赛##程序员##头条创作挑战大赛#

最近发表
标签列表