内存代码

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_initMMU的初始化

这个函数在arch\arm\mm\mmu.c中,我们先进入对应的位置分析。

paging_init这个函数虽然不大,但是调用的层次比较多,不过主要集中在arch\arm\mm\init.carch\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操作的是物理内存,而不是虚拟内存!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屠变恶龙之人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值