当前位置: 首页 > 面试题库 >

开发/调试linux内核最有效,最优雅的方法是什么

饶高雅
2023-03-14
问题内容

最近,我开始开发linux设备驱动程序,

当我想使用内核代码进行调试并printk在内核文件中添加一些调试消息时,我遇到了一个问题。

例如,最近我加入一些printk()dump_stack()__debug_locks_off()驻留在include/linux/debug_locks.h

然后,我执行以下步骤,这非常耗时。

make clean
make bzImage
make modules
make modules_install
mkinitrfmfs -o /boot/initrd.img 3.12.6[my kernel version] 
cp arch/x86/boot/bzImage /boot
update-grub

然后重启并选择我的新内核版本。

我不知道有没有多余的步骤?任何指导或帮助将不胜感激。


问题答案:

这是我有关如何构建和运行定制内核的说明。

获取资源

Linus Torvalds的树是[1]。

在[2]上将其标记为“主线”。

要克隆它,请使用[1]中的信息:

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

现在转到linux/dir并在master分支上签出(我们需要使用最新的更改作为开发的起点):

$ cd linux
$ git checkout master

在实际开发之前,请不要忘记更新您的分支:

$ git pull --rebase

建造

我的机器上的内核版本:

$ uname -r

3.16.0-4-amd64

要从我的机器上运行的系统获取配置:

$ cp /boot/config-`uname -r` ./.config

要更新配置(使用默认答案),我使用了下一个命令:

$ make olddefconfig

要禁用(不构建)当前系统中未加载的模块:

$ make localmodconfig

要用默认答案回答所有问题,我只是单击Enter直到完成(实际上只是两次)。

接下来,我做了:

$ make menuconfig

然后选择下一个配置选项:

CONFIG_LOCALVERSION_AUTO=y
CONFIG_LOCALVERSION="-joe"

设置ccache和构建环境:

$ ccache -C
$ ccache -M 4G
$ export CC="ccache gcc"

构建内核(使用ccache):

$ reset
$ make -j4
$ make -j4 modules

构建的内核映像为:

arch/x86_64/boot/bzImage

正在安装

为内核安装模块:

$ sudo make modules_install

安装新内核:

$ sudo make install

已安装的模块位于/lib/modules/*-joe/kernel/

已安装的内核文件位于/boot/*joe*

- config-*joe*
- initrd.img-*joe*
- System.map-*joe*
- vmlinuz-*joe*

update-grub是作为make install脚本的一部分运行的,因此无需手动运行。

注意modules_install必须在 之前
运行install,因为install使用模块填充initramfs映像需要规则。检查/boot/initrd.img-*joe*文件大小:必须大于等于15
MiB(如果较小,则可能是模块不在其中)。

启动定制的内核

通常,自定义内核的版本应大于发行版内核的版本,因此默认情况下应运行自定义内核。如果否,请继续阅读。

重新启动,转到GRUB,选择下一个条目:

-> Advanced options for Debian GNU/Linux
  -> Debian GNU/Linux, with Linux 4.0.0-rc7-joe-00061-g3259b12

使您的发行版内核默认加载

由于视频可能无法在您的自定义内核中运行(为此必须重建视频驱动程序),因此您可能希望GRUB在默认情况下加载make distro内核。

为此,只需编辑/etc/default/grub文件:

$ sudo vim /etc/default/grub

换线

GRUB_DEFAULT=0

GRUB_DEFAULT="1>3"

其中的"1>3"意思是:-转到GRUB中的第二行,输入-并使用第四行启动。

运行之后:

$ sudo update-grub

注意:不要编辑/boot/grub/grub.cfg文件,因为它是自动生成的,并且在每个update-grub命令后都会被替换。

删除自定义内核

如果您不再需要自定义内核,则可能要删除它。要删除已安装的内核,请执行下一步。

  1. 删除所有安装到/ boot的文件:

    $ sudo rm -f *joe*
    
  2. 卸下所有已安装的模块:

    $ sudo rm -rf /lib/modules/*joe*
    
  3. 更新GRUB:

    $ sudo update-grub
    

清理内置内核

如果您不需要进行增量构建,而是想要进行清理构建(例如,您签出了另一个版本),则可能要先清理生成的文件:

$ make -j4 distclean

链接

[1]
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/

[2] https://kernel.org/

[3]
http://kernelnewbies.org/FAQ/KernelCompilation



 类似资料:
  • 问题内容: 假设您有一个存储有序树层次结构的平面表: 这是一个图,我们在这里。根节点0是虚构的。 您将使用哪种简约方法将其作为正确排序,正确缩进的树输出到HTML(就此而言,还是文本)? 进一步假设您只有基本的数据结构(数组和哈希图),没有带有父/子引用的奇特对象,没有ORM,没有框架,只有两只手。该表表示为结果集,可以随机访问。 可以使用伪代码或简单的英语,这纯粹是一个概念性问题。 额外的问题:

  • 问题内容: 到目前为止,这是我得到的: 这让我既震惊又浪费。如果存在firstChoice,则我将不必要地计算secondChoice。 还有一个更有效的版本: 在这里,如果不复制映射器或声明另一个局部变量,就无法将某些映射函数链接到最后。所有这些使代码比要解决的实际问题更加复杂。 我宁愿这样写: 但是可选:::显然不存在。怎么办? 问题答案: 试试这个: map方法为您提供了一个。然后,该方法将

  • 正如前面的回答中所解释的,更改Spark cluster详细信息的理想方法是更改相应的log4j。财产。但是,在dataproc上,Spark在Thread上运行,因此我们必须调整全局配置,而不是/usr/lib/Spark/conf 若干建议: 在dataproc上,我们有几个gcloud命令和属性可以在集群创建期间传递。如有可能更改log4j,请参阅文档。在/etc/hadoop/conf下指

  • 问题内容: 我正在研究Linux内核,但是有问题。 我看到许多Linux内核源文件都有。那是什么? 问题答案: 它是指向当前进程(即发出系统调用的进程)的指针。 在x86上,它是在(其他拱门的类似文件)中定义的。 Linux设备驱动程序第2章中的更多信息: 当前指针是指当前正在执行的用户进程。在执行系统调用(例如打开或读取)期间,当前进程是调用该调用的进程。如果需要,内核代码可以通过使用curre

  • 到目前为止我得到的是: 这让我觉得既可怕又浪费。如果第一个选择存在,我就不必要地计算第二个选择。 还有一个更有效的版本: 在这里,如果不复制映射器或声明另一个局部变量,我就无法将某个映射函数链接到最后。所有这些都使得代码比正在解决的实际问题更加复杂。 我宁愿这样写: 然而,可选的::可选的显然不存在。现在怎么办?