注册
登录
首页
网站近况
会员
标签
统计
帮助
LUPA论坛
»
内核问题答疑
» 关于 Linux 内存管理的学习方法
‹‹ 上一主题
|
下一主题 ››
发新话题
发布投票
发布商品
发布悬赏
发布活动
发布辩论
发布视频
打印
关于 Linux 内存管理的学习方法
rstevens
初来乍到
个人空间
发短消息
加为好友
1
#
发表于 2006-12-4 12:38
只看该作者
关于 Linux 内存管理的学习方法
学习 Linux 内核,应该是首先建立清晰的概念,把握整体,然后才是深入细节。
内存管理看上去比较复杂,但我认为,掌握以下几个基本概念,在学习时,就能做到成竹在胸
欢迎补充、讨论!
1、内存管理的首要任务
很简单,就是把可用的物理内存管理好。
怎么管理?提供一套统一的接口,用于分配内存和释放内存。
这套接口就是最基本的物理内存分配方式,采用的分配方法是伙伴策略。
更高一级的内存分配策略
基本的内存分配策略,可以避免外部因素导致的分片(外分片?)
为了避免因为小于 1 page 的请求导致的分片(内分片),又在基本分配基础之上,采用了 SLAB 分配策略。当然,也可以采用其它的分配策略。
记住,无论是内核代码,还是用户空间代码,都必须首先申请内存,然后才能使用。
而无论什么分配方式,最终都是由基本的内存分配器负责分配分配内存。
2、理解 x86 的映射机制
我们想直接访问一个物理内存的地址,如果那样,没有逻辑地址、虚拟地址、物理地址、段、页。。。的概念,世界多美好,
但是,现实是残酷的。 X86 ,或者说现代的处理器,不允许你直接访问物理内存。(所有讲 Linux 操作系统的书都解释了原因)。
我们必须使用逻辑地址,通过段映射,页映射,才能访问到物理内存。
如何理解段映射和页映射????
段映射和页映射,是 CPU 干的事情。内核所能做的事情,就是根据可用的物理内存,配置好页目录表、页表,然后告诉 CPU。
对于同样一块物理内存,内核有内核的映射方式,每个进程有自己的映射方式。(正因为如此,才能在进程之间共享内存;也才能使得内核能访问进程的内存)
内核对所有的物理内存(896M 以内)都进行了映射;但是映射并不表示分配!!!内核需要内存的时候,也得先申请,后使用。
进程则只对必须使用的内存进行映射,并在需要的时候动态建立新的映射关系。
3、从用户空间进入内核空间,以及从内核空间返回用户空间时,页目录表、页表是如何发生切换的
在这三个概念基础之上,我们进一步可以理解:
4、进程空间如何管理内存
进程虽然理论上拥有 3G 空间,但实际只使用很少的内存,因此进程是动态的建立映射关系的。
此外,进程采用“内存区间”来管理属于自己的内存。
当需要内存的时候,
首先建立一个“内存区间”(线性地址)
然后通过内存分配器,申请一块物理内存。
最后,在“内存区间”与物理内存之间建立映射关系
UID
27343
帖子
6
精华
0
积分
5
阅读权限
10
在线时间
0 小时
注册时间
2006-12-4
最后登录
2007-2-2
查看详细资料
TOP
zhwang
关注开源
个人空间
发短消息
加为好友
2
#
发表于 2006-12-4 12:52
只看该作者
嗯,看了LZ的言论,发现我还停留在3的阶段,要学的东西太多了。
Only the paranoid survive.
UID
26069
帖子
24
精华
1
积分
63
阅读权限
20
来自
Shenzhen
在线时间
3 小时
注册时间
2006-10-26
最后登录
2007-5-25
查看个人网站
查看详细资料
TOP
rstevens
初来乍到
个人空间
发短消息
加为好友
3
#
发表于 2006-12-4 13:05
只看该作者
头脑中始终清醒的有这些基本概念,那么就可以进一步深入去学习伙伴策略、 SLAB 分配器、进程的“内存区间”,页目录表、页表的管理方式等等实现细节。而不至于被逻辑地址、线性地址(虚拟地址)、物理地址、内核空间、用户空间这些概念折腾的头晕脑张
我喜欢的学习方法是首先提出一系列问题,然后带着这些问题一个一个去书中,代码中求解。
其实,更高级的方法,应该是首先自己思考如何解决问题,然后去求证,而不是求解。当然,这可能就是最高境界了
UID
27343
帖子
6
精华
0
积分
5
阅读权限
10
在线时间
0 小时
注册时间
2006-12-4
最后登录
2007-2-2
查看详细资料
TOP
lwf163
挂了
个人空间
发短消息
加为好友
4
#
发表于 2006-12-6 11:07
只看该作者
正在学习linux内核的内存管理,小有收获!呵呵
UID
27440
帖子
4
精华
0
积分
-16
阅读权限
0
在线时间
0 小时
注册时间
2006-12-6
最后登录
2006-12-8
查看详细资料
TOP
wuhua0904
开源主力军
个人空间
发短消息
加为好友
5
#
发表于 2007-11-2 08:34
只看该作者
初学者,发现还有好多东西要学
UID
47147
帖子
346
精华
1
积分
3139
阅读权限
30
来自
宁波
在线时间
210 小时
注册时间
2007-5-26
最后登录
2008-9-8
查看个人网站
查看详细资料
TOP
godmatrix
关注开源
个人空间
发短消息
加为好友
6
#
发表于 2007-11-4 23:30
只看该作者
我想问个问题,用户空间访问内存和内核访问物理内存的不同在哪里?是不是用户空间通过分页机制,而内核通过映射(偏移PAGE_OFFSET)来访问物理内存?
UID
72349
帖子
16
精华
1
积分
250
阅读权限
20
在线时间
10 小时
注册时间
2007-10-12
最后登录
2008-1-3
查看详细资料
TOP
wuqixuan
关注开源
个人空间
发短消息
加为好友
7
#
发表于 2007-11-24 22:30
只看该作者
答复楼上的问题, 我的理解是, OS不能直接访问内存, 只能通过CPU的MMU(通过地址映射)来访问内存, 因此只有 CR3 中和页表中存放的是物理地址, 其余代码中出现的地址都是线性地址. PAGE_OFFSET的使用, 我想只是为了算出物理地址, 然后就马上把这个地址赋值给 CR3 或页表, 不会直接使用这个地址的.
请版主看看我分析得是否正确?
UID
87086
帖子
7
精华
0
积分
124
阅读权限
20
在线时间
4 小时
注册时间
2007-11-17
最后登录
2008-8-6
查看详细资料
TOP
‹‹ 上一主题
|
下一主题 ››
控制面板首页
编辑个人资料
积分交易
积分记录
公众用户组
勋章
访问推广
基本概况
流量统计
客户软件
发帖量记录
版块排行
主题排行
发帖排行
积分排行
交易排行
在线时间
管理团队
管理统计