天下网吧 >> 网吧天地 >> 网吧技术 >> 网吧系统 >> 正文

系统应用之Linux操作系统的内核解读入门

2012-9-13不详佚名

67444">

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

  #include

  #include

  _syscall1(int,addtotal,int, num)

  main()

  {

  int i,j;

  do

  printf("Please input a number ");

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

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

  printf("Error occurred in syscall-addtotal(); ");

  printf("Total from 0 to %d is %d  ",i,j);

  }

  对修改后的新的内核进行编译,并引导它作为新的操作系统,运行几个程序后可以发现一切正常;在新的系统下对测试程序进行编译(*注:由于原内核并未提供此系统调用,所以只有在编译后的新内核下,此测试程序才能可能被编译通过),运行情况如下:

  $gcc -o test test.c

  $./test

  Please input a number

  36

  Total from 0 to 36 is 666

  可见,修改成功;而且,对相关源码的进一步分析可知,在此版本的内核中,从/usr/src/linux/arch/i386/kernel/entry.S文件中对 sys_call_table 表的设置可以看出,有好几个系统调用的服务例程都是定义在/usr/src/linux/kernel/sys.c 中的同一个函数:

  asmlinkage int sys_ni_syscall(void)

  {

  return -ENOSYS;

  }

  例如第188项和第189项就是如此:

  ...   ...

  .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 */

  ... ...


本文来源:不详 作者:佚名

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系email:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行