当前位置: 技术问答>linux和unix
关于linux内核地址分配问题
来源: 互联网 发布时间:2016-08-17
本文导语: 最近看关于linux内核方面的书,一直有个问题,就是linux内核加载到内存之后,它的各个详细部分是什么, 比如,开始的是内存页目录,页表,内核代码段,数据段,然后就是内存管理啊,文件系统啊,还...
最近看关于linux内核方面的书,一直有个问题,就是linux内核加载到内存之后,它的各个详细部分是什么,
比如,开始的是内存页目录,页表,内核代码段,数据段,然后就是内存管理啊,文件系统啊,还有一些基本数据结构 比如进程描述的,tss等。疑问就是这些部分详细的物理内存地址多少,谢谢。
比如,开始的是内存页目录,页表,内核代码段,数据段,然后就是内存管理啊,文件系统啊,还有一些基本数据结构 比如进程描述的,tss等。疑问就是这些部分详细的物理内存地址多少,谢谢。
|
你问的确实太广了 试着回答你最后的问题
首先 所有无力内存都是内核来调度的。假定你板子的内存物理地址是0x00000000(一般是),那么从这个头到最大内存地址(其实不是最大地址,有另外的限制,常见的板子可以这么认为),都是内核可以直接管的物理地址,内核本身处在内存从开头(或离开头某个偏移处),包括内核的代码,数据等等。
内核的虚地址固定位于0xC0000000开始,然后就有一个值定义从物理地址到虚拟地址的偏移,这个板子那就是0xC0000000,任何一个物理地址x的虚拟地址就是x+0xC0000000 = 0xC000000x.
如果物理地址不是从0开始比如某些TI板子,如内存物理地址是0x80000000,那这个偏移就是0xC0000000-0x80000000=0x40000000.
首先 所有无力内存都是内核来调度的。假定你板子的内存物理地址是0x00000000(一般是),那么从这个头到最大内存地址(其实不是最大地址,有另外的限制,常见的板子可以这么认为),都是内核可以直接管的物理地址,内核本身处在内存从开头(或离开头某个偏移处),包括内核的代码,数据等等。
内核的虚地址固定位于0xC0000000开始,然后就有一个值定义从物理地址到虚拟地址的偏移,这个板子那就是0xC0000000,任何一个物理地址x的虚拟地址就是x+0xC0000000 = 0xC000000x.
如果物理地址不是从0开始比如某些TI板子,如内存物理地址是0x80000000,那这个偏移就是0xC0000000-0x80000000=0x40000000.
|
你可以看system.map 这个编译内核的时候会产生的
各个函数的地址
各个segment的分布
都有
如果想了解很清楚 建议可以看下赵炯的 linux内核注释 系列(再版了很多次 名字都不一样)
讲的很全面 而且很细 不过是争取低版本的
各个函数的地址
各个segment的分布
都有
如果想了解很清楚 建议可以看下赵炯的 linux内核注释 系列(再版了很多次 名字都不一样)
讲的很全面 而且很细 不过是争取低版本的
|
00000000-0009f7ff : System RAM
0009f800-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
000ca000-000cafff : Adapter ROM
000f0000-000fffff : System ROM
00100000-0feeffff : System RAM
00100000-00375ab5 : Kernel code
00375ab6-004223ff : Kernel data
0fef0000-0fefefff : ACPI Tables
0feff000-0fefffff : ACPI Non-volatile Storage
0ff00000-0fffffff : System RAM
e8000000-e87fffff : 0000:00:0f.0
e8800000-e8800fff : 0000:00:11.0
e8801000-e880101f : 0000:00:10.0
e8900000-e8900fff : 0000:02:02.0
e8900000-e8900fff : ehci_hcd
f0000000-f7ffffff : 0000:00:0f.0
fec00000-fec0ffff : reserved
fee00000-fee00fff : reserved
fffe0000-ffffffff : reserved
System.map文件也描述了内核函数的逻辑地址。
|
工作量挺大的,搞懂了也就不要在中国呆了,呵呵。startup函数描述的内核启动过程就是这些空间分配建立的过程。以x86为例,内核加到0x1000000处,临时分配页目录在0x10001000和0x10002000。。。。。太多了,说不清了
|
觉得这个没什么大的意义
你要真想得到内核空间的虚拟地址的物理地址,一个__pa()宏就搞定了
你要真想得到内核空间的虚拟地址的物理地址,一个__pa()宏就搞定了
|
呵呵!其实这个问题主要在setup.s文件中建立起来的,setup.s文件主要是对内存初始化,初始化了段页式存储管理,建立起了页表和段表。GDT和IDT,这里面的东西好多的哦!段描述符又分为全局和局部的,再细分为数据段,代码段和状态段...这些东西在赵炯老师的那本linux内核中有详细讲解,楼主要细学的话可以参考一下那本书!
|
学习学习。
|
哦,学习学习,学无止境……