
利用异常表处理Linux内核态缺页异常
发布时间:2006-10-23 12:10:21 来源:天极博客 网友评论 0 条那么为什么要通过.section定义独立的段呢?为了解开这个问题的答案,我们需要进一步看看我们所写的代码在可执行文件中是如何表示的。
$objdump --disassemble --section=.text hello hello: file format elf32-i386 Disassembly of section .text: 8048498: 8b 45 c4 mov 0xffffffc4(%ebp),%eax 804849b: 83 e0 03 and $0x3,%eax 804849e: 8b 55 c4 mov 0xffffffc4(%ebp),%edx 80484a1: 89 d1 mov %edx,%ecx 80484a3: c1 e9 02 shr $0x2,%ecx 80484a6: 8d 7d c8 lea 0xffffffc8(%ebp),%edi 80484a9: 8b 75 f4 mov 0xfffffff4(%ebp),%esi 80484ac: f3 a5 repz movsl %ds:(%esi),%es:(%edi) 80484ae: 89 c1 mov %eax,%ecx 80484b0: f3 a4 repz movsb %ds:(%esi),%es:(%edi) 80484b2: 89 c8 mov %ecx,%eax前面的hello.s中的汇编片断在可执行文件中就是通过上面的11条指定来表达,读者也许会问,由.section伪操作定义的段怎么不见了?别着急,慢慢往下看,由.section伪操作定义的段并不在正常的程序执行路径上,它们是被安排在可执行文件的其它地方了:
$objdump --disassemble --section=.fixup hello hello: file format elf32-i386 Disassembly of section .fixup: 08048530 <.fixup>: 8048530: 8d 4c 88 00 lea 0x0(%eax,%ecx,4),%ecx 8048534: e9 79 ff ff ff jmp 80484b2 <main+0x42>由此可见,.fixup是作为一个单独的段出现在可执行程序中的,而此段中所包含的语句则正好是和源程序hello.c中的两条语句相对应的。
将.fixup段和.text段独立开来的目的是为了提高CPU流水线的利用率。熟悉体系结构的读者应该知道,当前的CPU引入了流水线技术来加快指令的执行,即在执行当前指令的同时,要将下面的一条甚至多条指令预取到流水线中。这种技术在面对程序执行分支的时候遇到了问题:如果预取的指令并不是程序下一步要执行的分支,那么流水线中的所有指令都要被排空,这对系统的性能会产生一定的影响。在我们的这个程序中,如果将.fixup段的指令安排在正常执行的.text段中,当程序执行到前面的指令时,这几条很少执行的指令会被预取到流水线中,正常的执行必然会引起流水线的排空操作,这显然会降低整个系统的性能。
下面我们就可以看到异常表是如何形成的了:
$objdump --full-contents --section=__ex_table hello hello: file format elf32-i386 Contents of section __ex_table: 8048578 ac840408 30850408 b0840408 b2840408 ....0...........由于x86使用小尾端的编址方式,上面的这段数据比较凌乱。让我把上面的__ex_table中的内容转变成大家通常看到的样子,相信会更容易理解一些:
8048578 80484ac 8048530 80484b0 80484b2 ....0...........上面的红色部分就是我们最感兴趣的地方,而这段数据是如何形成的呢?将前面objdump生成的可执行程序中的汇编语句和hello.c中的源程序结合起来看,就可以发现一些有趣的东西了!
先让我们回头看看hello.c中__ex_table段的语句 .long 0b,3b。其中标签0b(b代表backward,即往回的标签0)是可能出现异常的指令的地址。结合objdump生成的可执行程序.text段的汇编语句可以知道标签0就是80484ac:
原始的汇编语句:
0: rep; movsl链接到可执行程序后:
80484ac: f3 a5 repz movsl %ds:(%esi),%es:(%edi)
- 微软官方入门教程19:轻松掌握Vista系统的快
- 微软2008大冲击,预借Vista SP1力促Vista市
- 在收件箱中获得 Windows Vista 的最新更新
- 微软官方Vista入门教程全集19篇(Vista学院
- Windows Vista 的成功将势不可挡
- 快快抛弃Vista,拥抱XP SP3!你觉得呢?
- 浅谈Vista系统关闭虚拟内存与使用内存盘加速
- 嘿嘿,按下键盘上面的三个键,马上让你的Vi
- Windows Vista的盗版率只有Windows XP的一半
- 3DMark和PCMark Vantage新版将只支持Vista系
- Windows外衣Linux心 红旗桌面版详测
- 扮酷你的桌面 Linux超靓壁纸下载(多图)
- Linux安装流程
- 浅谈Linux的内核
- RedHat Linux9.0安装实例(1)
- ARM的嵌入式Linux移植体验之基本概念
- Linux安装要点
- 红旗Linux桌面版5.0BETA版OS
- 如何在大硬盘上安装Linux
- RealPlayer流媒体播放器Linux版
- Linux步入Unix的后尘-铁甲Linux出现
- Linux内核中的同步和互斥分析报告
- Linux操作系统文件系统的桌面应用
- Linux设备驱动编程之定时器
- 嵌入式Linux操作系统启动信息完全注释
- 在Linux操作系统中实现内部进程通信
- Linux大腕警告称开源软件存在安全问题
- Linux下双网卡绑定技术实现负载均衡
- 深入浅出Linux操作系统的优化和微调
- Linux下的中文显示和支持常见问题解答
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
