- 论坛徽章:
- 0
|
linux 3.16-rc2 X86_64架构
下面是我的修改步骤,发现有些问题:
1. 将内核自带的汇编实现memcpy注释掉
linux-3.16-rc2\arch\x86\lib\memcpy_64.S
将
- ENTRY(__memcpy)
- ENTRY(memcpy)
- ...
- CFI_ENDPROC
- ENDPROC(memcpy)
- ENDPROC(__memcpy)
复制代码 改为
- ENTRY(__memcpy)
- ENTRY(x86_memcpy)
- ...
- CFI_ENDPROC
- ENDPROC(x86_memcpy)
- ENDPROC(__memcpy)
复制代码 2. 在内核通用memcpy实现函数中加钩子
linux-3.16-rc2\lib\string.c
将
- #ifndef __HAVE_ARCH_MEMCPY
- void *memcpy(void *dest, const void *src, size_t count)
- {
- char *tmp = dest;
- const char *s = src;
- while (count--)
- *tmp++ = *s++;
- return dest;
- }
- #endif
复制代码 改为
- //#ifndef __HAVE_ARCH_MEMCPY
- void *memcpy(void *dest, const void *src, size_t count)
- {
- char *tmp = dest;
- const char *s = src;
- my_hook();
- while (count--)
- *tmp++ = *s++;
- return dest;
- }
- //#endif
复制代码 在mm目录新加一个文件,测试memcpy的回调是否生效:
linux-3.16-rc2\mm\memcpy_test.c
- #include <linux/mm.h>
- #include <linux/kallsyms.h>
- #include <linux/module.h>
- int hook_value = -1;
- int test_begin = 0;
- void my_test_begin(void)
- {
- char src[128] = {0};
- char dst[128] = {1};
- test_begin = 1;
- mb();
- memcpy((char*)dst,(char*)src,50);
- test_begin = 0;
- mb();
- printk("hook value:%d\n",hook_value);
- }
- void my_hook(void)
- {
- if(test_begin)
- hook_value=1;
- }
复制代码 打印发现hook_value仍然是-1,my_hook赋值没有生效,大家帮看看哪里有问题不?thx |
|