求2.6下调用适合SMP找sys_call_tab[]的方法

发布于 2022-07-25 06:32:56 字数 2951 浏览 18 评论 9

代码如下:

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/file.h>
  5. #include <linux/fs.h>
  6. #include <linux/sched.h>
  7. #include <linux/syscalls.h>
  8. #include <linux/time.h>
  9. #include <asm/unistd.h>
  10. MODULE_LICENSE("GPL");
  11. unsigned long **sys_call_table;
  12. ssize_t (*read)(int f, const void *buf, size_t n);
  13. unsigned long **find_sys_call_table(void) {
  14.     unsigned long **sctable;
  15.     unsigned long ptr;
  16.     extern int loops_per_jiffy;
  17.     sctable = NULL;
  18.     for (ptr = (unsigned long)&loops_per_jiffy;
  19.         ptr < (unsigned long)&boot_cpu_data; ptr += sizeof(void *)){
  20.    
  21.         unsigned long *p;
  22.         p = (unsigned long *)ptr;
  23.         if (p[__NR_close] == (unsigned long) sys_close){
  24.             sctable = (unsigned long **)p;
  25.             return &sctable[0];
  26.         }
  27.     }
  28.     return NULL;
  29. }
  30. ssize_t loggingread(int fd, const void *buf, size_t n) {
  31.      printk("readn");
  32.     return read(fd, buf, n);
  33. }
  34. static int __init readlog_init(void) {
  35.     sys_call_table = find_sys_call_table();
  36.         printk(KERN_INFO "Loading readlog module, sys call table at %pn", sys_call_table);
  37.     read = (void *) (sys_call_table[__NR_read]);
  38.     sys_call_table[__NR_read] = (void *) loggingread;
  39.         return 0;
  40. }
  41. static void __exit readlog_exit(void) {
  42.         printk(KERN_INFO "Unloading readlog modulen");
  43.     sys_call_table[__NR_read] = (void *) read;
  44. }
  45. module_init(readlog_init);
  46. module_exit(readlog_exit);

复制代码

Makefile如下:

  1. bj-m := test.o
  2. KDIR := /lib/modules/$(shell uname -r)/build
  3. PWD := $(shell pwd)
  4. default:
  5.            $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

复制代码

调试insmod test.ko就死机,不知道怎么办,不是很懂代码?

[ 本帖最后由 lonelyair 于 2006-7-31 12:44 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

静待花开 2022-07-25 11:40:45

原帖由 bitzilla 于 2006-7-27 20:07 发表
2.6中sys_call_table[] 已经不是默认导出的全局变量了吧?
那么这个模块加载后,应该会遇到未定义的symbol吧?我感觉

是没有导出了,所以才自己来找,用以下这个函数:

  1. sys_call_table = find_sys_call_table();

复制代码
上面帖子里就能找到这个代码,编译也是没问题的,就是insmod 以后会死机.

日裸衫吸 2022-07-25 11:40:27

2.6中sys_call_table[] 已经不是默认导出的全局变量了吧?
那么这个模块加载后,应该会遇到未定义的symbol吧?我感觉

生生不灭 2022-07-25 11:38:58

怎么没有module_init()与module_exit()?

愚人国度 2022-07-25 11:38:58

上面的代码我已经改了.请多注意下

君勿笑 2022-07-25 11:33:49

结果已经出来了,我的MAKEFILE里面有空格,所以在执行的时候就会停止,但是不会报错.

谢谢楼上的见意.

还想问个问题,在2.6下面能不能介绍下好用调用sys_call_tab[]的方法?

夏天碎花小短裙 2022-07-25 11:20:14

原帖由 lonelyair 于 2006-7-26 19:16 发表

这个程序现在没有生成.ko文件,所以还不能用dmesg
不过想问下,printk的显示级别能改动吗?

printk("<0>
printk("<2>
...
printk(KERN_EMERG
printk(KERN_ALERT
...

三生殊途 2022-07-25 10:06:11

原帖由 流氓无产者 于 2006-7-26 18:33 发表
dmesg
printk的显示级别必须大于console log的接别才可以显示到console上

这个程序现在没有生成.ko文件,所以还不能用dmesg
不过想问下,printk的显示级别能改动吗?

梦开始←不甜 2022-07-25 07:23:39

dmesg
printk的显示级别必须大于console log的接别才可以显示到console上

风流物 2022-07-25 06:48:28

怎么没人来啊.急啊

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文