第五周作业主要是选择一个系统调用(13号系统调用time除外),使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,在实验楼Linux虚拟机环境下完成实验。
系统调用的列表参见 http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl
#include <stdio.h>
#include <unistd.h>
int main(void){
pid_t tt;
asm volatile(
"movl $0x14, %%eax
" //将系统调用号赋给eax寄存器
"int $0x80
" //执行系统调用
"movl %%eax, %0
" //将系统调用执行后的返回值赋给变量tt
:"=m"(tt)
);
printf("%u
",tt);
return 0;
}
代码分析
#include <stdio.h>
#include <unistd.h>
int main(void){
pid_t tt;
asm volatile(
"movl $0x14, %%eax
" //将系统调用号赋给eax寄存器
"int $0x80
" //执行系统调用
"movl %%eax, %0
" //将系统调用执行后的返回值赋给变量tt
:"=m"(tt)
);
printf("%u
",tt);
return 0;
}
总结
系统调用:是操作系统为用户态进程与硬件设备进行交互提供的一组接口。Linux操作系统实现一般是:硬件层面->Linux内核->系统调用(服务层次)->应用程序。
库函数:库函数是为了使人们编程更加方面而预先写好常用的函数封装起来,对外提供接口。系统调用是相对高级的服务,如果由用户直接使用可能不是很方便,那么我们可以事先封装系统调用为API,提供给编程人员使用。系统调用是内核态,库函数是用户态,但一般库函数更符合开发需求。库函数中的API不一定全部是系统调用,有些是直接向用户态提供服务,不需要系统调用。