没有合适的资源?快使用搜索试试~ 我知道了~
深入理解Linux内存映射机制
5星 · 超过95%的资源 需积分: 10 11 下载量 154 浏览量
2010-08-02
11:25:13
上传
评论
收藏 263KB DOC 举报
温馨提示
试读
48页
深入理解Linux内存映射机制 ,对内在映射描述比较详细,基于2.4内核
资源推荐
资源详情
资源评论
深入理解 Linux 内存映射机制
创建时间:
文章属性:原创
文章提交:
深入理解 内存映射机制
!
"#$$%#$$&'($)
*+
一绪论
二,+ 的硬件寻址方法
三内核对页表的设置
四实例分析映射机制
一绪论
我们经常在程序的反汇编代码中看到一些类似 -+) 这样的地址,操作系统中称为线
性地址,或虚拟地址。虚拟地址有什么用?虚拟地址
又是如何转换为物理内存地址的呢?本章将对此作一个简要阐述。
.. 内存寻址概述
现代意义上的操作系统都处于 位保护模式下。每个进程一般都能寻址 /0 的物理空间。
但是我们的物理内存一般都是几百 ,进程怎么能获得 /0
的物理空间呢?这就是使用了虚拟地址的好处,通常我们使用一种叫做虚拟内存的技术来
实现,因为可以使用硬盘中的一部分来当作内存使用
。例外一点现在操作系统都划分为系统空间和用户空间,使用虚拟地址可以很好的保护内
核空间被用户空间破坏。
对于虚拟地址如何转为物理地址1这个转换过程有操作系统和 234 共同完成操作系统为
234 设置好页表。234 通过 4 单元进行地址转换。
..浏览内核代码的工具
现在的内核都很大,因此我们需要某种工具来阅读庞大的源代码体系,现在的内核开发工
具都选用 5(66# 浏览内核代码,网上已有
现成的 (78 文件用来生成 $#$。
一、用法:
....找一个空目录,把附件 78 拷贝进去。然后在该目录中选择性地运行如下 (7 命
令:
9(7
将处理$$$ 下的源文件,在当前目录生成 1#
..注:":2*;: 用来指定内核源代码目录,如果没有指定,则缺省为$$$ $
只创建
9(7":2*;:<$$$ +$
只创建 #
9(7":2*;:<$$$ +$#
创建 和 #
9(7":2*;:<$$$ +$
/只创建
9(7":2*;:<$$$ +$=0"
二、处理时包括的内核源文件:
不包括 '5,' 目录
不包括无关的体系结构目录
8 目录只包括顶层目录和 ,# 目录
三、最简单的 命令
进入
进入 5( 后,用
8(
跳到函数 8(
看函数('8)
想进入光标所在的函数,用
2=:6>
回退
回退用àààà2=:6=
..内核版本的选取
本次论文分析,我选取的是 + 版本的内核。最新的内核代码为 +)。但是现在
主流的服务器都使用的是 :'?"/ 的机器,它使
用 +- 的内核。我选取 + 是因为它很接近 +-,现在红帽企业 / 以 +-
内核为基础,是最稳定、最强大的商业产品。在 /
年期间,@' 等开源项目为 + 内核技术的更加成熟提供了一个环境,这使得红帽
企业5/ 内核可以提供比以前版本更多更好的
功能和算法,具体包括
A通用的逻辑 234 调度程序:处理多内核和超线程 234。
A基于对象的逆向映射虚拟内存:提高了内存受限系统的性能。
A读复制更新:针对操作系统数据结构的 "3 算法优化。
A多 ;$B 调度程序:可根据应用环境进行选择。
A增强的 "3 和 C4 支持:提高了大型服务器的性能和可扩展性。
A网络中断缓和(C3;):提高了大流量网络的性能。
+内核使用了许多技术来改进对大量内存的使用,使得比以往任何时候都更
适用于企业。包括反向映射(5(##)
、使用更大的内存页、页表条目存储在高端内存中,以及更稳定的管理器。因此,我选取
+ 内核版本作为分析对象。
二,+ 的硬件寻址方法
请参考 ; + 手册DD
三内核对页表的设置
234 做出映射的前提是操作系统要为其准备好内核页表,而对于页表的设置,内核在系统
启动的初期和系统初始化完成后都分别进行了设置。
与内存映射相关的几个宏
这几个宏把无符号整数转换成对应的类型
....E'8#..............#FG
....E'8#('............#('FG
....E'8#'..............#'FG
....E'8##............##FG
....根据 把它转换成对应的无符号整数
....E'8#5 ..............#
....E'8#('5 ............#('
....E'8#'5 ............#'
....E'8##5 ..........##
....把内核空间的线性地址转换为物理地址
....E'8#................' 30B@@"=
....把物理地址转化为线性地址
....E'85............5'H' 630B@@"=
..
.... 是页表项值,通过 ##8 得到其对应的物理页框号,最后通过 #8# 得到对应
的物理页描述符
....E'8##............#8###8
....如果对应的表项值为 ,返回
....E'8#............I#
.... 是页表项值,右移 位后得到其对应的物理页框号
....E'8##8........' # JJ30"?;@=
根据页框号和页表项的属性值合并成一个页表项值
....E'8#8##81#....##8KK30"?;@=L##5 #
....根据页框号和页表项的属性值合并成一个中间表项值
....E'8#8#('#81#..#('#8KK30"?;@=L##5 #
....向一个表项中写入指定的值
....E'8###1#5 ........H##<#5
....E'8#(##1#5 ..###1#5
....E'8#('#('#1#('5 ......H#('#<#('5
....E'8#'#'#1#'5 ......H#'#<#'5
....根据线性地址得到高 位值,也就是在目录表中的索引
....E'8#''''''JJ30*;:"?;@=%3=:"3:30*
....根据页描述符和属性得到一个页表项值
....E'8(7##1##....#8###8#1##
内核页表的初始化
内核在进入保护模式前,还没有启用分页功能,在这之前内核要先建立一个临时内核页表,
因为在进入保护模式后,内核继续初始化直到建
立完整的内存映射机制之前,仍然需要用到页表来映射相应的内存地址。临时页表的初始
化是在 $+$7 $'" 中进行的:
###' 是临时页全局目录表,它是在内核编译过程中静态初始化的
# 是第一个页表开始的地方,它也是内核编译过程中静态初始化的
内核通过以下代码建立临时页表:
C=:M#
....NNNN
$H得到开始目录项的索引,从这可以看出内核是在 ###' 的 O+ 个表项开始进行
建立的,其对应的线性地址就是 以上的地
址,也就是内核在初始化它自己的页表H$
........##'88<30B@@"=JJP
$H# 地址在内核编译的时候,已经是加上 了,减去 得到对应的
物理地址H$
........(5 9#30B@@"=1Q'
$H将目录表的地址传给 ',表明内核也要从 开始建立页表,这样可以保证
从以物理地址取指令到以线性地址在系统空间取指令
的平稳过渡,下面会详细解释H$......
........(5 9###'30B@@"=1Q'..
........(5 9O1Q..........
........ OQ'1Q......
........5 Q1Q'
........(5 Q1##'88Q'
........'' 9/1Q'
........(5 9/1Q
........ ..'' 91Q
........ #&
........$H内核到底要建立多少页表,也就是要映射多少内存空间,取决于这个判断条件。在
内核初始化程中内核只要保证能映射到包括内
核的代码段,数据段,初始页表和用于存放动态数据结构的 7 大小的空间就行H$
........ ;C;=3RMBC*C*6OQ'1Q&#
........(# QQ
........S&&
........(5 Q'1#& '30B@@"=
在上述代码中,内核为什么要把用户空间和内核空间的前几个目录项映射到相同的页表中
去呢,虽然在 '" 中内核已经进入保护模式,但是
内核现在是处于保护模式的段式寻址方式下,因为内核还没有启用分页映射机制,现在都
是以物理地址来取指令,如果代码中遇到了符号地址
,只能减去 才行,当开启了映射机制后就不用了现在 # 中的取指令指针 #
仍指向低区,如果只建立内核空间中的映射,那么当
内核开启映射机制后,低区中的地址就没办法寻址了,应为没有对应的页表,除非遇到某
个符号地址作为绝对转移或调用子程序为止。因此
要尽快开启 234 的页式映射机制
(5 9###'30B@@"=1Q
........(5 Q1Q..........$H 控制寄存器保存的是目录表地址H$
........(5 Q1Q..........$H向 的最高位置 来开启映射机制H$
........ 91Q
........(5 Q1Q
........ S(#9RBB=2"198....$H2 #8'( Q#H$
........ 71Q#
通过 S(#9RBB=2"198 这条指令使 234 进入了系统空间继续执行因为RBB=2" 是
个符号地址,地址在 以上。
在 '" 完成了内核临时页表的建立后,它继续进行初始化,包括初始化 ;C;=="T,也
就是系统开启后的第一个进程P建立完整的中断处理程
序,然后重新加载 0*= 描述符,最后跳转到 $( 中的 7 函数继续初始化
内核页表的完整建立
内核在 7 中继续做第二阶段的初始化,因为在这个阶段中,内核已经处于保护
模式下,前面只是简单的设置了内核页表,内核
必须首先要建立一个完整的页表才能继续运行,因为内存寻址是内核继续运行的前提。
#& 的代码在 (($ 中:
U7 J#J#J#& >
为了简单起见,我忽略了对 3 选项的支持。
5'#& 5'
F
......NN
........#'H#'&<###'P
........NN
........7 #V (###'&P
........NN
G
在这个函数中 #'& 变量指 向 了 ###' , 这 正 是 内 核 目 录 表 的 开 始 地 址 ,
#& 函数在通过
7 #V (##函数完成内核页表的完整建立。
7 #V (## 函数同样在 (($ 中,我略去了与 3 模式相关的代码:
5'7 #V (###'H#'&
F
........' #8P
........#'H#'P
........#('H#('P
........#H#P
........#''1#(''1#8P
........#''<#''30B@@"=P
........#'<#'&6#''P
........#8<P
........8P#''K3=:"3:30*P#'661#''66F
................#('<('& #'P
................8#8J<( #8
........................P
................8 #('' <P #('' K3=:"3:3* %% #8 K( #8P #('661
#(''66F
................'''<#8H30";W630B@@"=P
剩余47页未读,继续阅读
资源评论
- zoloswj2014-01-07资料不错,结合代码看效果更好
rikersun
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- NetOps-py通过sftp替换网络设备启动文件
- STM32单片机FPGA毕设电路原理论文报告任务驱动教学法在单片机课程教学中的应用
- STM32单片机FPGA毕设电路原理论文报告任务驱动法在单片机教学中的应用
- STM32单片机FPGA毕设电路原理论文报告人造金刚石压机智能化压力测控系统设计
- 以某列为依据匹配多项(Excel版)
- STM32单片机FPGA毕设电路原理论文报告人体短臂离心机实验台的显示控制系统
- STM32单片机FPGA毕设电路原理论文报告人工气候室监控系统的环境控制器研究
- STM32单片机FPGA毕设电路原理论文报告染整自动线张力控制系统的设计
- 数据挖掘与机器学习-实验
- 基于Linux系统Nginx的动态网站的LNMP环境源码包
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功