免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3453 | 回复: 18
打印 上一主题 下一主题

求2.6下调用适合SMP找sys_call_tab[]的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-26 16:37 |只看该作者 |倒序浏览
代码如下:
  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("read\n");
  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 %p\n", 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 module\n");

  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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-07-26 16:54 |只看该作者
怎么没人来啊.急啊

论坛徽章:
208
巨蟹座
日期:2013-09-02 09:16:36卯兔
日期:2013-09-02 20:53:59酉鸡
日期:2013-09-05 21:21:45戌狗
日期:2013-10-15 20:51:17寅虎
日期:2013-10-18 21:13:16白羊座
日期:2013-10-23 21:15:19午马
日期:2013-10-25 21:22:48技术图书徽章
日期:2013-11-01 09:11:32双鱼座
日期:2013-11-01 20:29:44丑牛
日期:2013-11-01 20:40:00卯兔
日期:2013-11-11 09:21:32酉鸡
日期:2013-12-04 19:56:39
3 [报告]
发表于 2006-07-26 18:33 |只看该作者
dmesg
printk的显示级别必须大于console log的接别才可以显示到console上

论坛徽章:
0
4 [报告]
发表于 2006-07-26 19:16 |只看该作者
原帖由 流氓无产者 于 2006-7-26 18:33 发表
dmesg
printk的显示级别必须大于console log的接别才可以显示到console上


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

论坛徽章:
5
5 [报告]
发表于 2006-07-27 10:47 |只看该作者
原帖由 lonelyair 于 2006-7-26 19:16 发表


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


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

论坛徽章:
0
6 [报告]
发表于 2006-07-27 12:50 |只看该作者
结果已经出来了,我的MAKEFILE里面有空格,所以在执行的时候就会停止,但是不会报错.


谢谢楼上的见意.

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

论坛徽章:
0
7 [报告]
发表于 2006-07-27 14:10 |只看该作者
怎么没有module_init()与module_exit()?

论坛徽章:
0
8 [报告]
发表于 2006-07-27 14:23 |只看该作者
上面的代码我已经改了.请多注意下

论坛徽章:
0
9 [报告]
发表于 2006-07-27 20:07 |只看该作者
2.6中sys_call_table[] 已经不是默认导出的全局变量了吧?
那么这个模块加载后,应该会遇到未定义的symbol吧?我感觉

论坛徽章:
0
10 [报告]
发表于 2006-07-28 09:13 |只看该作者
原帖由 bitzilla 于 2006-7-27 20:07 发表
2.6中sys_call_table[] 已经不是默认导出的全局变量了吧?
那么这个模块加载后,应该会遇到未定义的symbol吧?我感觉

是没有导出了,所以才自己来找,用以下这个函数:
  1. sys_call_table = find_sys_call_table();
复制代码

上面帖子里就能找到这个代码,编译也是没问题的,就是insmod 以后会死机.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP