Chinaunix

标题: 内核2.6.28下获取sys_call_table的问题 [打印本页]

作者: guotie    时间: 2009-05-26 10:43
标题: 内核2.6.28下获取sys_call_table的问题
问题1:
在2.6.24和2.6.28内核下,使用下面函数获取到的sys_call_table与System.map中的不一致,而与/proc/kallsyms一致。

grep sys_call_table /proc/kallsysms
c04ed700 R sys_call_table

grep sys_call_table /usr/src/linux-2.6.28.7/System.map
c12ed700 R sys_call_table

获取sys_call_table的函数如下:
unsigned int get_sys_call_table(void)
{
unsigned int sys_call_off;
unsigned int sys_call_table;
char* p;
int i;

asm("sidt %0":"=m"(idtr));
printk("addr of idtr: 0x%x\n", (unsigned int)&idtr);

memcpy(&idt, (void *)(idtr.base+8*0x80), sizeof(idt));
sys_call_off=((idt.off2<<16)|idt.off1);
printk("addr of idt 0x80: 0x%x\n", sys_call_off);

p=(char *)sys_call_off;
for (i=0; i<100; i++)
{
if (p=='\xff' && p[i+1]=='\x14' && p[i+2]=='\x85')
{
sys_call_table=*(unsigned int*)(p+i+3);
printk("addr of sys_call_table: 0x%x\n", sys_call_table);
return sys_call_table;
}
}
return 0;
}
使用该函数获取的sys_call_table地址为c04ed700

问题2:在linux 2.6.28内核下,使用上面get_sys_call_table获取的sys_call_table地址时,在下面的语句出现oops:
sys_call_table[__NR_test_syscall] = (long)test_syscall;
在2.6.24下,工作正常

请问有人遇到该情况吗?如何解决的?
谢谢!
作者: bobozhang    时间: 2009-05-26 15:28
这玩意你去内核版问赛
作者: r2r4    时间: 2009-05-26 15:42
检查你的 uname -p
我记得这个特征串是x86 32位的
作者: guotie    时间: 2009-05-26 16:08
i686




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2