linux内核—逻辑地址/线性地址/物理地址 转换

概念

1.逻辑地址

包含在机器语言指令中用来指定一个操作数或一条指令的地址。每个逻辑地址都由一个段和偏移量组成,偏移量指明了从段开始的地方到实际地址之间的距离

2.线性地址

即虚拟地址,是一个32位无符号整数,用来表示4G的地址

3.物理地址

实际内存芯片上的地址

在linux中,由于所有的段都是从0x00000000开始,所以逻辑地址和线性地址是相同的,也就是在linux中忽略逻辑地址这个概念即可

线性地址转换物理地址

linux使用三级页表转换,与二级页表转换原理相似,以下按二级页表说明
32位线性地址分为三个部分,Directory(目录)/ Table(页表)/ Offset(偏移),如下
linux内核—逻辑地址/线性地址/物理地址 转换_第1张图片
每个进程都有一个分配给它的页目录,当前活动进程的页目录的物理地址存放在控制寄存器CR3中,线性地址内的Directory字段决定页目录中的目录项,而目录项指向适当的页表,table字段又决定了具体的页表中的表项,而表项中含有页所在页框的物理地址,offset字段据定页框内的相对位置。

不同进程中相同的线性地址内存储的数据为啥不同

举例,定义一个变量,然后fork一个子进程,此时,父子进程中可以打印出来这个变量的线性地址是相同,变量值也是相同的;然后子进程修改变量值,这时再看父子进程中这个变量的线性地址还是相同的,但是变量值是不同的。
线性地址相同也就是Directory/Table/Offset字段是相同的,那么上图中的页的位置也是相同的,那是什么原因导致两个进程内的相同页表项位置内存储的物理地址不同呢
关键在于“每个进程都有一个分配给它的页目录”,当进程切换时,CR3寄存器就会切换到当前新运行进程的页目录基地址,这样虽然线性地址相同,但是由于页目录基地址不同,所以两个进程都是各自使用的页表,而不是同一个页表
https://www.bilibili.com/read/cv8129309/

缺页异常

页表项中包含Present标志,如果值为1,所指的页或页表就在主存中;如果为0,则这一页就不在主存中,执行一个地址转换所需的页表项或页目录项中present标志为0,那么分页单元就把该线性地址存放在控制寄存器cr2中,并产生缺页异常

你可能感兴趣的:(#,内核,linux)