0.笔记

本周进行了linux内核分析的第四周学习,对系统调用过程有了初步了解。撰写此文,记录学习同时也是为了完成作业。
0.1 系统调用
系统调用是操作系统留给用户态和硬件设备进行交互的接口,让用户从繁琐的底层编程中解放出来,提高了系统的安全性和可移植性。

层次关系

clipboard.png
通过int 0x80进行系统调用,通过eax传递系统调用号,用来指明需要调用的系统调用。

1.实验代码

本实验分别使用库函数封装好的getpid()函数和汇编编写的程序获取当前进程号,分别测试两种情况下结果是否相同来验证实验效果。
getpid系统调用号是0x14,进行int 0x80之前需要将该系统调用号装入eax寄存器中去。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(){
    int pid = 0;
    //使用库函数封装好的getpid()函数
    pid = getpid();
    printf("use api,pid = %d\n",pid);
    //使用系统调用获得当前进程号
    asm volatile(
    "mov $0x14,%%eax\n\t"
    "int $0x80\n\t"
    "mov %%eax,%0\n\t"
    :"=m"(pid)
    );
    printf("use sys-call,pid = %d\n",pid);
    return 0;

}

2.实验截图

clipboard.png

使用不同方式,获取的当前进程号是一致的:

clipboard.png

3.实验总结

通过本次实验,对系统调用有了初步了解,理解了应用程序、封装例程、系统调用处理程序和系统调用服务例程之间的关系。对系统调用过程中的过程有了初步了解。


binta
73 声望5 粉丝

The Magic Words are Squeamish Ossifrage


引用和评论

0 条评论