如何查找内核源码(如何快速找到系统调用的内核源码)

本文目录
如何快速找到系统调用的内核源码
问题:
经常需要在内核中查找系统调用的定义,比如sys_waitpid,如何快速找到呢?
解决:
1、在老版本内核中,系统调用通常定义为sys_*,所以可以直接通过相关符号查找。
2、但新版本中,系统的调用方式不同,采用了SYSCALL_DEFINE的定义方式,由于各系统调用的实现比较分散,查找起来不算方便。具体查找方法如下:
1)通过sys_*的方式找到相应函数的声明,如(include/linux/Syscall.h):
asmlinkage long sys_waitpid(pid_t pid, int __user *stat_addr, int options);
确认该声明中的参数个数,这里为3,这继续查找SYSCALL_DEFINE3(waitpid*)即可,可以通过正则表达式搜索,也可以直接搜索waitpid的引用,查找SYSCALL_DEFINE3(waitpid*)所在的位置,sys_waitpid定义如下(kernel/exit.c):
SYSCALL_DEFINE3(waitpid, pid_t, pid, int __user *, stat_addr, int, options)
{
return sys_wait4(pid, stat_addr, options, NULL);
}
此处,有涉及另一个系统调用sys_wait4的定义,需要继续用上述方法查找,该系统调用有4个参数,所以应该查找SYSCALL_DEFINE4(wait4*),或者查找wait4的引用,可以找到相应结果(kernel/exit.c)。
SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr,
int, options, struct rusage __user *, ru)
{
...
}
新版本内核中系统调用的定义方式如下(使用了宏定义,定义更简单,但可读性比较差~),供参考:
#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
#define SYSCALL_DEFINEx(x, sname, ...)\
SYSCALL_METADATA(sname, x, __VA_ARGS__)\
__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
#define __PROTECT(...) asmlinkage_protect(__VA_ARGS__)
#define __SYSCALL_DEFINEx(x, name, ...)\
asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))\
{\
long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__));\
__MAP(x,__SC_TEST,__VA_ARGS__);\
__PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__));\
return ret;\
}\
SYSCALL_ALIAS(sys##name, SyS##name);\
static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
如何查看跟踪查看LINUX内核中的源码
最近看LINUX书籍时,根据书中代码找相应的函数或者结构定义相当吃力,根据网上资料按以下方法查找速度较快。
1.安装ctags
在源代码目录下运行
ctags -R
这样,会递归生成当前目录下及其子目录的tags文件。
2.使用VIM根据tags文件查找函数或结构定义。
1.在源码目录下查找
vi -t tagname
2.如果要在任意位置使用,则需要把该tags文件添加到~/.vimrc文件中
set tags=/home/money/sda8/2.6232/tags
3.如果要在代码中实时跟踪,则光标移动到函数名上,使用CTRL+]键,按CTRL+t可以返回。
如果要跟踪系统函数,使用shift+K可以自动跳转道光标所在函数的手册。
linux下怎样用ctags查看内核源码
ctags(Generate tag files for source code)是vim下方便代码阅读的工具。尽管ctags也可以支持其它器,但是它正式支持的只有VIM。并且VIM中已经默认安装了Ctags,它可以帮助程序员很容易地浏览源代码。
ctags能够定位如下内容:
1)用#define定义的宏
2)枚举型变量的值
3)函数的定义、原型和声明
4)名字空间(namespace)
5)类型定义(typedefs)
6)变量(包括定义和声明)
7)类(class)、结构(struct)、枚举类型(enum)和联合(union)
8)类、结构和联合中成员变量或函数
安装ctags,如果是RedHat,则直接使用yum命令安装:在指定的源码位置生成tags文件,并且我们添加很多参数来完善ctags的功能(为了体现其功能的强大,我用它来生成linux源码的tags文件):
然后我们查看tags内容就可以发现,原来tags就是linux内核代码中各个元素的索引,这也就是ctags结合vim可以快速进行定位的原因了(查询就是通过这个文件内容来定位的):

更多文章:
sql语句优化面试(面试问到 数据库性能优化 怎么回答 我是Oracle数据库)
2025年7月30日 02:15
图片转换代码软件(求一款图片转网页代码的工具,就是可以把图片转换成网页广告的那种,)
2025年6月30日 23:30
desense(手机desense测试,中文是什么意思怎么测试)
2025年11月12日 03:00
如何使用ubuntu系统(win10安装ubuntu双系统怎么装)
2025年9月4日 20:00
sql数据库多少钱(access sql 等的数据库,开发工具多少钱运行平台多少钱)
2026年1月21日 20:15
php环境搭建的原理(什么是PHPWEB环境的搭建及其作用)
2026年8月23日 16:15
c语言一维数组有几个数(c语言的一维数组中至少要有几个元素)
2025年11月27日 13:30
1111101100101110转为16进制?将23456表为16进制数
2025年12月19日 18:30
指针变量为什么占4个地址(C语言中,为什么指针变量无论指向那个类型的变量,其所占的字节都为4个字节详解)
2025年7月27日 19:00
html5模板 支付成功(html5怎么实现支付宝实时转账)
2025年7月5日 15:45
js jquery面试(jquery中怎么调用js方法调用)
2025年8月8日 03:45











