日期:2014-05-16  浏览次数:20718 次

关于LINUX运行时线性空间及物理内存存储的分布问题


|------------|--------------------|---------------------------|------------|-----------|
|                         3G                                   3G+MEM                                                 |                         |                       |              
|进程空间         |         物理内存映射         |             非连续VMALLOC分配区     |     高端分配     |   固定映射     |
|--------------------------------------------------|

省略了各gap部分

我对其中的内存映射部分不是很清楚
以下只是我自己的理解画出的图,不对之处请大家指正!

|--------|---------------|-------|------|------------|----------------------|
|             640K                             |               |           1M                         |                                             |
|     RAM       |   图形卡存储空间|     空白   |   BIOS   |kernel   image|               空白                       |
|                 |                               |               |             |                         |                                             |
|---------------------------------------|

暂时先想到以下几个问题:
1其中空白部分就是由kmalloc动态分配的部分?
2kernel   image大小是多少?
3mem_map[]存放的位置通常在zone_normal开始的位置,怎么理解?
4zone_normal是在物理空间16M的位置,是不是说在右边空白部分从16M开始存储mem_map[]数组(大小由内存大小决定)?
5mem_map[]中一个项对应一个page,那它本身占用的空间是否也要由某个page指定?

不知道表达得是否清楚,好象也没找到将这块内容介绍得很清楚的书。希望大家帮我解惑!谢谢了!


------解决方案--------------------
1其中空白部分就是由kmalloc动态分配的部分?
2kernel image大小是多少?
3mem_map[]存放的位置通常在zone_normal开始的位置,怎么理解?
4zone_normal是在物理空间16M的位置,是不是说在右边空白部分从16M开始存储mem_map[]数组(大小由内存大小决定)?
5mem_map[]中一个项对应一个page,那它本身占用的空间是否也要由某个page指定?
=======================================
1.kmalloc分配的是slab_cache的空间,线性地址是3G以上,物理地址是可分配的物理空间.640K内的部分内存也是可分配的.
2.内核映象可大可小.一般1M到3M不等
3.mem_map本来可以随便放的,但是他是全局的内核数据,所以不应该占用DMA内存.再次因为它分配的很早(在内存管理相关机制完全建立起来前),所以就分配到了zone_normal开始处了.如果分配到zone_normal的其他地方也是可以的.
4.见3.
5.当然了.