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