0

当我想在 linux 内核中查找结构的定义时,站点lxr.free-electrons.com非常有用。

然而,令人讨厌的是:

如果在许多其他头文件中声明了一个结构,那么找到的结果将是很多不完整的声明和一个完整的结构定义。很难区分定义和声明。

例如,搜索结果为struct task_struct

任务结构

定义为结构类型:

驱动程序/mmc/card/queue.h,第 7 行驱动程序/oprofile/cpu_buffer.h,第 21 行

驱动程序/网络/无线/cw1200/cw1200.h,第 34 行

包括/uapi/linux/capability.h,第 18 行

包括/asm-generic/syscall.h,第 22 行

……

……

找到完整的定义是非常可怕的struct task_struct

如何解决这个问题呢?

4

3 回答 3

2

这似乎是 lxr.free-electrons.com 背后的引擎 LXR 的一个限制:它不区分前向声明 ( struct task_struct;) 和完整定义。

我选择的方法始终是查看文件名,因为给定结构定义的位置通常很明显(例如,在您的情况下,它与调度有关,因此sched.h在文件列表中应该有它)。但是,我知道有人可能不熟悉 Linux 内核源代码,因此不知道该去哪里。

在 Linux 源代码树中查找结构定义的最佳方法是按字面搜索:

struct struct_name {

由于Linux 贡献者遵循严格的编码风格,因此结构定义应始终采用这种形式。

LXR 有一个自由文本搜索来应对它的局限性。不幸的是,它使用谷歌搜索,它忽略了大多数标点符号。GitHub 似乎也忽略了它们,还有 Google Code。

我的建议是克隆主线 Linux Git 存储库:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

然后grep(或者,更好,ag)您在include目录中查找的内容:

grep -rin 'struct task_struct {' include

或者,使用ag

ag 'struct task_struct {' include

您将在结果中看到定义此结构的文件(通常只有一个),然后您可以转到 LXR 上的相应文件并继续您的研究。

这是一个使用第一个结果转到相应 LXR 页面的 shell 函数:

lxr() {
    chromium "http://lxr.free-electrons.com/source/$(grep -rl "$1" include | head -1)"
}

或者,使用ag

lxr() {
    chromium "http://lxr.free-electrons.com/source/$(ag -l "$1" include | head -1)"
}

替换chromium为您最喜欢的浏览器命令。像这样使用它:

lxr 'struct task_struct {'

希望能帮助到你。

于 2014-11-27T06:51:43.670 回答
0

我发现在我的系统中下载 linux 源代码并使用cscope命令行工具浏览非常有用。它与代码导航一起ctags非常有用。

于 2014-11-27T06:50:09.880 回答
0

试试这个 https://code-grep.com/view/project/54b083273b2082684a000008/linux-3.19-rc2?search=task_struct&type=definitions&page=0

它实际上显示了定义的行,所以我们不需要来回检查。

于 2015-01-12T06:22:03.993 回答