内存管理之页

101012 分页

Wirte by 021. Leave a message if i messed up ! : )

汇编语言入门教程- 阮一峰的网络日志

线性地址

mov eax , dword ds:[0x00000124]

  • 其中0x00000124是有效地址
  • ds.base(段寄存器) + 0x0000124 是线性地址。

101012 地址拆分

  • **32位地址示例 0x00000124 **
1
2
3
4
5
6
7
8
9
10
11
0x00000124 =

将 32位 拆成 10 - 10 - 12 ;

0000 0000 00 , 10 ;

00 0000 0000 , 10 ;

0001 0010 0100 , 12 ;


CR3物理地址寄存器

  • CR3寄存器存储了物理地址
  • CR3指向了一个4KB页

    • 第一级分页(页目录表PDT)(4kb)(第一个10)

      • 存储的地址,

      • 第一级分页存储了1024个第二级分页的地址

    1
    2
    3
    4
    5
    6
    7
    8

    第一级分页数据结构:

    每个PDE地址数据宽度:4个字节;

    4096/4 = 1024;


    • 0地址不能读写是因为没有挂物理页,挂了之后可以读写
    • 第二级分页(页表PTT)(第二个10)

      • 数据为:PTE
      • 多个PTE可以指向同一个物理页
      • 一个PTE只能指向一个物理页,不能指向多个物理页
      • 一个可以不指向物理页
    • 第三级分页(物理页)(第三个12)

      • 一个物理页的大小是4kb=4096=2的12次方,也就是需要12个bit位才能表示4kb中所有的地址.

      • 指向物理页地址

物理地址

  • CPU 将线性地址转换的物理地址

截屏2021-11-26 下午3.30.04

  • R/W可读可写位

  • P数据有效位

  • U/S 权限位,0 - 特权用户,1 - 普通用户

  • **PS位对PDE有用,PageSize的意思,当ps=1的时候是大页,低22位直接指向物理页. **

  • A位,是否访问位

  • D位,duty, 是否被写过,0 - 没有写过,1 - 写过

页目录基址(0xc03000000)

  • PDT页目录表的基址

    Untitled 4

访问进程内存公式

  • 10-10-12 ; PDI(页目录项) : 10 , PTI(页表项) : 10 , 12 物理页
  • 访问页目录的公式
    • 0xc0300000 + PDI*4
  • 访问页表的公式
    • 0xc0000000 + PDI * 4096 + PTI * 4

2 - 9 - 9 - 12 分页(PAE 物理地址拓展分页)

  • 2 : PDPTE 页目录指针表(page directory point table entry)
    • 数据宽度2个bit, 最多拥有4个元素

未命名

  • **9 : PDE **

截屏2021-11-26 下午7.02.24

  • 9 : PTE
  • 12 : 物理页
  • 当x=1时,此数据为不可执行数据.

截屏2021-11-26 下午7.10.48

TLB