求2.6下调用适合SMP找sys_call_tab[]的方法
代码如下:
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/file.h>
- #include <linux/fs.h>
- #include <linux/sched.h>
- #include <linux/syscalls.h>
- #include <linux/time.h>
- #include <asm/unistd.h>
- MODULE_LICENSE("GPL");
- unsigned long **sys_call_table;
- ssize_t (*read)(int f, const void *buf, size_t n);
- unsigned long **find_sys_call_table(void) {
- unsigned long **sctable;
- unsigned long ptr;
- extern int loops_per_jiffy;
- sctable = NULL;
- for (ptr = (unsigned long)&loops_per_jiffy;
- ptr < (unsigned long)&boot_cpu_data; ptr += sizeof(void *)){
- unsigned long *p;
- p = (unsigned long *)ptr;
- if (p[__NR_close] == (unsigned long) sys_close){
- sctable = (unsigned long **)p;
- return &sctable[0];
- }
- }
- return NULL;
- }
- ssize_t loggingread(int fd, const void *buf, size_t n) {
- printk("readn");
- return read(fd, buf, n);
- }
- static int __init readlog_init(void) {
- sys_call_table = find_sys_call_table();
- printk(KERN_INFO "Loading readlog module, sys call table at %pn", sys_call_table);
- read = (void *) (sys_call_table[__NR_read]);
- sys_call_table[__NR_read] = (void *) loggingread;
- return 0;
- }
- static void __exit readlog_exit(void) {
- printk(KERN_INFO "Unloading readlog modulen");
- sys_call_table[__NR_read] = (void *) read;
- }
- module_init(readlog_init);
- module_exit(readlog_exit);
复制代码
Makefile如下:
- bj-m := test.o
- KDIR := /lib/modules/$(shell uname -r)/build
- PWD := $(shell pwd)
- default:
- $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
复制代码
调试insmod test.ko就死机,不知道怎么办,不是很懂代码?
[ 本帖最后由 lonelyair 于 2006-7-31 12:44 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
是没有导出了,所以才自己来找,用以下这个函数:
复制代码
上面帖子里就能找到这个代码,编译也是没问题的,就是insmod 以后会死机.
2.6中sys_call_table[] 已经不是默认导出的全局变量了吧?
那么这个模块加载后,应该会遇到未定义的symbol吧?我感觉
怎么没有module_init()与module_exit()?
上面的代码我已经改了.请多注意下
结果已经出来了,我的MAKEFILE里面有空格,所以在执行的时候就会停止,但是不会报错.
谢谢楼上的见意.
还想问个问题,在2.6下面能不能介绍下好用调用sys_call_tab[]的方法?
printk("<0>
printk("<2>
...
printk(KERN_EMERG
printk(KERN_ALERT
...
这个程序现在没有生成.ko文件,所以还不能用dmesg
不过想问下,printk的显示级别能改动吗?
dmesg
printk的显示级别必须大于console log的接别才可以显示到console上
怎么没人来啊.急啊