2019-2020-1 20199325《Linux内核原理与分析》第五周作业

第五周作业主要是选择一个系统调用(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不一定全部是系统调用,有些是直接向用户态提供服务,不需要系统调用。

原文地址:https://www.cnblogs.com/buhery/p/11694148.html