文章目录
前言
基于上一篇博客vim基础配置,在完成vim的基础及一些插件配置后,我们期望的是能够用vim像IDE一样便利地阅读代码,例如查看变量/函数的定义,查找引用等等,本篇博客介绍如何通过vim+cscope实现Linux内核代码的便利阅码
一、了解内核源码树
不管是用传统的IDE还是用vim来阅读一个项目的代码,第一步都应该是创建该项目代码的工程,如果是用IDE的话,那么在创建工程的时候,它会自动帮忙创建变量/函数的Tag,从而让用户可以便利地查询变量/函数的定义,声明等。如果用vim+cscope的方式,需要我们自己创建Tag文件,然后用cscope的命令来建议索引,从而实现与IDE一样的功能。
不同于一般的项目,如果想要阅内核的码,那么无疑代码量是很庞大的,最简单的方法可以不假思索,把所有内核的代码全都建立索引,但这无疑引入了很多冗余的代码,cscope的效率也会相应的降低,因此更优的做法是我们只对我们常用的目录建立索引,那么就要求我们对内核源码树有一定的了解,下面基于6.3.6
的内核做一下简单的介绍,大家可以根据自己的需求来生成各自的Tag文件。
目录 | 描述 |
---|---|
arch | 特定体系结构的源码 |
block | 块设备I/O层 |
crypto | 加密API |
Documentation | 内核源码文档 |
drivers | 设备驱动程序 |
io_uring | 5.1版本引入的异步I/O框架 |
fs | 文件系统 |
include | 内核头文件 |
init | 内核引导和初始化 |
ipc | 进程间通信 |
kernel | 调度器等核心子系统 |
lib | 通用内核API |
mm | 内存管理子系统和VM |
net | 网络子系统 |
rust | 6.1版本引入的基于rust开发部分 |
samples | 示例代码 |
scripts | 编译内核所用的脚本 |
security | 安全模块 |
sound | 语音子系统 |
usr | 早期用户空间代码 |
tools | Linux开发中用到的工具 |
virt | 虚拟化基础结构 |
二、生成Tag文件
结合内核源码树和自己的需求,我们就可以来生成cscope创建索引需要的Tag文件了,因为我平时都是基于arm64的架构做开发,因此就常用下面的命令来生成Tag文件,大家可以根据自身需求做一些修改:
#!/usr/bin/bash
# Author: Young WANG
set -eu
if [[ $# -ne 2 ]]; then
echo "input invalid! please input src dir(root path of kernel) and dst dir(path of cscope.files)"
echo "for example:"
echo -e "\t bash $0 /<workspace>/common /<workspace>/cscope"
exit
fi
SRC_DIR=$1
DST_DIR=$2
find $SRC_DIR \
-path "$SRC_DIR/arch*" -prune -o \
-path "$SRC_DIR/scripts*" -prune -o \
-path "$SRC_DIR/Documentation*" -prune -o \
-path "$SRC_DIR/rust*" -prune -o \
-path "$SRC_DIR/tools*" -prune -o \
-type f \
-not -name '*.mod.c' \
-name "*.[chsS]" -print > $DST_DIR/cscope.files
find $SRC_DIR/arch/arm64 \
-type f \
-not -name '*.mod.c' \
-name "*.[chsS]" -print >> $DST_DIR/cscope.files
使用的时候就可以输入内核源码树和存放cscope的Tag文件(cscope.files
)的绝对路径即可,例如
bash gen_kernel_cscope.sh /home/<usr_name>/ack/common /home/<usr_name>/ack/commom/cscope
顺便附上cscope官方版在针对大工程时的guide供大家参考~
二、生成索引
在文成Tag文件的生成之后,就可以用cscope来创建工程的索引了,这里可以去到存储cscope.files
的目录下执行如下命令
cscope -bkq
引用官方的解释,即:
-b标志告诉Cscope只构建数据库,而不启动Cscope GUI。
-q导致创建一个额外的“反向索引”文件,这使得大型数据库的搜索运行得更快。
-k设置Cscope的“内核”模式——它不会在/usr/include中查找源文件中#包含的任何头文件(这在您将Cscope与操作系统和/或C库源代码一起使用时非常有用,就像我们在这里一样)。
在完成索引创建后,即可结合vim基础配置里的2.5节来使用cscope了。
总结
如果有哪里理解错的地方欢迎大家留言交流,如需转载请标明出处。
如果你没看懂一定是我讲的不好,欢迎留言,我继续努力。
手工码字码图码代码,如果有帮助到你的话留个赞吧,谢谢。
以上。