解读linux内核源码的入门方法(下)

文章作者 100test 发表时间 2007:03:14 16:20:34
来源 100Test.Com百考试题网


  【三】 对内核源码的修改:

  1.在kernel/sys.c中增加系统服务例程如下:

  asmlinkage int sys_addtotal(int numdata)

{

  int i=0,enddata=0.

  while(i<=numdata)

  enddata =i .

  return enddata.

  }

  该函数有一个 int 型入口参数 numdata , 并返回从 0 到 numdata 的累加值.

  当然也可以把系统服务例程放在一个自己定义的文件或其他文件中,只是要在相应文件中作必要的说明;

  2.把 asmlinkage int sys_addtotal( int) 的入口地址加到sys_call_table表中:

  arch/i386/kernel/entry.S 中的最后几行源代码修改前为:

  ... ...

  _NAME(sys_sendfile)

  .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */

  .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */

  .long SYMBOL_NAME(sys_vfork) /* 190 */

  .rept NR_syscalls-190

  .long SYMBOL_NAME(sys_ni_syscall)

  .endr

  修改后为: ... ...

  .long SYMBOL_NAME(sys_sendfile)

  .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */

  .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */

  .long SYMBOL_NAME(sys_vfork) /* 190 */

  /* add by I */

  .long SYMBOL_NAME(sys_addtotal)

  .rept NR_syscalls-191

  .long SYMBOL_NAME(sys_ni_syscall)

  .endr

  3. 把增加的 sys_call_table 表项所对应的向量,在include/asm-386/unistd.h

  中进行必要申明,以供用户进程和其他系统进程查询或调用:

  增加后的部分 /usr/src/linux/include/asm-386/unistd.h 文件如下:

  ... ...

  #define __NR_sendfile 187

  #define __NR_getpmsg 188

  #define __NR_putpmsg 189

  #define __NR_vfork 190

  /* add by I */

  #define __NR_addtotal 191

  4.测试程序(test.c)如下:

  #include

  #include

  _syscall1(int,addtotal,int, num)

  main()  

{

int i,j.

  do

  printf("Please input a number\n").

  while(scanf("%d",&.i)==EOF).

  if((j=addtotal(i))==-1)

  printf("Error occurred in syscall-addtotal().\n").

  printf("Total from 0 to %d is %d \n",i,j).

 }


相关文章


入门文章:教你学会编写Linux设备驱动之二
解读linux内核源码的入门方法(上)
入门文章:教你学会编写Linux设备驱动之结束篇
安装Linux应该了解的六个问题
解读linux内核源码的入门方法(下)
怎样让你的Linux用起来跟Windows无异
将.c文件更名时使用的完美脚本
新手入门:制作Linux启动盘的四种方法
Linux内核中的DeviceMapper机制(下)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