求助:x86_64上面的cr0清零的问题
{:3_198:} 系统是Linux localhost.localdomain 2.6.18-164.el5xen #1 SMP Tue Aug 18 15:59:52 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
通过网上查到拦截系统调用的方法,在获取系统调用表前先对cr0进行清零操作,就是如下:
- unsigned int clear_and_return_cr0(void)
- {
- unsigned long cr0 = 0;
- unsigned long ret;
- asm volatile ("movq %%cr0, %%rax"
- : "=a"(cr0)
- );
- ret = cr0;
- /* clear the 20 bit of CR0, a.k.a WP bit */
- cr0 &= 0xfffffffffffeffff;
- asm volatile ("movq %%rax, %%cr0"
- :
- : "a"(cr0)
- ); ///就这句!!!
- return ret;
- }
复制代码insmod后,系统就重启了。。。
入口函数如下
- static int init_sys_call_table(void)
- {
- int nRet=0;
- printk("<1>: ********************Just enter the myinit()...\n");
- unsigned long orig_cr0 = clear_and_return_cr0();
- /* sys_table = (unsigned long *) get_syscall_table_long();
- sys_table = (unsigned long)sys_table | 0xffffffff00000000;
- if (sys_table == 0){
- printk("sys_table == 0\n");
- return -1;
- }
- */
- setback_cr0(orig_cr0);
- printk( KERN_ALERT"the sys table is %x\n",sys_table );
- return 0;
- }
- 经过加log验证,问题是出在asm volatile ("movq %%rax, %%cr0"
- :
- : "a"(cr0)
- );
- 这句上,这句注释了,就能正常加载了,但注释后就达不到清0效果了
复制代码哪位大哥帮我看看啊,多多感谢啦
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
# asm volatile ("movq %%cr0, %%rax"
# : "=a"(cr0)
# );
cr0只有32位在64位系统上,但是rax是64位的,所以应该先XOR 清空rax,再将cr0保存到rax中。
static inline u64 clear_and_return_cr0(void)
{
u64 cr0 = 0;
u64 ret;
asm volatile ("movq %%cr0, %0"
: "=a"(cr0)
);
ret = cr0;
/* clear the 20 bit of CR0, a.k.a WP bit */
cr0 &= ~0x10000LL;
asm volatile ("movq %0, %%cr0"
:
: "a"(cr0)
);
return ret;
}
LS正解。LZ再把GCC内嵌汇编的语法好好看看吧。你的函数里只用了CR0, RAX寄存器,但是又搞个=A啥的,比较混乱
提供一下我这边遇到的情况,查看是否内核后缀有xen支持。例如2.6.18-164.el5xen操作cr0会有问题,2.6.18-164.el5则可以操作cr0.