免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 849 | 回复: 0
打印 上一主题 下一主题

由内核代码中测试A20想到的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-03 09:58 |只看该作者 |倒序浏览

                               
在内核代码中有这样的测试A20是否开启的代码
       xorl %eax,%eax
1:    incl %eax              #
check that A20 really IS enabled
       movl %eax,0x000000  # loop forever if it isn't
       cmpl %eax,0x100000
       je 1b

movl %eax,0x000000将ax的内容赋给内存地址为0x000000的内存单元,
cmpl %eax,0x100000比较0x100000内存单元的内容和eax是否相等

如果A20没有使能,则0x100000和0x000000指向相同的内存位置,是同一个内存单元,当然自己和自己相比较永远相等,故程序是个死循环。

如果A20使能的,则0x100000和0x000000指向不同的内存位置,但0x100000和0x000000内存单元中的内容有可能相同,但也只有一次相同,故用incl %eax来对内存单元0x000000写入不同的数,来与0x100000比较。

可以用同样的反法测试某条内存地址线损坏。

.section .data
output:
       .ascz “The adrress line ‘%d’ is good \n”
str:
       .ascz “A ll
are good\n”
.section .text
.globl _start
_start:
       movl $1,%ecx
       movl $1,%ebx

1:    xorl %eax,%eax
2:    incl %eax              
       movl %eax,0x00000000
       shll %ecx,%ebx
       cmpl %eax,%ebx
       je 2b
       pushl %ecx
       pushl $output
       call printf
       addl $8,%esp
       incl %ecx
       cmpl $32,%ecx
       jne 1b
       pushl  $31
       pushl $output
       call printf
       addl $8,%esp
       xorl %eax,%eax
3:    incl %eax              
       movl %eax,0x00000000     
       cmpl %eax,0x1
       je 3b
       pushl $str
       call printf
       addl $4,%esp
       pushl $0
       call exit
如果进入死循环说明此时的地址线损坏了,根据打印的信息分析可得具体损坏的地址,上面的程序只是说明个大概意思,需大量修改。
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/23070/showart_179553.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP