系统调用从glibc库到内核的追踪(open函数)

转载:http://blog.chinaunix.net/uid-29401328-id-4866849.html

前面说了glibc以及标准C库函数和系统调用,但总感觉有点隔靴挠痒,下面就来追踪一下系统调用的源码。(linux-3.3内核,glibc-2.17源码)

系统调用以open函数为例
怎么查呢?
用  man 2 open 查看open的用法,看到需要包含三个头文件sys/types.h、sys/stat.h、fcntl.h,看了一下前两个,不相关,
好像是fcntl.h,但这个头文件里也没给出open的定义,但这个头文件又包含了一个头文件io/fcntl.h,跟下去,看到168行:

extern int open (const char *__file, int __oflag, ...) __nonnull ((1));

引进了open函数,查找它的定义(我用的是source insight,直接按住Ctrl点击函数,就可以跳到该函数定义的地方),出现三个宏两个定义,oldfileops.c和fileops.c参数不匹配,另一个宏不可以,fcntl2.h里的也不像。应该是loadmsgcat.c里的
# define open(name, flags) open_not_cancel_2 (name, flags)

此时open_not_cancel_2对应glibc-2.17\sysdeps\unix\sysv\linux\Not-cancel.h 26行
#define open_not_cancel_2(name, flags) \
   INLINE_SYSCALL (open, 2, (const char *) (name), (flags))

每个硬件平台的INLINE_SYSCALL封装不一样,对于ARM来说(在glibc-2.17\ports\sysdeps\unix\sysv\linux\arm\Sysdep.h)
#define INLINE_SYSCALL(name, nr, args...) \
  ({ unsigned int _sys_result = INTERNAL_SYSCALL (name, , nr, args); \
     if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_sys_result, ), 0)) \
       { \
__set_errno (INTERNAL_SYSCALL_ERRNO (_sys_result, )); \
_sys_result = (unsigned int) -1; \
       } \
     (int) _sys_result; })

跟踪上面的宏里INTERNAL_SYSCALL

#else /* ARM */
# undef INTERNAL_SYSCALL_RAW
# define INTERNAL_SYSCALL_RAW(name, err, nr, args...) \
  ({ \
       register int _a1 asm ("r0"), _nr asm ("r7"); \
       LOAD_ARGS_##nr (args) \
       _nr = name; \
       asm volatile ("swi 0x0 @ syscall " #name \
    : "=r" (_a1) \
    : "r" (_nr) ASM_ARGS_##nr \
    : "memory"); \
       _a1; })
#endif

看到上面嵌入的汇编指令 swi 异常,它会根据异常向量表实行系统调用,nr代表要实行的系统调用的编号,每一个系统调用对应一个编号。关于 swi 异常及系统调用请参见其他博文,这里只需要知道这条汇编指令能够根据我们传进来的系统调用函数的编号调用内核里定义的系统调用函数,从这里开始,系统调用就进入到内核态了。为什么会进入到内核态,进入到内核态以后又做了什么?
这就涉及到swi异常处理了,请参见之后的博文。

时间: 2025-01-01 21:11:34

系统调用从glibc库到内核的追踪(open函数)的相关文章

glibc库详解及与POSIX,system V这些库之间关系的说明

自己想了解下关于system v,在网上看到一篇详细的说明,与大家分享一下,原文地址http://hi.baidu.com/tekuba/item/570887775696542e5c178918 以前对glibc,POSIX等的关系一直很迷惑.这是今天在网上找到的说明glibc,POSIX,system V关系的一篇不错的文章,虽然有些地方不通顺(大概是直接用机器翻译过来的),但大概意思能明白了.通过下面的说明,我们就可以明白linux应用层的层次构造.关键是glibc,他是linux最底层的

关于阿里云ECS Centos 5/6/7 Linux Glibc库严重安全漏洞修复方法

