张涛(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
大多数应用软件的编程都直接调用库函数提供的API进行操作,于是此接口对于实际开发便如同一个黑盒,往往少有去理解其真正执行的过程,通过此次课的分析,对库函数API及系统调用的流程有了较为深刻的理解:
如上图片,比较清晰地解释了整个流程:库函数API通过系统调用号及int 0x80指定所需要调用的系统调用,接着由操作系统中段处理程序进行处理。
于是分析下read函数,以了解其流程:
http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl
通过上面的网页中可以看到,read库函数最终会使用sys_read系统的处理函数,然后,找到系统调用号为3。
于是写出如下测试代码:
#include <stdio.h>
#include <time.h>
#include <fcntl.h>
int main()
{
int fd = open("./test", O_RDONLY); //建立的测试文件,在执行程序坐在目录,名字为test 内容为hello
char buf[6];
#if 0
read(fd, buf, 6); //库函数提供的API
#else
//一下为自己实现的此API
asm ("mov $3, %%eax\r\n" //3号系统调用
"int $0x80"
:
:"b"(fd), "c"(buf), "d"(6)
);
#endif
buf[5] = '\0';
printf("%s\n", buf);
return 0;
}
写了个小Makefile,很简单,主要是生成的m32 和 64位代码,内嵌汇编运行结果有差异,之前测试课程中的time函数时,内嵌汇编,不采用m32产生的时间达不到预期结果。
Run : a.out
./a.out
a.out : main.c
gcc main.c -m32
附上通过自编API运行结果: