+ -
当前位置:首页 → 问答吧 → 关于linux的分段和分页机制的困惑

关于linux的分段和分页机制的困惑

时间:2010-10-11

来源:互联网

最近在看《深入理解linux内核 第三版》,对分段和分页机制一直存在一些疑问。
1。关于分段。linux的段逻辑地址为48位,其中16位段选择符,32位偏移量。为什么这些地址长度分别是48,16,32位呢?是由什么硬件结构决定的吗?另外,这些概念与我学过的操作系统原理书中说明的分段分页机制感觉不怎么一致。一般的操作系统书说,在段式内存管理中,进程的虚拟地址空间(32位系统是4GB)划分为几个段,32位的虚拟地址中,最高几位作为段选择符,剩下的作段内为偏移量。为什么80x86的分段机制与这不一样呢?按理说32位系统逻辑地址应该是32位,为什么80x86是48位呢?
2。关于分页。一般的操作系统书说进程的虚拟地址空间为4GB(32位系统),即它是由系统的地址线的条数决定的,32位系统是2^32,64位系统是2^64。按照《深入理解linux内核 第三版》中的说法,逻辑地址先转换为线性地址,线性地址再转换为物理地址。到底是逻辑地址空间2^48(64TB)是进程的虚拟地址空间,还是线性地址空间2^32(4GB)是进程的虚拟地址空间?按照进程的虚拟地址空间由系统的地址线的条数决定的,应该选后者。可是此时又有问题了,如果进程的虚拟地址空间由系统的地址线的条数决定,那么任何32位系统进程的虚拟地址空间都应该是4GB。但是我们知道80X86处理器有PAE(物理地址扩展机制),即把CPU地址线条数从32增加到36位,按照进程的虚拟地址空间由系统的地址线的条数决定,那么此时进程的虚拟地址空间为64GB。可是根据《深入理解linux内核 第三版》的说法,进程的线性地址空间并没有变,仍为4GB,假设进程的地址空间是线性地址空间,并且它是由系统的地址线的条数决定,那么此时线性地址空间不可能任然是4GB!!这到底是怎么回事呢?

作者: diandianlianyi   发布时间: 2010-10-11

16是段寄存器决定 32是段长决定 显然与段寻址硬件有关
为什么不一样?硬件实现不一样。谁做段选择符 段内多长, 硬件还是比较灵活

的,X86选择这样做而已。
虚拟地址空间为4GB 系统的地址线的条数决定的。----这个不太对,你书上说的他

的情形 。进程的虚拟地址应该等于虚拟地址位数 而且是对同一进程而言可变的那些



不能纠结于 进程的虚拟地址空间 从X86角度看没有这个概念 .LINUX下这个概念是弱化的段地址后的线形地址
因为实现为所有段内偏移=4G线性  所以可以进程的虚拟地址空间理解为4G线性地址
PAE扩的物理地址 虚拟地址还是4G

作者: smalloc   发布时间: 2010-10-11

回复 smalloc


    有那么点意思!呵呵!问一下这位大牛,应该怎么学习linux内核呢?

作者: diandianlianyi   发布时间: 2010-10-11

intel 的段管理只是为了兼容以前
我认为 逻辑地址+0的段偏移量就是线性地址

作者: raintung   发布时间: 2010-10-11

其中16位段选择符,32位偏移量。

这个是80x86的问题,由于实模式下段寄存器和通用寄存器都是16bit,到了保护模式下,虽然通用寄存器扩展到了32bit,但是为了兼容之前实模式,段寄存器依旧保持16位,但是内容由实模式下的段基地址变成了保护模式下的段选择子。

由于80x86的分段模式是无法关闭的,所以linux实际上是采用了一个0x0基址,粒度4K,段界限0xfffff,实际上就是从0x0~0xffffffff(4G)的一个大段,然后再使用分页机制。

这些内容其实光看操作系统是没法了解的,先把80x86的保护模式汇编看完才能继续看下去。。。

作者: adam   发布时间: 2010-11-21