1

我想在 random.c 中添加一些调试信息或 printf,以便深入了解 Linux 随机数生成器。/dev/random 和 /dev/urandom 中的熵都是由 random.c 生成的。我的问题是: 1. 我在哪里可以找到 Linux 2.6.32 中的 random.c 文件?2. 将我对随机源代码的修改添加到内核中的最佳方法是什么?只编译 random.c 并将其加载为可加载内核模块可以吗?或者我是否必须重新编译并安装内核才能使带有调试信息的新 random.c 以某种方式生效?关键是要确保内核中只有一份随机数生成器正在运行。

谢谢你。任何形式的建议都将受到高度赞赏。

4

2 回答 2

4

random.c直接链接到内核中,它不是作为模块构建的,所以你不能单独重新编译它并将它加载到你的内核中,你需要重新编译整个新内核。

要构建内核,请确保您安装了常用的开发工具:gcc、GNU make 等。一些发行版提供了“build-essentials”或“开发工具”或类似的元包,其中包括用于构建内核的所有常用开发工具核心系统包。

如何构建内核取决于您是否有使用系统所需的任何特定于发行版的补丁,或者是否要确保使用发行版的打包系统来安装内核。如果是这样,您可能应该按照发行版的说明构建内核。例如,Ubuntu 的说明Arch 的说明Fedora 的说明CentOS 说明(可能在 RHEL 6 上类似,Red Hat 不提供文档,因为它们不支持构建自定义内核)、SuSE 说明

否则,如果您不介意手动配置和安装内核,您可以手动完成。以下说明应该很好地涵盖了大多数发行版,但请务必检查您的发行版文档,以防有任何发行版特定的陷阱。

从kernel.org下载适当的 tarball并在某处解压缩。或者,如果您愿意,可以使用 Git 进行检查。由于您引用了 2.6.32,因此我在以下说明中包含了最新版本的 2.6.32。

$ curl -O https://www.kernel.org/pub/linux/kernel/v2.6/longterm/v2.6.32/linux-2.6.32.61.tar.xz
$ xzcat linux-2.6.32.61.tar.xz | tar xvf -
$ cd linux-2.6.32.61
# or...
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
$ cd linux
$ git checkout -b my-branch v2.6.32.61

现在您需要对其进行配置、构建和安装。Greg Kroah-Hartmann 是一位领先的内核开发人员和稳定的内核维护者,他有一本关于该主题的免费书籍。我建议阅读他的书,但如果您想快速了解一下,我会总结重点。

有几种方法可以配置它。一个好的开始方法是复制您当前的配置,然后运行make menuconfigmake xcconfig获取一个 curses 或图形内核配置实用程序,让您可以轻松浏览并选择正确的选项(因为新内核中可能有新的选项你正在建造)。许多发行版将给定内核的配置安装在内核版本中/boot/config/boot/config-version对应于内核版本。将其复制到源代码树中.config,然后运行make menuconfigmake xconfig

$ cp /boot/config .config
$ make xconfig

配置完成后,我建议EXTRAVERSIONMakefile. 其内容附加到版本中,以帮助区分您修改后的内核与上游内核。我建议设置它以帮助跟踪您修改过的内核。

配置完成后,只需像其他任何东西一样构建​​它。如果您有多个内核,我建议您使用-j它来运行并行构建。

$ make -j8

现在它已构建,您可以安装它。在大多数系统上,以下工作;如果没有,请查看 Greg 的书或查看您的发行版的文档:

$ sudo make modules_install
$ sudo make install

最后,您必须将其添加到您的引导加载程序中(在某些系统上,make install可能会这样做,在某些系统上可能不会)。根据您使用的是 Lilo、Grub 还是 Grub2,您可能需要编辑/etc/lilo.conf(然后运行sudo lilo以安装更改)/boot/grub/menu.lst、或/boot/grub/custom.cfg(然后sudo grub-mkconfig -o /boot/grub/grub.cfg安装更改​​)。有关更多详细信息,请参阅给定引导加载程序的相关文档。通常,您希望复制现有条目并复制它,将其更新为指向您的新内核。确保保留现有条目,这样如果这不起作用,您将能够引导回旧内核。

现在重新启动,选择您的新内核,并希望您的系统启动。哇!您已经构建了自己的内核。

既然您已确保无需修改即可成功完成此操作,您就可以进行更改了。您将要修改drivers/char/random.c. 要打印调试语句,请使用printk(). 它的工作原理大多类似于printf(),但并不完全相同,因此请在使用之前查看文档。修改、重建和重新安装新内核并重新启动后,您可以看到使用该命令打印出的带有printk()语句的消息。dmesg

有关更多信息,请查看我在上面链接的 Greg 的书、内核READMEHOWTO,浏览内核的文档目录和各种其他文档

于 2013-10-22T05:34:45.853 回答
0

如果您查看它的 Makefile,char 驱动程序并不意味着编译为模块(random.o 包含obj-y在 中drivers/char/Makefile)。

您可以阅读更多关于如何 kbuild(内核构建)系统工作的信息:https ://www.kernel.org/doc/Documentation/kbuild/makefiles.txt

特别部分--- 3.1 Goal definitions涉及到这个话题。

  1. 通常,您可以从源代码交叉引用(称为LXR's)中搜索内核源代码中的文件。例如在http://lxr.free-electrons.com/中提供了一个

  2. 实际上,您可以将您的修改添加到drivers/char/random.c, 并重新编译 char 驱动程序。之后,您将不得不重建内核,以便它还将您的新 random.o 链接到内核。然后您必须启动该内核,该过程将取决于您的发行版。

大多数发行版都有关于如何重新编译/引导您自己的内核的良好/体面的说明。

于 2013-10-22T04:58:43.127 回答