Linux内核分析

Linux系统调用窥探

2017-03-19  本文已影响46人  athorn

陈松 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

原来自己多年来一直使用的库函数竟有如此复杂的机制。这个机制的设计者思考的如此深入,屏蔽了底层硬件的差异,也是费劲心思地为了安全考虑设计了内核态和用户态。

突然想到一个问题,是不是说基本上所有的操作系统都提供了类似的机制来达到我们要求的以上的特性?
如流行的Vxworks、uCos、FreeRTos?是否需要硬件提供相应的支持?

至于为什么这样设计,随着课程的深入想必会有更深的理解。

  • 通过中断(int 0x80)来实现;
int Getpid(int argc, char **argv)
{
    pid_t pid;
    pid = getpid();
    printf("current process's pid:%d\n",pid);
    return 0;
}

汇编版本:

int GetpidAsm(int argc, char **argv)
{
    pid_t pid;
    asm volatile(
    "mov $20, %%eax\n\t"
    "int $0x80\n\t"
    "mov %%eax, %0\n\t"
    :"=m"(pid)
    );
    printf("current process's pid(ASM):%d\n",pid);
    return 0;
}

代码截图:

实验效果:

如果直接在本地虚拟机上编译运行的话,更加直观了,代码如下:

#include <stdio.h>
#include <string.h>
#include "unistd.h"

int Getpid(void)
{
    pid_t pid;
    pid = getpid();
    printf("current process's pid:%d\n",pid);
    return 0;
}

int GetpidAsm(void)
{
    pid_t pid;
    asm volatile(
    "mov $20, %%eax\n\t"
    "int $0x80\n\t"
    "mov %%eax, %0\n\t"
    :"=m"(pid)
    );
int main()
{
    unsigned  char c;
    do
    {
     printf("getpid:pls input 1 to call C edition or 2 to call asm edition.\n");
     c = getchar();
    }
    while(c <'1'|| c > '2' );
    switch(c)
    {
    case '1':
       Getpid();
       break;
    case '2':
        GetpidAsm();
        break;
    default:
        break;
    }
}

结果如下:

在这个系统调用的实现中,唯一需要传递的参数便是系统调用号:20,不需要其他参数的传递,比较简单。

上一篇 下一篇

猜你喜欢

热点阅读