学习linux内核-- 内存,看一篇就够了(多图)

内存模块

学习linux内核-- 内存,看一篇就够了(多图)_第1张图片

1 linux内存总体布局:内存分成用户态和内核态

4G进程地址空间解析

学习linux内核-- 内存,看一篇就够了(多图)_第2张图片

内核地址空间

学习linux内核-- 内存,看一篇就够了(多图)_第3张图片

进程地址空间
 

学习linux内核-- 内存,看一篇就够了(多图)_第4张图片

2 地址转换和页表

2.1 地址转换

虚拟内存是指程序使用的逻辑地址。每个进程4G。所有进程共享物理内存4G,所以逻辑地址和物理地址不是一一对应,需要地址转换.

学习linux内核-- 内存,看一篇就够了(多图)_第5张图片

页表由3部分组成:页目录,页面,页内偏移
32bit只有3级 0 -11位:页内偏移OFFSET 12-21位:页面表偏移PT(PTE 页表项.指向一张具体的物理内存页) 22-31位:页面目录偏移PGD
寻址过程如下:
1)操作系统从寄存器CR3获得当前页面目录指针(基地址);
2)基地址+页面目录偏移->页面表指针(基地址);
3)页面表指针+页面表偏移->内存页基址;
4)内存页基址+页内偏移->具体物理内存单元。
页号=逻辑地址/页面大小;页面偏移量=逻辑地址%页面大小 。
页目录保存页表项的地址,页表项保存物理地址,最后1项保存4k页内偏移。
进程页表长这样子:

学习linux内核-- 内存,看一篇就够了(多图)_第6张图片

举例说明地址映射:比如要访问线性地址0xBFC0 4FFE(1byte),2进制形式

1).mmu先取线性地址高10位(31-22)=767,x4=3068=0xBFC,+cr3=0x3800 0bfc,即页目录项在内存的地址,此地址的内容0x392f f000即页表首地址(页对齐最后12位清0)
2).mmu取线性地址下面10位数(21-12)=4,x4=16=0x10,+0x392f f000=0x392f f010,即页表项在内存的地址,此地址的内容0x3080 4000即物理页面的首地址(页对齐最后12位清0)
3).mmu取线性地址最后12位数(11-0)=4094=0xffe作为低12位,0x3080 4000的前20位作为高20位,组成一个新的32位数0x3080 4ffe即线性地址0xBFC0 4FFE对应的物理地址

2.2 内核页表和进程页表的区别和联系

你可能感兴趣的:(c语言,c++,qt,c#,编辑器)