Linux内存管理学习笔记 转
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等地方,自己再做了一些总结,觉得有意义的总结这里记录一下,供参考。
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小时,而这也只是一个开始

上面是一幅简图,后面会分别介绍,Kernel如何使用内存、Kernel如何管理分配内存、用户空间的内存管理。对于其中的一些细节则会单独介绍,例如大页内存,内存回收算等等。
开机的第一个过程是BIOS自检,BIOS使用0x00000000到0x10000(1MB)内存,这1MB内存包括了自检程序、自检结果、还留一部分给显示设备使用;自检完成后,开始载入Linux内核,Linux从1MB开始使用物理内存,一般5MB就足够了,在内核的符号信息中可以看到,Linux内核从_text开始,_edata处结束
ffffffff80100000 A _text
ffffffff80310399 A _etext
ffffffff80456aa8 A _edata
简图:

这里不涉及x86架构下的分页、分段细节,后面会单独介绍之。
这一篇很简单,是一个开始:)
【update 2011-03-29】
在64位系统中,Linux(2.6.18)从2MB开始使用物理内存。(32位系统,仍然是从1MB开始)
CONFIG_PHYSICAL_START=0x200000
//This gives the physical address where the kernel is loaded.
Linux内存管理学习笔记 转的更多相关文章
- Linux内存管理学习笔记——内存寻址
		最近开始想稍微深入一点地学习Linux内核,主要参考内容是<深入理解Linux内核>和<深入理解Linux内核架构>以及源码,经验有限,只能分析出有限的内容,看完这遍以后再更深 ... 
- 郝健: Linux内存管理学习笔记-第1节课【转】
		本文转载自:https://blog.csdn.net/juS3Ve/article/details/80035751 摘要 MMU与分页机制 内存区域(内存分ZONE) LinuxBuddy分配算法 ... 
- 郝健: Linux内存管理学习笔记-第2节课【转】
		本文转载自:https://blog.csdn.net/juS3Ve/article/details/80035753 摘要 slab./proc/slabinfo和slabtop 用户空间mallo ... 
- Linux内存管理学习笔记--物理内存分配
		http://blog.chinaunix.net/uid-20321537-id-3466022.html 
- C++内存管理学习笔记(7)
		/****************************************************************/ /* 学习是合作和分享式的! /* Auth ... 
- C++内存管理学习笔记(5)
		/****************************************************************/ /* 学习是合作和分享式的! /* Auth ... 
- C++内存管理学习笔记(6)
		/****************************************************************/ /* 学习是合作和分享式的! /* Auth ... 
- Linux内存管理学习资料
		下面是Linux内存管理学习的一些资料. 博客 mlock() and mlockall() system calls. All about Linux swap space 逆向映射的演进 Linu ... 
- C++内存管理学习笔记(4)
		/****************************************************************/ /* 学习是合作和分享式的! /* Auth ... 
随机推荐
- c++中的 extern "C"(转载)
			比如说你用C 开发了一个DLL 库,为了能够让C ++语言也能够调用你的DLL 输出(Export) 的函数,你需要用extern "C" 来强制编译器不要修改你的函数名. 通常, ... 
- virtualenv 和 virtualenvwrapper 实践
			virtualenv 首先来聊一下 virtualenv 是个什么鬼. 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题:亦或者是在开发过程中不想让物理环境里充 ... 
- 如何让Java和C++接口互相调用:JNI使用指南
			如何让Java和C++接口互相调用:JNI使用指南 转自:http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos ... 
- 30大最有影响力的Web设计与开发英文博客
			1stwebdesigner的创始人Dainis Graveris挑选出30个高质量和具有影响力的Web设计与前端技术博客,其中很多我们都耳熟能详.但这么完整的列表,还是值得收藏的.另外,你大概不会了 ... 
- C#UDP(接收和发送源码)源码完整
			C#UDP(接收和发送源码)源码完整 最近做了一个UDP的服务接收和发送的东西.希望能对初学的朋友一点帮助. 源码如下: 一.逻辑--UdpServer.cs using System;using S ... 
- c语言typedef的用法-解惑阿!很多天书般的东西解释的不错(转)
			转自(http://www.cnblogs.com/wchhuangya/archive/2009/12/25/1632160.html) 一.基本概念剖析 int* (*a[5])(int, cha ... 
- 闲置的eSATA接口,会影响Windows 7的启动速度
			为方便用户连接外置硬盘等设备,很多中高 端主板上都有至少一个eSATA接口.事实上,很多人可能根本就不用eSATA接口,你想过没有,正是这个无所事事的eSATA接口,可能无意中就拖慢了 你的Win ... 
- 咏南WEB开发框架
			和咏南CS开发框架共享同一个咏南中间件. 
- POJ 3298 Antimonotonicity (思维)
			题目链接:http://poj.org/problem?id=3298 找一个最长不要求连续的子序列,如a1 > a3 < a6 > a7 ... 举个例子模拟一下差不多明白了,a[ ... 
- HDU 3364 Lanterns (高斯消元)
			题意:有n个灯和m个开关,每个开关控制数个灯的状态改变,给出k条询问,问使灯的状态变为询问中的状态有多少种发法. 析:同余高斯消元法,模板题,将每个开关控制每个灯列成行列式,最终状态是结果列,同余高斯 ... 
