Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1945514
  • 博文数量: 383
  • 博客积分: 10011
  • 博客等级: 上将
  • 技术积分: 4061
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-24 18:53
文章分类

全部博文(383)

文章存档

2011年(1)

2010年(9)

2009年(276)

2008年(97)

我的朋友

分类: LINUX

2008-12-10 19:08:58

    由于传统的添加自己的系统调用的方法,需要重新编译内核,比较浪费时间,尤其是有错误时更是不便调试.本文将呈现采用模块动态加载的方法添加自己的系统调用.
   本实验已在RedHat9.0下试验成功.
   模块代码为: 
   /******** syscall.c **************/
   #include
   #include
   #include
   #include
   #include
   #include
   #define __NR_mysyscall 253
   extern void *sys_call_table[];
   asmlinkage int  sys_mysyscall()
  {   
       printk("\nHello world!\n");
       return 0;
  }
  static int __init syscall_init(void)
  {  
       sys_call_table[__NR_mysyscall]=sys_mysyscall;
       printk("\n******************************\n");
       printk("mysyscall() loaded success!\n");
       printk("sys_call_table addr:0x%lx\n",(unsigned long)   sys_call_table);
       printk("sys_mysyscall() addr:0x%lx\n",(unsigned long)&sys_call_table[__NR_mysyscall]);
       printk("syscall number: %ld\n",((unsigned long)&sys_call_table[__NR_mysyscall]-(unsigned long)sys_call_table)/4);
       return 0;
}
   static void __exit syscall_exit(void)
  {
       printk("\nexit the mysyscall()!\n");
       printk("******************************\n");
  }
  module_init(syscall_init);
  module_exit(syscall_exit);
  MODULE_LICENSE("GPL");

  相应的测试程序:
  /********** test.c ***************/
 
   #include
   #include
   #define __NR_testsyscall 253
   _syscall0(int,testsyscall)
 
    int  main()
    {   int i;
       i= testsyscall();
       printf("i=%d\n",i);
     
       return 0;
    }

   我所用的Makefile:
   INCLUDE=/usr/src/linux/include
   CFLAGS=-g -Wall -D__KERNEL__ -DMODULE  -I $(INCLUDE)
   syscall.o:syscall.c
           gcc $(CFLAGS) -c syscall.c -o syscall.o

   然后, make生成 syscall.o,再 insmod syscall.o 将其加载到内核.
   最后编译test.c,生成可执行文件test, 运行测试.
   用dmesg查看进程希望,若成功输出:  hello world!
   则表示实验成功!
 
   实验虽然简单,但仍可体现采用模块添加自己的系统调用的方法.希望对浏览此文的同道中人有所帮助.





阅读(926) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~