当前位置: 技术问答>linux和unix
最近在学习赵炯的写的0.11内核,有点疑问请大大们,帮忙看看,感激不尽~
来源: 互联网 发布时间:2017-04-17
本文导语: 最近在学习赵炯的写的0.11内核,有点疑问请大大们,帮忙看看,感激不尽~ 《linux内核完全注释v3.0》书上说: 1.不启用分页的话,线性地址则就是物理地址; 2.linux相当于没有使用分段功能,代码段和数据段都映射到...
最近在学习赵炯的写的0.11内核,有点疑问请大大们,帮忙看看,感激不尽~
《linux内核完全注释v3.0》书上说:
1.不启用分页的话,线性地址则就是物理地址;
2.linux相当于没有使用分段功能,代码段和数据段都映射到同一个线性地址空间(参见5.3节图5-14)
这里有疑惑:
1. 程序中的代码段中数据的地址 和 数据段的数据的地址 都是从0分配地址的吗?
2. 分配的地址应该是段内偏移地址吧?
3. 问题1.如果是从0分配地址的话,他们映射到线性地址空间(段基址*N+偏移地址),岂不是重叠了?这样数据岂不被覆盖了?
《linux内核完全注释v3.0》书上说:
1.不启用分页的话,线性地址则就是物理地址;
2.linux相当于没有使用分段功能,代码段和数据段都映射到同一个线性地址空间(参见5.3节图5-14)
这里有疑惑:
1. 程序中的代码段中数据的地址 和 数据段的数据的地址 都是从0分配地址的吗?
2. 分配的地址应该是段内偏移地址吧?
3. 问题1.如果是从0分配地址的话,他们映射到线性地址空间(段基址*N+偏移地址),岂不是重叠了?这样数据岂不被覆盖了?
|
据我理解,不是从0分配的。
比如你定义的代码段,数据段,这些在PE或者ELF格式文件中有相应的位置。所有的这些段,包括你自定义的,都是从0开始依次排开的。段的大小,要看你代码中怎么写。
没有启用分页的话,线性地址就是物理地址,也就是说PE或者ELF中的地址就是实际内存条上的地址,这样的话,每次只能运行一个程序。
比如你定义的代码段,数据段,这些在PE或者ELF格式文件中有相应的位置。所有的这些段,包括你自定义的,都是从0开始依次排开的。段的大小,要看你代码中怎么写。
没有启用分页的话,线性地址就是物理地址,也就是说PE或者ELF中的地址就是实际内存条上的地址,这样的话,每次只能运行一个程序。
|
1. 程序中的代码段中数据的地址 和 数据段的数据的地址 都是从0分配地址的吗?
=> 不是的,0.11中,每个程序拥有自己的独立线性空间,大小为64M,4G的线性空间被分成了4*1024M/64M = 64,也就是说有64个段,每个段代表了一个程序线性空间。你说的代码段和数据段都被包含在了这个段中。
2. 分配的地址应该是段内偏移地址吧?
=> 是的,程序中函数或变量的地址都是相对于程序段线性空间里面的偏移地址。
3. 问题1.如果是从0分配地址的话,他们映射到线性地址空间(段基址*N+偏移地址),岂不是重叠了?这样数据岂不被覆盖了?
=> 同上。
=> 不是的,0.11中,每个程序拥有自己的独立线性空间,大小为64M,4G的线性空间被分成了4*1024M/64M = 64,也就是说有64个段,每个段代表了一个程序线性空间。你说的代码段和数据段都被包含在了这个段中。
2. 分配的地址应该是段内偏移地址吧?
=> 是的,程序中函数或变量的地址都是相对于程序段线性空间里面的偏移地址。
3. 问题1.如果是从0分配地址的话,他们映射到线性地址空间(段基址*N+偏移地址),岂不是重叠了?这样数据岂不被覆盖了?
=> 同上。
|
楼主,我也在看这边书。。。同样的疑问!!!