Linux.ChinaUnix.net
ChinaUnix
|
Linux首页
|
新闻
|
博客
|
文章
|
专栏
|
新手
|
方案
|
图书
|
下载
|
人才
|
手册
|
wiki
|
搜索
会员:
密码:
免费注册
|
忘记密码
|
会员登录
|
搜索
|
帮助
Linux内存:内存管理的实质
1
2
3
4
5
6
7
8
››
首页
»
CU论坛
»
Linux
»
汇总贴列表
»
内核源码
»
请选择您要去的论坛 ←
>新手园地
>系统管理
>网络问题
>硬件支持
>内核问题
>系统互操作专区
>中文支持
>桌面与办公
>影音娱乐
>网络工具
>编程问题
>内核源码
>CPU与编译器
>嵌入式开发
>驱动开发
>数据库应用
>服务器应用
>安全防护
>集群和虚拟机
>开源业界与评论
>贴图娱乐
>红茶馆
>文档专区
>下载共享
>Linux书友会
>Linux站务交流
===============
→ 操作系统技术交流区 ←
>BSD
>Solaris
>SCO UNIX
>HP-UX
>AIX
>IBM AS400应用论坛
>Tru64 UNIX
>IRIX
>Mac OS X
→ 行业解决方案交流区 ←
> 金融行业
> 电信行业
> 互联网行业
> 医卫行业
> 制造行业
> 信息安全
> 教育行业
> 媒体娱乐行业
> 电子政务
> 交通行业
→ 程序设计交流区 ←
>C/C++
>Shell
>Java
>Php
>Perl
>Python
>Web开发
>软件工程
>中间件技术
>GUI编程
>软件配置管理
>VOIP开发技术
→ 网管技术交流区 ←
>网络安全
>网络技术
>Cisco技术
>存储备份之家
>服务器及硬件技术
→ 数据库技术交流区 ←
>MySQL
>PostgreSQL
>Oracle
>Informix
>Sybase
>DB2
→ 应用技术专题交流区 ←
>Web服务器
>Mail服务器
>FTP服务器
>DNS服务器
>Proxy服务器
>LDAP
>VPN
>Lotus
>Samba
→ IT综合交流区 ←
>IT业界新闻与评论
>IT职业生涯
>IT培训与认证
>IT二手大厅
>IT图书与评论
→ IT人的休闲生活交流区 ←
>清茶斋
>运动地带
>快乐数码摄影
>影音文字
>English Forum
>游戏玩家
>旅游天下
>贴图娱乐
>红茶馆
>IT爱车族
→ 站务及频道交流区 ←
>站务交流
>版主会议室
>Linux站务交流
>Linux版主会议室
>博客站务交流区
>下载频道交流区
>CU活动专区
最近访问的论坛 ...
时代域名主机托管全面特惠
|
CU积分兑换详情
|
参加调查赠100积分+《Ubuntu官方指南》
|
100积分:谈谈您对校园网建设的体会
|
‹‹ 上一主题
|
下一主题 ››
[
打印
] [
订阅
] [
收藏
] [
推荐给朋友
] [
本帖文本页
]
本主题由 albcamus 于 2008-5-23 17:16 加入精华
frank_seng
精灵
UID:588431
注册:2007-7-17
最后登录: 2008-07-02
帖子:
207
精华:
2
可用积分:223
信誉积分:
100
专家积分:
0
(本版)
状态:
...离线...
[
资料
] [
站内短信
] [
Blog
]
1楼
发表于 2008-5-19 21:04
1. 内核初始化:
* 内核建立好内核页目录页表数据库,假设物理内存大小为len,则建立了[3G--3G+len]::[0--len]这样的虚地址vaddr和物理地址paddr的线性对应关系;
* 内核建立一个page数组,page数组和物理页面系列完全是线性对应,page用来管理该物理页面状态,每个物理页面的虚地址保存在page->virtual中;
* 内核建立好一个free_list,将没有使用的物理页面对应的page放入其中,已经使用的就不用放入了;
2. 内核模块申请内存vaddr = get_free_pages(mask,order):
* 内存管理模块从free_list找到一个page,将page->virtual作为返回值,该返回值就是对应物理页面的虚地址;
* 将page从free_list中脱离;
* 模块使用该虚拟地址操作对应的物理内存;
3. 内核模块使用vaddr,例如执行指令mov(eax, vaddr):
* CPU获得vaddr这个虚地址,利用建立好的页目录页表数据库,找到其对应的物理内存地址;
* 将eax的内容写入vaddr对应的物理内存地址内;
4. 内核模块释放内存free_pages(vaddr,order):
* 依据vaddr找到对应的page;
* 将该page加入到free_list中;
5. 用户进程申请内存vaddr = malloc(size):
* 内存管理模块从用户进程内存空间(0--3G)中找到一块还没使用的空间vm_area_struct(start--end);
* 随后将其插入到task->mm->mmap链表中;
6. 用户进程写入vaddr(0-3G),例如执行指令mov(eax, vaddr):
* CPU获得vaddr这个虚地址,该虚地址应该已经由glibc库设置好了,一定在3G一下的某个区域,根据CR3寄存器指向的current->pgd查当前进程的页目录页表数据库,发现该vaddr对应的页目录表项为0,故产生异常;
* 在异常处理中,发现该vaddr对应的vm_area_struct已经存在,为vaddr对应的页目录表项分配一个页表;
* 随后从free_list找到一个page,将该page对应的物理页面物理首地址赋给vaddr对应的页表表项,很明显,此时的vaddr和paddr不是线性对应关系了;
* 将page从free_list中脱离;
* 异常处理返回;
* CPU重新执行刚刚发生异常的指令mov(eax, vaddr);
* CPU获得vaddr这个虚地址,根据CR3寄存器指向的current->pgd,利用建立好的页目录页表数据库,找到其对应的物理内存地址;
* 将eax的内容写入vaddr对应的物理内存地址内;
7. 用户进程释放内存vaddr,free(vaddr):
* 找到该vaddr所在的vm_area_struct;
* 找到vm_area_struct:start--end对应的所有页目录页表项,清空对应的所有页表项;
* 释放这些页表项指向物理页面所对应的page,并将这些page加入到free_list队列中;
* 有必要还会清空一些页目录表项,并释放这些页目录表项指向的页表;
* 从task->mm->mmap链中删除该vm_area_struct并释放掉;
综合说明:
* 可用物理内存就是free_list中各page对应的物理内存;
* 页目录页表数据库的主要目的是为CPU访问物理内存时转换vaddr-->paddr使用,分配以及释放内存时不会用到,但是需要内核内存管理系统在合适时机为CPU建立好该库;
* 对于用户进程在6中获得的物理页面,有两个页表项对应,一个就是内核页目录页表数据库的某个pte[i ],一个就是当前进程内核页目录页表数据库的某个 pte[j],但是只有一个page和其对应。如果此时调度到其他进程,其他进程申请并访问某个内存,则不会涉及到该物理页面,因为其分配时首先要从 free_list中找一个page,而该物理页面对应的page已经从free_list中脱离出来了,因此不存在该物理页面被其他进程改写操作的情况。内核中通过get_free_pages等方式获取内存时,也不会涉及到该物理页面,原理同前所述。
本帖最近评分记录
yuhuohu
2008-5-23 10:22
可用积分
+5
我很赞同
您对本贴的看法:
鲜花[3]
臭蛋[0]
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
scutan
(冬日夜雨)
精灵使
Linux newbie
UID:551201
注册:2007-4-13
最后登录: 2008-07-04
帖子:
3709
精华:
5
可用积分:2824
信誉积分:
305
专家积分:
9
(本版)
来自:成都
状态:
...在线...
[
资料
] [
站内短信
] [
Blog
]
2楼
发表于 2008-5-19 21:27
总结得很好,学习了!
您对本贴的看法:
鲜花[0]
臭蛋[0]
__________________________________
全力以赴每一秒!
勿在浮砂筑高台!
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
zx_wing
(骑着猪的青蛙)
大天使
学徒
UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:
1687
精华:
3
可用积分:2338
信誉积分:
100
专家积分:
1
(本版)
来自:成都
状态:...保密...
[
资料
] [
站内短信
] [
Blog
]
3楼
发表于 2008-5-19 21:31
唉,一直想看看内核的内存子系统,但实在太大了,要很多时间。
还是先把一些小系统搞懂再说。
顶LZ,辛苦了
您对本贴的看法:
鲜花[1]
臭蛋[0]
__________________________________
C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
zx_wing
(骑着猪的青蛙)
大天使
学徒
UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:
1687
精华:
3
可用积分:2338
信誉积分:
100
专家积分:
1
(本版)
来自:成都
状态:...保密...
[
资料
] [
站内短信
] [
Blog
]
4楼
发表于 2008-5-19 23:20
再顶一个,希望LZ能细化一下
您对本贴的看法:
鲜花[0]
臭蛋[0]
__________________________________
C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
frank_seng
精灵
UID:588431
注册:2007-7-17
最后登录: 2008-07-02
帖子:
207
精华:
2
可用积分:223
信誉积分:
100
专家积分:
0
(本版)
状态:
...离线...
[
资料
] [
站内短信
] [
Blog
]
5楼
发表于 2008-5-19 23:32
QUOTE:
原帖由
zx_wing
于 2008-5-19 23:20 发表
再顶一个,希望LZ能细化一下
老弟,要细化就失去该篇文档的意义了
。
花了大概一年看Linux内存管理,其涉及到的概念、数据结构、算法都非常多,每一部分都可以详细写出一篇文档,做的笔记好几万字,但总感觉应该用简短的几句话描述出内存管理的实质,试图总结过好几次,没成功。在上个星期,彻底静下心来花了几天时间,总结出这篇文档,来尽可能的清晰描绘出Linux内存管理的实质,希望有所帮助。
您对本贴的看法:
鲜花[0]
臭蛋[0]
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
zx_wing
(骑着猪的青蛙)
大天使
学徒
UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:
1687
精华:
3
可用积分:2338
信誉积分:
100
专家积分:
1
(本版)
来自:成都
状态:...保密...
[
资料
] [
站内短信
] [
Blog
]
6楼
发表于 2008-5-20 00:33
QUOTE:
原帖由
frank_seng
于 2008-5-19 23:32 发表
老弟,要细化就失去该篇文档的意义了
。
花了大概一年看Linux内存管理,其涉及到的概念、数据结构、算法都非常多,每一部分都可以详细写出一篇文档,做的笔记好几万字,但总感觉应该用简短的几句话描述 ...
佩服佩服,我现在也在艰难的学习中。
内存一直不敢碰。我建议LZ慢慢写,一点点的理清楚,对自己有利,对别人也有利。
还有就是可以升级到2.6内核哈,现在2.4有点过时了。例如新的slab也出来了。
您对本贴的看法:
鲜花[0]
臭蛋[0]
__________________________________
C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
frank_seng
精灵
UID:588431
注册:2007-7-17
最后登录: 2008-07-02
帖子:
207
精华:
2
可用积分:223
信誉积分:
100
专家积分:
0
(本版)
状态:
...离线...
[
资料
] [
站内短信
] [
Blog
]
7楼
发表于 2008-5-20 00:43
QUOTE:
原帖由
zx_wing
于 2008-5-20 00:33 发表
佩服佩服,我现在也在艰难的学习中。
内存一直不敢碰。我建议LZ慢慢写,一点点的理清楚,对自己有利,对别人也有利。
还有就是可以升级到2.6内核哈,现在2.4有点过时了。例如新的slab也出来了。
内存管理俺看的是2.6的,呵呵
您对本贴的看法:
鲜花[0]
臭蛋[0]
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
zx_wing
(骑着猪的青蛙)
大天使
学徒
UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:
1687
精华:
3
可用积分:2338
信誉积分:
100
专家积分:
1
(本版)
来自:成都
状态:...保密...
[
资料
] [
站内短信
] [
Blog
]
8楼
发表于 2008-5-20 00:48
QUOTE:
原帖由
frank_seng
于 2008-5-20 00:43 发表
内存管理俺看的是2.6的,呵呵
那LZ可以先选一个最熟悉的部分,写个特详细的,写完一个是一个。
我感觉现在好多同志都是基本原理知道,实现细节不清楚(我就是这样的
)
急切需要一个详细的文档来梳理
PS:成都今晚又要大震,电台报的好心慌,可怜我在外面拖跟网线上网哦~~~
您对本贴的看法:
鲜花[0]
臭蛋[0]
__________________________________
C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
frank_seng
精灵
UID:588431
注册:2007-7-17
最后登录: 2008-07-02
帖子:
207
精华:
2
可用积分:223
信誉积分:
100
专家积分:
0
(本版)
状态:
...离线...
[
资料
] [
站内短信
] [
Blog
]
9楼
发表于 2008-5-20 00:57
QUOTE:
原帖由
zx_wing
于 2008-5-20 00:48 发表
那LZ可以先选一个最熟悉的部分,写个特详细的,写完一个是一个。
我感觉现在好多同志都是基本原理知道,实现细节不清楚(我就是这样的
)
急切需要一个详细的文档来梳理
PS:成都今晚又要大震,电 ...
啊?可怜的孩子,早点休息啊!老弟的学习精神让人敬佩!
其实我也是源码和ULK结合看的,呵呵
[
本帖最后由 frank_seng 于 2008-5-20 10:41 编辑
]
您对本贴的看法:
鲜花[0]
臭蛋[0]
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
afalon
骑士
UID:515583
注册:2007-1-8
最后登录: 2008-06-11
帖子:
53
精华:0
可用积分:50
信誉积分:
100
专家积分:
0
(本版)
状态:
...离线...
[
资料
] [
站内短信
] [
Blog
]
10楼
发表于 2008-5-20 12:29
QUOTE:
原帖由
frank_seng
于 2008-5-19 23:32 发表
老弟,要细化就失去该篇文档的意义了
。
花了大概一年看Linux内存管理,其涉及到的概念、数据结构、算法都非常多,每一部分都可以详细写出一篇文档,做的笔记好几万字,但总感觉应该用简短的几句话描述 ...
贊一個!
您对本贴的看法:
鲜花[0]
臭蛋[0]
CU可用积分兑换Linux/Unix精品图书
|
《Ubuntu标准教程》书评获奖名单公布
首页
»
CU论坛
»
Linux
»
汇总贴列表
»
内核源码
»
1
2
3
4
5
6
7
8
››
请选择您要去的论坛 ←
>新手园地
>系统管理
>网络问题
>硬件支持
>内核问题
>系统互操作专区
>中文支持
>桌面与办公
>影音娱乐
>网络工具
>编程问题
>内核源码
>CPU与编译器
>嵌入式开发
>驱动开发
>数据库应用
>服务器应用
>安全防护
>集群和虚拟机
>开源业界与评论
>贴图娱乐
>红茶馆
>文档专区
>下载共享
>Linux书友会
>Linux站务交流
===============
→ 操作系统技术交流区 ←
>BSD
>Solaris
>SCO UNIX
>HP-UX
>AIX
>IBM AS400应用论坛
>Tru64 UNIX
>IRIX
>Mac OS X
→ 行业解决方案交流区 ←
> 金融行业
> 电信行业
> 互联网行业
> 医卫行业
> 制造行业
> 信息安全
> 教育行业
> 媒体娱乐行业
> 电子政务
> 交通行业
→ 程序设计交流区 ←
>C/C++
>Shell
>Java
>Php
>Perl
>Python
>Web开发
>软件工程
>中间件技术
>GUI编程
>软件配置管理
>VOIP开发技术
→ 网管技术交流区 ←
>网络安全
>网络技术
>Cisco技术
>存储备份之家
>服务器及硬件技术
→ 数据库技术交流区 ←
>MySQL
>PostgreSQL
>Oracle
>Informix
>Sybase
>DB2
→ 应用技术专题交流区 ←
>Web服务器
>Mail服务器
>FTP服务器
>DNS服务器
>Proxy服务器
>LDAP
>VPN
>Lotus
>Samba
→ IT综合交流区 ←
>IT业界新闻与评论
>IT职业生涯
>IT培训与认证
>IT二手大厅
>IT图书与评论
→ IT人的休闲生活交流区 ←
>清茶斋
>运动地带
>快乐数码摄影
>影音文字
>English Forum
>游戏玩家
>旅游天下
>贴图娱乐
>红茶馆
>IT爱车族
→ 站务及频道交流区 ←
>站务交流
>版主会议室
>Linux站务交流
>Linux版主会议室
>博客站务交流区
>下载频道交流区
>CU活动专区
Copyright © 2001-2008 ChinaUnix.net All Rights Reserved 联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处
京ICP证041476号
清除 Cookies
-
Linux时代
-
Archiver
-
WAP
-
TOP
Processed in 0.045907 second(s), 7 queries , Gzip enabled