Linux内核学习 第四周 系统调用与内核

操作系统为用户态进程与硬件设备进行交 互提供了一组接口——系统调用
系统调用完成了下述功能:
a.把用户从底层的硬件编程中解放出来
b.极大的提高了系统的安全性
c.使用户程序具有可移植性
    我们在编程时通过系统调用可以避免直接对硬件以及内核部分内存的访问。这样可以避免大多数的认为失误导致的系统挂掉,大大增加了系统的安全性。
    系统调用的访问是通过内核软中断与内核进行交互的,每一个系统调用都有一个明确的系统调用号,当应用程序进行系统调用时,就会根据此系统调用号与内核进行连接。系统调用的流程如下:
    a.当用户态进程调用一个系统调用时, CPU切换到内核态并开始执行一个内核函数。
    b.在Linux中是通过执行int $0x80来执行系统调用的,这条汇编指令产生向量为128的编程异常.



下面分析一个系统调用的例子:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. //stat 106
  7. int main(void)
  8. {
  9.     struct stat myst;
  10.     int ret = 0;
  11.     char *p = "/root";
  12.     struct stat *pst = &myst;

  13. #if 1

  14.     ret = stat(p, pst);
  15.     if(ret == 0){
  16.         printf("%s|%d, Get stat ok!\n", __func__, __LINE__);
  17.     }else
  18.         printf("%s|%d,Get stat failed!\n", __func__, __LINE__);

  19. #else
  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.     printf("ret:%d\n",ret);
  30.     if(ret == 0){
  31.         printf("%s|%d, Get stat ok!\n", __func__, __LINE__);
  32.     }else
  33.         printf("%s|%d,Get stat failed!\n", __func__, __LINE__);
  34. #endif
  35.         

  36.     return 0;

  37. }
我们可以通过14行来运行不同的代码。
 通过man手册可以查看到stat函数的功能,我们在这里只进行传参、返回值的分析。我们直接进入到内嵌汇编部分分析,stat函数有两个参数,第一个是文件系统节点路径,第二个参数是传出参数,但是我们在汇编代码中,使用的是传入一个指针,stat函数将会把获取的值放入到指针指向的内存中。两个参数的使用如下:
           

点击(此处)折叠或打开

  1. "mov %1,%%ebx\n\t"
  2. "mov %2,%%ecx\n\t"
  3. "mov $106, %%eax\n\t"
  4. "int $0x80\n\t"
  5. "mov %%eax,%0\n\t"
  6. :"=m"(ret)
  7. :"b"(p),"c"(pst)
     1-完成stat函数的第一个参数;
    2-完成第二个参数的写入。
    7-输入参数值。
传完参数后,将stat函数的系统调用号传入到eax中,然后通过int &0x80执行系统调用。
系统调用号查询:http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl
运行截图:



作者程大鹏, 转载请注明出处    http://blog.chinaunix.net/blog/post.html
Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 ”
                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值