Linux 0.11版内核内存问题

来源:百度知道 编辑:UC知道 时间:2024/05/31 14:01:44
我在阅读赵炯老师的Linux内核完全剖析 一书时,遇到一个令人费解的问题,希望大家帮助理解下下。。
书中说:由于在Linux0.11内核中,内核和各任务的代码段和数据段都分别被映射到线性地址空间中相同基址处,且段限长也一样,因此内核的代码区和数据区是重叠的,各任务的代码区和数据区分别也是重叠的。
书中还指出,进程的逻辑地址空间中的代码段和数据段的概念与CPU分段机制中的代码段和数据段不是同一个概念。
我知道进程在其逻辑地址空间中的代码段和数据段是由编译器决定的,操作系统在加载进程代码时按照该逻辑地址空间加载到实际的物理内存。。
另外,我们知道,线性地址空间和物理内存具有一一映射的关系。。
那么上述的CPU分段机制的代码段和数据段是一个什么概念呢??为什么他们就可以同样映射到相同的线性空间呢??如果映射到同一个线性空间在加入内存的时候岂不发生覆盖了??因为线性地址转化为物理地址是具有一一映射关系的啊。。

我上网上查了点资料不知道有用不
以win32程序为例。
程序执行时,操作系统将exe文件映射入内存。exe文件格式为头数据和各段数据组成。头数据说明了exe文件的属性和执行环境,段数据又分为数据段,代码段,资源段等,段的多少和位置由头数据说明。也就是说,不仅仅只是代码段和数据段。这些段由不同的编译环境和编译参数控制,由编译器自动生成exe的段和文件格式。当操作系统执行exe时,会动态建立堆栈段,它是动态的,并且属于操作系统执行环境。

也就是说,程序在内存的映射一个为exe文件映射,包括数据段、代码段等它是不变的。
另一个为堆栈段,它是随程序运行动态改变的。

其他操作系统会有他自己的执行方式,但大体如上。

http://www.17lamp.net/forum/lamp/20081028122208
http://blog.csdn.net/lijingze2003/archive/2005/04/09/340804.aspx

Linux0.11内核 好老了