mov eax, LinearAddrDemo
shr eax, 22
mov ebx, 4096
mul ebx
mov ecx, eax
mov eax, LinearAddrDemo
shr eax, 12
and eax, 03FFh ; 1111111111 (10 bits)
mov ebx, 4
mul ebx
add eax, ecx
add eax, PageTblBase1
mov dword [es:eax], ProcBar | PG_P | PG_USU | PG_RWW
代码来自于渊的书籍,自己动手写操作系统
今天看到了分页的转换,主要是把两个函数用切换页的方式来显示执行。
线型地址的高10位,10bits是3ff = 1023, 也就是1024个不同的编号。
从高10位找到了PDE, 假设PED位为第x个, 但是一个PDE对应1024个PTE,每个PTE有4个字节,所以相对于PTE基地址偏移了a1 = x*1024*4个字节。
从中间10位找到了表项的位置,也就是第几个表项,设为y,然后每个表项4个字节,他的偏移就是a2 = y*4个字节,所以相对于基地的偏移是PageTblBase+a1+a2
a1为页表相对于PageTblBase的偏移,a2为该指定页表里的表项的偏移地址。