繁体   English   中英

如何在Linux中修改random.c的源代码? 我是否必须重新编译内核才能使其生效?

[英]How can I modify the source code of random.c in Linux? And do I have to recompile the kernel to make it take effect?

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

谢谢。 任何建议都非常感谢。

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安装给定内核的/boot/config 将其作为.config复制到源树中,然后运行make menuconfigmake xconfig

$ cp /boot/config .config
$ make xconfig

配置完成后,我建议在MakefileEXTRAVERSION定义中添加一些内容。 其中的内容被添加到版本中,以帮助区分修改后的内核和上游内核。 我建议将其设置为帮助跟踪哪些是您修改过的内核。

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

$ make -j8

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

$ sudo make modules_install
$ sudo make install

最后你必须将它添加到你的引导加载程序(在某些系统上, make install可能会这样做,有些可能不会)。 根据您是否使用LILO,蛴螬,或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() ,虽然它并不完全相同,所以在使用之前请查看文档 修改,重建和重新安装新内核并重新启动后,您可以使用dmesg命令查看使用printk()语句打印的消息。

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

如果你看一下Makefile,那么char驱动程序并不是要编译成一个模块(random.o作为obj-y包含在drivers/char/Makefile )。

您可以从以下网址了解有关如何使用kbuild(内核版本)系统的更多信息: https//www.kernel.org/doc/Documentation/kbuild/makefiles.txt

特别是第--- 3.1 Goal definitions--- 3.1 Goal definitions涉及这一主题。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM