Pro*_*kup 39 compiling kernel source-code drivers 14.04
我在 Linux 内核模块中有一个错误,该错误导致股票 Ubuntu 14.04 内核出错(崩溃)。
这就是为什么我只想编辑/修补单个内核模块的源代码以添加一些额外的调试输出。有问题的内核模块mvsas
不是启动所必需的。因此,我认为不需要更新任何 initrd 映像。
看了很多资料(如下图),发现设置和构建过程混乱。我需要两个食谱:
.c
和.h
)并将该编辑转换为新的内核模块(.ko
)后要执行的步骤已使用的来源是:
Pro*_*kup 39
构建自定义模块的方法可能需要分为三个部分。
$ cd ~
$ apt-get source linux-source-3.13.0
Run Code Online (Sandbox Code Playgroud)
我懒得复制mvsas特定的驱动源文件;只需将它们全部复制到您当前的工作目录即可。如果apt-get
导致有关缺少源 URI的错误消息,请参阅底部的注释 #4。
$ cd linux-3.13.0
$ make oldconfig
$ make prepare
$ make scripts
Run Code Online (Sandbox Code Playgroud)
这将准备一些构建内核模块所需的文件。
$ apt-get install linux-headers-$(uname -r)
Run Code Online (Sandbox Code Playgroud)
这将在 /lib/modules 中安装该内核版本的头文件和 Ubuntu 内核配置文件。
$ cd ~/linux-3.13.0
$ cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers .
Run Code Online (Sandbox Code Playgroud)
这可以防止在使用 insmod 或 modprobe 加载模块时出现消息“ no symbol version for module_layout ”。
$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup
Run Code Online (Sandbox Code Playgroud)
这将重命名原始(Ubuntu 构建)内核模块,以确保加载自定义补丁模块。
$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c
Run Code Online (Sandbox Code Playgroud)
这些是用于编辑的。
$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
Run Code Online (Sandbox Code Playgroud)
这将.ko
使用存储在/lib/modules/$(uname -r)/
.
$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install
Run Code Online (Sandbox Code Playgroud)
这将在 中安装内核模块/lib/modules/$(uname -r)/extra/
,如果您没有重命名分发内核模块文件,则不会覆盖分发模块。在这个 mvsas 情况下,它也将运行depmod。
$ lsmod | grep mvsas
Run Code Online (Sandbox Code Playgroud)
如果这导致任何输出,则 mvsas 模块需要modprobe -r mvsas
先使用 ( )卸载。
$ sudo modprobe -v mvsas
Run Code Online (Sandbox Code Playgroud)
这应该加载新的内核模块。
检查输出以验证/lib/modules/.../extra/mvsas.ko
正在加载。
在某些情况下,您可能会modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)
在冗长的 modprobe 输出中遇到一段时间,您会看到它insmod
试图从内核默认位置加载模块。例如:
# insmod /lib/modules/3.17.0-031700rc7-generic/kernel/drivers/scsi/pm8001/pm80xx.ko
modprobe: ERROR: could not insert 'pm80xx': Unknown symbol in module, or unknown parameter (see dmesg)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您需要手动运行depmod并尝试再次加载模块:
# depmod
# sudo modprobe -v mvsas
Run Code Online (Sandbox Code Playgroud)
.ko
模块文件比 Ubuntu 分发的原始模块文件大很多(例如 20 倍);在这种情况下,该make prepare
步骤可能会创建一个 Linux 开发人员调试内核配置文件,并且您正在从源目录构建。您的-C
参数可能无法按预期运行。make modules_prepare
和make M=scripts/mod
但我认为这些对于这种情况是不必要的。-C /lib/modules/$(uname -r)/build
与-C /usr/src/linux-headers-$(uname -r)
apt-get source linux-sources
将返回 error E: You must put some 'source' URIs in your sources.list
。要解决此问题,您可以/etc/apt/sources.list
通过取消注释(删除前导#
)第一deb-src
行来修改文件。实施例为Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted
。run sudo apt-get update
,然后该命令将为您提供源。另请参阅此问题,其中也描述了用于执行此操作的 GUI 方法。 归档时间: |
|
查看次数: |
79740 次 |
最近记录: |