日前Linux GNU glibc标准库的 gethostbyname函数爆出缓冲区溢出漏洞,漏洞编号为CVE-2015-0235.黑客可以通过gethostbyname系列函数实现远程代码执行,获取服务器的控制权及Shell权限,此漏洞触发途径多,影响范围大,请大家关注和及时临时修复.关于阿里云ECS Linux Glibc库严重安全漏洞修复方法.Centos 5/6/7:连接终端,或者putty登录首先检测目前的版本输入命令: rpm -qa | grep glibc 我的显示:glibc-

Linux CentOS6升级glibc库过程

CentOS6升级glibc库过程 hadoop无法加载native库,可能原因是 glibc库版本过低,需要升级. 第一:安装以下软件 yum -y install zlib zlib-devel gcc gcc-c++ libtool openssl openssl-devel automake autoconf libtool pcre* 第二.查看系统glibc版本库 strings /lib64/libc.so.6 |grep GLIBC_ 这里我们可以看到系统中最新的版本是2.12,

Linux-0.11内核内存管理get_free_page()函数分析

/* *Author : DavidLin*Date : 2014-11-11pm*Email : [email protected] or [email protected]*world : the city of SZ, in China*Ver : 000.000.001*history : editor time do 1)LinPeng 2014-11-11 created this file! 2)*/Linux-0.11内存管理模块是源代码中比较难以理解的部分,现在把笔者个人的理解

Lua中字符串库中的几个重点函数

前言 在<Lua中的一些库>中也说道了,要对string库的模式匹配进行单独的讲解.对于字符串的处理,对于任何语言的学习来说,都是一个难点,而且也是一个必会的知识点.给你一个字符串,让你按照某种需求进行处理,你不会,那是多么尴尬的一件事情.所以,看完<Lua中的一些库>和这篇文章之后,我争取做到让你在处理字符串时,不再感到捉襟见肘,不再尴尬. 说到Lua中的模式匹配,基本上就是围绕着以下几个函数展开的: find match gsub gmatch 我的总结也就是围绕着上面的四个函

红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法

最近在调试红外遥控格力空调,在论坛中学到了不少东西.参考: (1)<解决问题系列(4)--红外编码分析利器使用> (2)<315Mhz模块传输替代315Mhz遥控器> 调试环境: 软件:Arduino IDE 1.0 硬件:Arduino uno r3 问题分> 我使用的遥控器型号是YAD0F. 在使用逻辑分析仪dump出原始码之后,使用sendRaw函数来发送原始码,发现空调没有反应.原始码如下: 9004,4499,699,1609,697,511,695,511,695

我自己的Javascript 库,封装了一些常用函数 Kingwell.js

我自己的Javascript 库,封装了一些常用函数 Kingwell.js 博客分类: Javascript javascript 库javascript库 现在Javascript库海量,流行的也多,比如jQuery,YUI等,虽然功能强大,但也是不万能的,功能不可能涉及方方面面,自己写一个的JS库是对这些的补充,很多也比较实用,把应用到项目中中去也比较方面,这也是对工作的一些积累,也加深对知识的理解. 2012-6-20更新,添加设置Cookie,获取Cookie,删除Cookie方法.很

C语言常用的库文件(头文件、函数库)

C语言常用的库文件(头文件.函数库) C系统提供了丰富的系统文件,称为库文件.C的库文件分为两类,一类是扩展名为".h"的文件,称为头文件,在前面的包含命令中我们已多次使用过.在".h"文件中包含了常量定义. 类型定义.宏定义.函数原型以及各种编译选择设置等信息.另一类是函数库,包括了各种函数的目标代码,供用户在程序中调用.通常在程序中调用一个库函数时,要在调用之前包含该函数原型所在的".h" 文件. 下面给出Turbo C的全部".h

几个系统调用分析 glibc中的malloc调用和共享内存原理

本文主要分析内存以及I/O相关的系统调用和库函数的实现原理,根据原理给出在使用过程中需要注意的问题和优化的侧重点,本文涉及到的系统调用包括readahead,pread/pwrite,read/write,mmap,readv/writev,sendfile,fsync/fdatasync/msync,shmget,malloc. 本文先简单介绍应用程序对内存的使用以及I/O系统对内存的使用的基本原理,这对理解上述系统调用和库函数的实现有很大帮助. 1 内存管理基础 Linux对物理内存的管理是