Chinaunix首页 | 论坛 | 博客
  • 博客访问: 150387
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-09 13:04
个人简介

人若是没有理想,那跟咸鱼有什么区别!

文章分类

全部博文(24)

文章存档

2018年(1)

2017年(2)

2016年(8)

2015年(11)

2014年(2)

我的朋友

分类: LINUX

2016-03-27 23:15:50

        Linux 系统调用(SCI,system call interface)的实现机制实际上是一个多路汇聚以及分解的过程,该汇聚点就是 0x80 中断这个入口点(X86 系统结构)。也就是说,所有系统调用都从用户空间中汇聚到 0x80 中断点,同时保存具体的系统调用号。当 0x80 中断处理程序运行时,将根据系统调用号对不同的系统调用分别处理(调用不同的内核函数处理)。
        
        我们先在文件系统中加入上次课程使用的命令:stat。(http://blog.chinaunix.net/uid-29798130-id-5679169.html)
编辑文件:test.c

点击(此处)折叠或打开

  1. int Stat_self()
  2. {
  3.     struct stat myst;
  4.     int ret = 0;
  5.     char *p = "/root";
  6.     struct stat *pst = &myst;

  7.     ret = stat(p, pst);
  8.     if(ret == 0){
  9.         printf("%s|%d, Get stat ok!\n", __func__, __LINE__);
  10.     }else
  11.         printf("%s|%d,Get stat failed!\n", __func__, __LINE__);

  12.     return 0;
  13. }
  14. int Stat_self_asm()
  15. {
  16.     struct stat myst;
  17.     int ret = 0;
  18.     char *p = "/root";
  19.     struct stat *pst = &myst;

  20.     asm volatile(
  21.                 "mov %1,%%ebx\n\t"
  22.                 "mov %2,%%ecx\n\t"
  23.                 "mov $106, %%eax\n\t"
  24.                 "int $0x80\n\t"
  25.                 "mov %%eax,%0\n\t"
  26.                 :"=m"(ret)
  27.                 :"b"(p),"c"(pst)
  28.     );
  29.     if(ret == 0){
  30.         printf("%s|%d, Get stat ok!\n", __func__, __LINE__);
  31.     }else
  32.         printf("%s|%d,Get stat failed!\n", __func__, __LINE__);

  33.     return 0;
  34. }

  35. int main()
  36. {
  37.     PrintMenuOS();
  38.     SetPrompt("MenuOS>>");
  39.     MenuConfig("version","MenuOS V1.0(Based on Linux 3.18.6)",NULL);
  40.     MenuConfig("quit","Quit from MenuOS",Quit);
  41.     MenuConfig("time","Show System Time",Time);
  42.     MenuConfig("time-asm","Show System Time(asm)",TimeAsm);
  43.     MenuConfig("stat","Show /root get status",Stat_self);
  44.     MenuConfig("stat-asm","Show /root get status(asm)",Stat_self_asm);
  45.     ExecuteMenu();
  46. }
    
    此时新编译的文件系统就可以输入stat、stat-asm命令,输出结果如下:




实际调用的整个流程如下:



从服务提供者的角度来看Linux系统,可以将内核视为一个综合性的库,它包含了各种可面向用户应用程序提供的功能。系统调用是应用程序与该库之间的接口,因此了解系统调用的工作方式无论对于研究内核还是系统编程都是颇有益处的。


作者程大鹏, 转载请注明出处    http://blog.chinaunix.net/blog/post.html
Linux内核分析》MOOC课程 ”
阅读(1949) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~