因此,我知道Linux对x86处理器使用四个默认段(内核代码,内核数据,用户代码,用户数据),但它们都具有相同的基数和限制(0x00000000和0xfffff),这意味着每个段映射到相同的一组线性地址.
鉴于此,为什么甚至有用户/内核段?我理解为什么代码和数据应该有单独的段(仅仅是由于x86处理器如何处理cs和ds寄存器),但为什么没有单个代码段和单个数据段呢?内存保护通过分页完成,用户和内核段无论如何都映射到相同的线性地址.
朋友们,
我看过Ingo Molnar的这篇文章,他是着名的Linux内核爱好者,他谈到4GB/4GB分割.
在这篇文章中,他说
使用4G/4G补丁,内核可以在4G/4G模式下编译,在这种情况下,内核有一个完整的独立4GB虚拟机,并且有用于用户空间的单独的完整(和每个进程)4GB虚拟机.
我的问题从这里开始:
我的假设是,在像Linux一样的单片内核中,进程的内核和用户部分共享相同的PROCESS ADDRESS SPACE.因此,与Linux内核,它不具有这种4G/4G补丁,我们有3/1拆分分别为用户虚拟空间和内核虚拟空间.
事实上,内核的1GB虚拟空间映射在每个进程的虚拟地址空间中.简单来说,PROCESS ADDRESS SPACE是4GB,其中1GB分配给内核.这是真的吗?
通过问题中的文章 - 如果我的假设如1)是正确的 - 他是否意味着内核地址空间不再映射到PROCESS ADDRESS SPACE并且我们有一个不同的内核虚拟地址空间并且没有共享地址空间?
那就是PROCESS ADDRESS SPACE是4GB而KERNEL ADDRESS SPACE是另一个4GB; 而不是PROCESS ADDRESS SPACE扩大到8GB,其中4GB是内核共享的.
我知道我听起来有点愚蠢:)