0.笔记
本周进行了linux内核分析的第四周学习,对系统调用过程有了初步了解。撰写此文,记录学习同时也是为了完成作业。
0.1 系统调用
系统调用是操作系统留给用户态和硬件设备进行交互的接口,让用户从繁琐的底层编程中解放出来,提高了系统的安全性和可移植性。
层次关系
通过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.实验截图
使用不同方式,获取的当前进程号是一致的:
3.实验总结
通过本次实验,对系统调用有了初步了解,理解了应用程序、封装例程、系统调用处理程序和系统调用服务例程之间的关系。对系统调用过程中的过程有了初步了解。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。