库函数API分析

        张涛(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《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运行结果:

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值