linux启动代码之detect_memory()函数

本篇笔记主要针对平台i386进行讨论,我也是新手,不当之处,敬请指正。以下讨论中“/”代表“/内核源代码根目录/arch/x86/boot/”目录,我用到的内核源代码版本为2.6.26.5

在被bootloader加载到内存后, cpu最初执行的linux内核代码是/header.S文件中的setup函数,这个函数在做了一些准备工作后会跳转到boot目下文件main.cmain函数执行,在这个main函数中我们可以第一次看到与内存管理相关的代码,这段代码调用detect_memeory()函数检测系统物理内存,代码如下图:


/main.c/main()代码片段

detect_memory()函数位于/memory.c中,定义如下图:

detect_memory()函数代码非常简单,由上图可知,linux内核会分别尝试调用detect_memory_e820()detcct_memory_e801()detect_memory_88()获得系统物理内存布局,这3个函数内部其实都会以内联汇编的形式调用bios中断以取得内存信息,该中断调用形式为int 0x15,同时调用前分别把AX寄存器设置为0xe820h0xe801h0x88h,关于0x15号中断的具体作用我这里就不再说明,有兴趣的可以去查询相关手册。下面我仅分析下detect_memory_e820()的代码,其它代码基本一样,源代码如下图所示:

/memory.c/detect_memory_e820(void)代码

该代码中用到的两个结构体定义如下:

detect_memory_e820功能概述:

       由于历史原因,一些i/o设备也会占据一部分内存物理地址空间,因此系统可以使用的物理内存空间是不连续的,系统内存被分成了很多段,每个段的属性也是不一样的。int 0x15 查询物理内存时每次返回一个内存段的信息,因此要想返回系统中所有的物理内存,我们必须以迭代的方式去查询。detect_memory_e820()函数把int 0x15放到一个do-while循环里,每次得到的一个内存段放到struct e820entry里,而struct e820entry的结构正是e820返回结果的结构!而像其它启动时获得的结果一样,最终都会被放到boot_params里,e820被放到了 boot_params.e820_map

 

detect_memory_e820主要注释如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值