LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5254|回复: 17

2.6.8内核中通过模块添加系统调用,不用编译内核(原创)

[复制链接]
发表于 2005-3-17 13:06:18 | 显示全部楼层 |阅读模式
我在2.6.8中通过模块添加系统调用,发现了两个问题:
1.是sys_call_table的符号不可以被解析
2.除了283 所有的系统调用号都已经被占用 ,且没有空余。(要是想添加的系统调用号大于283,我们就要先改变unistd.h中的NR_syscalls 改的大一点,还要编译内核)

sys_call_table不可以被解析的问题 ,我通过直接调用他的地址0xc02b2600实现的

这是模块程序:
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/unistd.h>

#include<linux/time.h>

#include<asm/uaccess.h> // for copy_to_user
#include<linux/sched.h> // for current macro

#define __NR_pedagogictime 283

static int (*saved)(void);

static int sys_pedagogictime(struct timeval *tv)
{
        struct timeval ktv;
        do_gettimeofday(&ktv);
        copy_to_user(tv,&ktv,sizeof(ktv));
        printk(KERN_ALERT"ID %ld called sys_gettimeofday().\n",(long)current->pid);
        return 0;
}

int  syscall(void)
{
        long *systable;
        systable=(long*)0xc02b2600;
        saved=(int(*)(void))(systable[__NR_pedagogictime]);
        systable[__NR_pedagogictime]=(unsigned long)sys_pedagogictime;
        return 0;
}

void exit_syscall(void)
{
        unsigned long *systable;
        systable=( long*)0xc02b2600;
        systable[__NR_pedagogictime]=(unsigned long)saved;
}

module_init(syscall);
module_exit(exit_syscall);
                             

把上边这个模块编译成syscall.ko后 加载到内核我们就可以实用这个系统调用了

这是一个应用这个系统调用的程序
#include<linux/unistd.h>
#include<sys/time.h>
#define __NR_pedagogictime 283

_syscall1(int,pedagogictime,struct timeval *,thetime)
struct timeval tv;
int main()
{
        //struct timeval tv;

        pedagogictime(&tv);
        printf("tv_sec:%ld\n",tv.tv_sec);
        printf("tv_nsec:%ld\n",tv.tv_usec);

        printf("em...,let me sleep for 2 second.\n");
        sleep(2);
        pedagogictime(&tv);
        printf("tv_sec:%ld\n",tv.tv_sec);
        printf("tv_nsec:%ld\n",tv.tv_usec);
}

用dmesg可以看到系统调用的进程号@!
上边希望对大家的内核编程有所帮助!@?
:)
发表于 2005-3-17 20:50:30 | 显示全部楼层
不错,支持原创!
回复 支持 反对

使用道具 举报

发表于 2005-3-18 09:41:33 | 显示全部楼层
最近精华开始多了,兄弟们都在努力了
回复 支持 反对

使用道具 举报

发表于 2005-3-30 11:42:50 | 显示全部楼层
hello.c:25: `KERN_ALERT' undeclared (first use in this function)
我编译的时候怎么老是这个错误啊??<linux/kernel.h>我包含进去了啊,怎么??
回复 支持 反对

使用道具 举报

发表于 2005-3-30 16:50:56 | 显示全部楼层
你的make文件写得有问题.
我的:
PWD = $(shell pwd)
SRC = /usr/src/linux
obj-m := hello.o
module-objs := hello.o

default:
        make -C $(SRC) SUBDIRS=$(PWD) modules


clean:
        -rm -f *.o *.ko .*.cmd .*.flags *.mod.c
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-30 22:26:49 | 显示全部楼层
我没有贴我的makefile阿
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-30 22:28:57 | 显示全部楼层
看错了晕~~!·~!··¥·!#%删了
我的
回复 支持 反对

使用道具 举报

发表于 2005-3-31 08:07:07 | 显示全部楼层
呵呵,原来是我kernel的路径写错了,怪不得没有找到printk函数呢,谢谢!
希望楼主下次记得发Makefile,很多新人,我这样的,还不知道怎么编译呢,hoho!! :beat
回复 支持 反对

使用道具 举报

发表于 2005-9-26 13:22:55 | 显示全部楼层
请问楼主,你是怎样找到sys_call_table的地址呢。我用了网上几个找地址的代码,找到的都是用户太的地址,很是疑惑。请赐教啊
回复 支持 反对

使用道具 举报

发表于 2005-9-26 18:24:15 | 显示全部楼层
这么ugly实现也加精?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表