免费注册 查看新帖 |

Chinaunix

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

关于oops打印段寄存器的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-25 15:35 |只看该作者 |倒序浏览
sysrq+p 可以看到寄存器,发现一个问题:

X86 平台 32位下:
当正处于内核态时 打印出来

[17403.806692] EIP: 0060:[<c100b408>] EFLAGS: 00000246 CPU: 0
[17403.806698] EIP is at mwait_idle+0x78/0x200
[17403.806700] EAX: 00000000 EBX: c19ae4bc ECX: 00000000 EDX: 00000000
[17403.806702] ESI: 00000000 EDI: c1963000 EBP: 01d46003 ESP: c1961fcc
[17403.806705]  DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068

当正处于用户态时 打印出来的
Pid: 3169, comm: knotify4 Not tainted 3.1.0-1.3-desktop-mod #1 System manufacturer System Product Name/P5B-Deluxe
[17548.158737] EIP: 0073:[<b61caab9>] EFLAGS: 00000282 CPU: 0
[17548.158741] EIP is at 0xb61caab9
[17548.158742] EAX: 00000000 EBX: b63a9ff4 ECX: bfe84130 EDX: 00000001
[17548.158744] ESI: bfe84178 EDI: 0000448c EBP: 08090a20 ESP: bfe84120
[17548.158746]  DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 007b


发现无论是在用户态还是内核态 DS 都是0x7b ,我根据arch/x86/include/asm/segment.h 查了下发现32位下 __KERNEL_CS=0X60,__KERNEL_DS=0X68,__USER_DS=0X7B,__USER_CS=0X73
所以当处于内核态时按下sysrq+p 应该DS:0068 才对  。 难道是打印的时候内核还没有切换DS ?

对于X86_64 64位 下 状况更奇怪 。根据segment.h ,应该 __KERNEL_CS=0X10, __KERNEL_DS=0X18, __USER_DS=0X2B ,__USER_CS=0X33 才对。但结果是:

用户态下:
RIP: 0033:[<偏移>]
.......
CS:0010  DS: 0000
看样子全乱套



内核态下:
RIP: 0010:[<偏移>]
.......
CS:0010 DS: 0000

DS 为全0

我有点搞不懂了, 这是sysrq+p 不准 ,还是怎么回事   谁能解释一下 ?

论坛徽章:
0
2 [报告]
发表于 2011-12-26 10:47 |只看该作者
可以确定的是在内核里面其实也是可以使用__USER_DS 的,有的还需要自己给改了。
其他坐等高手了,呵呵:wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP