linux内核映射

学操作系统,与毛德操老师一起情景分析

版主: casualfish

linux内核映射

帖子karl 于 2010-07-22 20:19

linux中的内核空间是各个进程所共享的,而且我在看linux页面换出时,说实内核有很多页面实不可以换出的,那不能换出页面总共有多少个呢?内核用的哪些东西可以换出呢?
内核虚拟空间有1G,但是在实际运行中,内核真正映射的是多大呢?还有cr3的值是线性地址减去c0000000,那这个值所指向的PGD的地址一定在物理内存中吗?
karl
 
帖子: 30
注册: 2010-06-12 13:17

Re: linux内核映射

帖子casualfish 于 2010-07-23 12:27

在内核启动的过程中,会看到类似如下的boot log:
代码: 全选
Memory: 19300k/32768k available (1616k kernel code, 13448k reserved, 317k data, 64k init)

其中的reserved就是内核保留的物理内存大小,这个大小应该是与硬件相关的,例如内核会为使用framebuffer的设备预留出空间,如果没有这种设备则不会分配这个内存。
至于内核中哪些部分可以换出,个人觉得内核可以换出的部分不多,例如per CPU变量、block layer的request_queue、网络路由中的hash表等,应该都是驻留在内存中的。
1G内存(0xc0000000到0xffffffff)应该是内核地址空间的最大范围,真正的映射应该与系统在不同状态下进程数目(内核为进程保留内核栈),内核变量多少相关。
CR3寄存器指定页目录表的基地址,可以参考这个帖子(http://www.longene.org/forum/viewtopic.php?f=21&t=4343),cr3的值加上pgd offset在pgd表中得到的索引项是存在在物理内存中的,要不怎么能得到二级页面帧(PTE Page Frame)?
As there is nothing from the first, where does the dust collect itself?
casualfish
 
帖子: 72
注册: 2010-05-12 20:25

Re: linux内核映射

帖子karl 于 2010-07-23 14:03

那刚开始的时候,内存的容量很小,有的甚至小于1M,那你保留的物理内存大小都是13M了,那不够怎么办呢?此外,内核的代码也比较大了,那以前的内存小的时候,实怎么放在内存的呢?
karl
 
帖子: 30
注册: 2010-06-12 13:17

Re: linux内核映射

帖子casualfish 于 2010-07-23 16:21

lz没理解清楚系统初始化需要的内存和内核保留的内存的区别,初始化需要的内存并不多,像示例中的64k init,附件图中是我原来移植在S3C2440开发板(64M内存)上的内核,注意也只使用了148k的初始化内存,内核对于初始化使用的内存是很“吝啬”的,例如__initdata标志的数据使用完一次之后便会释放。
至于系统保留内存,这个是与具体硬件和内核支持的功能多少密切相关的,需要时要对针对硬件裁剪内核。例如不选择支持网络,那就不需要内核为网络协议栈分配。
附件
arm-linux.png
arm-linux.png (7.66 KiB) 被浏览 271 次
As there is nothing from the first, where does the dust collect itself?
casualfish
 
帖子: 72
注册: 2010-05-12 20:25


回到 情景分析讨论版

在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客