库函数API分析

来源:互联网 发布:卢旺达生活知乎 编辑:程序博客网 时间:2024/06/05 15:52

        张涛(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《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.outa.out : main.cgcc main.c -m32
        附上通过自编API运行结果:

        

0 0
原创粉丝点击