Linux内核源码--内存管理部分:
我们看下boot传入的命令为:
"noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0 rootfstype=cramfs mem=64M"
进入setup_arch函数后,首先遇到的和内存管理有关的,是parse_cmdline函数。
在arch\arm\kernel\setup.c中,mem命令参数被预执行。(关于其他__early_param参数,可以在SI中以__early_param为关键字搜索,其实也没几个。)
于是我们先跳进setup.c中分析一下这个函数。
执行完预操作之后,跟着就是paging_init对MMU的初始化
这个函数在arch\arm\mm\mmu.c中,我们先进入对应的位置分析。
paging_init这个函数虽然不大,但是调用的层次比较多,不过主要集中在arch\arm\mm\init.c和arch\arm\mm\mmu.c两个文件中,于是我们先尝试能不能把这两个文件给端了。
由于此时内存管理还未开始,所以这两个文件应该会比较独立先看init,而init中的内存管理,则是在mm\bootmem.c中。
在看代码之前,我们先看一个结构体:
typedef struct bootmem_data {
unsigned long node_boot_start; //可供内核管理的内存的起始物理地址
unsigned long node_low_pfn; //可管理物理内存结束位置的页框号
void *node_bootmem_map; //记录内存分配状况的位图的虚拟地址
unsigned long last_offset; //最后一次分配的页内偏移(结束地址)
unsigned long last_pos; //最后一次分配的PFN(结束页号)
unsigned long last_success; //最后成功申请的内存的起始物理地址,该地址之前的地址内存均被占用
struct list_head list; //挂到链表中的节点(该链表按node_boot_start成员由小到大排列)
} bootmem_data_t;
小结:
注意:bootmem_data_t操作的是物理内存,而不是虚拟内存!!!