https://yq.aliyun.com/articles/11192?spm=0.0.0.0.hq1MsD

随着要维护的服务器增多,遇到的各种稀奇古怪的问题也会增多,要想彻底解决这些“小”问题往往需要更深的Linux方面的知识。越专业、分工越细的工程师,在这方面的要求也就越高。这次,对MySQL Swap的问题的探索过程,就一不小心掉进了Linux Memory Managemant(Linux MM)的研究中去了,爬了很久才出来,这里做一个系列笔记。

笔记中很多内容都是参考《Understanding the Linux Kernel, 3rd Edition》、Linux Source Code等地方,自己再做了一些总结,觉得有意义的总结这里记录一下,供参考。

1. 写在前面

Linux MM是一个比较猥琐的体系,虽然理论不太多,但是细节非常多。要从底层物理内存管理到上层虚拟内存管理整个关节打通,一方面需要较多底层架构知识、还需要很深的Linux知识。既然是学习笔记,先说一下我的学习资料:

1. Linux Memory Management David A Rusling 这本书很老了,当时的Kernel还是2.0.33版本的;这本书的优点在于抽象得很到位,把Linux_MM的基本模块、思想都通俗易懂的介绍了一遍。这也是kernel-docs.txt中推荐的读物之一;

2. 《Understanding the Linux Kernel, 3rd Edition》中的第二、八、十七章 这是基于2.6内核,非常有参考价值,介绍得非常细致,可以结合内核的源代码一起来看。

3. Linux Source Code 只看了几个自己关心的函数,没那么难:)

我不是计算机科班出身,体系结构的基础比较差,所以刚开始入门的时间相对较长,前后大概历时一个月,实际伏案时间约50小时,而这也只是一个开始

2. 基本框架

上面是一幅简图,后面会分别介绍,Kernel如何使用内存、Kernel如何管理分配内存、用户空间的内存管理。对于其中的一些细节则会单独介绍,例如大页内存,内存回收算等等。

2. Linux启动与内存管理

开机的第一个过程是BIOS自检,BIOS使用0x00000000到0x10000(1MB)内存,这1MB内存包括了自检程序、自检结果、还留一部分给显示设备使用;自检完成后,开始载入Linux内核,Linux从1MB开始使用物理内存,一般5MB就足够了,在内核的符号信息中可以看到,Linux内核从_text开始,_edata处结束

$more /boot/System.map-2.6.9-55.ELsmp|grep "\ _text$\|_etext$\| _edata$\| _end$"
ffffffff80100000 A _text
ffffffff80310399 A _etext
ffffffff80456aa8 A _edata

简图:

这里不涉及x86架构下的分页、分段细节,后面会单独介绍之。

这一篇很简单,是一个开始:)

【update 2011-03-29】

在64位系统中,Linux(2.6.18)从2MB开始使用物理内存。(32位系统,仍然是从1MB开始)

file: ./arch/x86_64/defconfig
CONFIG_PHYSICAL_START=0x200000
//This gives the physical address where the kernel is loaded.

最新文章

  1. php 远程图片本地化
  2. Android开发之Toast
  3. 【转】Java代码规范
  4. centos7安装数据库
  5. 130 个你需要了解的 vim 命令
  6. 在Spring中使用脚本
  7. SQL触发器、事务
  8. 如何将jsp中<input>设为只读
  9. Twitter:蓄水池储水量问题
  10. HTTP 协议实现
  11. oracle-使用数据泵对不同用户和不同表空间的数据迁移
  12. Varnish 实战项目
  13. jar包后台启动--nohup篇
  14. SpringBoot(二)_项目属性配置
  15. sqlplus编译失效对象
  16. Hadoop记录-HDFS balancer配置
  17. [No000018E]Vim快速跳转任意行、任意列以及高亮显示当前行、当前列方法-Vim使用技巧(3)
  18. 如何在unity中使用龙骨动画
  19. Alpha冲刺第9天
  20. RV LayoutManager 流式布局 MD

热门文章

  1. 链表回文串判断&&链式A+B
  2. 【转】What's the difference between simulation and emulation
  3. Maven 包命令
  4. 【转】从零开始编写自己的C#框架(7)——需求分析
  5. Jquery 等待ajax返回数据loading控件ShowLoading组件
  6. 40 个顶级 jQuery 图片、内容滑块和幻灯片(转)
  7. 第三百三十天 how can I 坚持
  8. 第二百三十五天 how can I 坚持
  9. C++11多元组类别
  10. Qt Creator无法用“UTF-8”编码解码