Chinaunix首页 | 论坛 | 博客
  • 博客访问: 583209
  • 博文数量: 137
  • 博客积分: 4040
  • 博客等级: 上校
  • 技术积分: 1584
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-08 13:05
文章分类

全部博文(137)

文章存档

2011年(10)

2010年(23)

2009年(104)

分类: LINUX

2009-06-01 15:27:59

这篇文章简单的介绍了如何为linux添加一个系统调用。
也就是为linux增加一个api函数。
   1: cd /usr/src/linux/kernel
   2: vi sys.c 并添加如下一个函数:
   asmlinkage int sys_mycall(int num) { return num;}
   3. cd /usr/src/linux/arch/i386/kernel
   4: vi entry.S 并添加如下代码
    在形如:ENTRY(sys_call_table)下添加如下:
   .long SYMBOL_NAME(sys_mycall)
   5. 在头文件中增加申明:
   cd /usr/include/asm
   vi unistd.h
    在形如:#define __NR_restart_syscall  0  下添加如下:
   添加: #define __NR_mycall 222
  ---------------------------------------
  OK , 以下开始编译内核。
   make mrproper
   make menuconfig
   make dep
   make bzImage
   make modules
   make modules_install
  编译完成后,将新内核文件和新的系统符号表拷贝到/boot目录,如下:
   cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage-new
   cp /usr/src/linux/System.map /boot/System.map-new
   然后将System.map-new,软链接到/boot/System.map,如下:
   ln -sf /bbot/System.map-new /boot/System.map
  下面开始配置lilo(/etc 目录下):
   新lilo.conf文件如下:
   default = linux-new
   image = /boot/bzImage-2.4.7
   label=linux-new
   ..........(略)
  然后使用超级用户运行 /sbin/lilo
  好,重新启动 。 reboot
  重新启动机器后,我们来编写一个测试程序来调用我们刚才添加的api。如下test.c:
   #include ///-----看见这里了吧
   _syscall1(int,mycall,int,ret) //// 申明系统调用
  main()
  {
  printf("%d \n",mycall(100));
  }
  存盘编译。
  gcc -o test test.c
  编译好运行。
 
    说明:虽然添加一个系统调用并不是太复杂,但我们并不提倡这样做,因为还有更好的方法来代替系统调用 。
    1、创建一个设备节点,通过read()、write()来访问,通过ioctl()来控制。
    2、一些接口如信号量,可以用文件描述符来操作。
    3、把增加的信息作为一个文件放在sysfs的合适位置。
阅读(3131) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~