不是问什么书(尽管如果您知道任何有用的指南/教程),而是开始进行内核编程的最佳方法是什么,是否有最适合学习的特定发行版?
我最感兴趣的是设备驱动程序部分,但我也想了解内核是如何设置的(模块等)我有大约 4-5 年的 C/C++ 经验,但主要是来自大学的知识(所以它是不像 4-5 年的工作经验,如果你知道我的意思)
我最近应用了一个单行补丁drivers/bluetooth/btusb.c,以便与我的蓝牙设备兼容。但是,每当我进行内核升级时,补丁都会丢失,直到有人向后移植它(这不太可能)。有没有办法让我运行脚本并自动修补每个新内核升级?
DKMS 似乎是一个不错的解决方案,但我不确定如何设置。我不想每次更新时都重新编译整个 Linux 内核,但我想将该补丁应用到 btusb 模块,重新编译它,并在每次更新时将其插入我的内核中。我如何使用从 获得的来源来做到这一点apt-get source linux-source-3.2.0?我需要复制哪些文件?关键make调用是make M=drivers/bluetooth modules,但这取决于首先构建的其他内核实用程序。如何为此组装 DKMS 模块?
关于如何使用补丁的详细信息,可以发现这里的问Ubuntu Linux系统。
我正在调试一个闭源软件安装程序,它似乎对我的发行版有一些先入为主的概念。未找到 后安装中止apt-get。它尝试运行的命令是:
apt-get -y -q install linux-headers-3.7.5-1-ARCH
Run Code Online (Sandbox Code Playgroud)
我想“包名称”来自/usr/src,唯一的条目是linux-3.7.5-1-ARCH. 有没有人对我应该用 pacman 安装哪个软件包有任何有根据的猜测?
头文件可能会用于编译自定义硬件的驱动程序。
以下是安装日志中的一些相关文本:
注意:Linux 驱动程序必须针对您的 Linux 操作系统当前运行的内核的内核源构建。此脚本为您自动执行此任务。
注意:您必须安装 Linux OS 内核头源文件。如果您计划运行 Jungo 调试监视器,那么您可能还需要安装“compat-libstdc++”和“libpng3”。
您的 Linux 当前正在运行以下内核版本:
3.7.5-1-ARCH
我现在正在编译linux kernel 2.6,发现总共有1000多个模块。一个模块是如何被批准包含在 linux 内核中的?
我想在我的主机上构建 Linux 内核并在我的 VWware 虚拟机中使用它。他们现在都使用相同的 Ubuntu 内核。
在我的主机上,我执行make和make configure。make modules_install那么,在执行和之前,我应该将哪些文件复制到目标计算机make install?
我还需要做哪些事情?
我刚刚编译了一个新内核并问自己:在编译过程中是什么决定了内核中静态构建了哪些内核模块?
然后我删除了/lib/modules,重新启动并发现我的系统工作正常,所以看起来所有基本模块都是静态构建在内核中的。
如果没有/lib/modules,内核会加载 22 个。在目录存在的情况下,它会加载 67 个模块。
让我们假设一个 Linux 系统已启动并正常运行的场景。用户来了并热插拔了 USB 存储设备。
发生的事件顺序如下图所示:
modprobe 在哪里加载它的驱动程序?所请求设备的驱动程序是/sys/bus/drivers在 modprobe 加载之后还是之前找到的?
我在这里试图建立的是/sys/上图中的条目和发生的事件之间的关系。
我正在 Raspberry Pi 上为 Raspbian(内核版本 4.9.24)开发网络驱动程序,每次加载模块时它都会崩溃。
使用日志/var/log/messages我已经能够判断出哪种方法失败了,但我仍然不知道它为什么失败。
May 7 17:15:29 raspberrypi kernel: [ 228.384164] CPU: 0 PID: 1163 Comm: insmod Tainted: P O 4.9.24+ #993
May 7 17:15:29 raspberrypi kernel: [ 228.388503] Hardware name: BCM2835
May 7 17:15:29 raspberrypi kernel: [ 228.390701] task: d888ed00 task.stack: da696000
May 7 17:15:29 raspberrypi kernel: [ 228.392901] PC is at register_netdevice+0x20/0x4cc
May 7 17:15:29 raspberrypi kernel: [ 228.395064] LR is at register_netdev+0x24/0x34
May 7 17:15:29 raspberrypi kernel: [ 228.397106] pc : [<c04eea38>] …Run Code Online (Sandbox Code Playgroud) 我想尝试编写一个 linux 驱动程序。我正在尝试设置我的环境。我当前的内核:
$ uname -r
4.10.0-37-generic
Run Code Online (Sandbox Code Playgroud)
然后我下载源代码:
$ apt-get source linux-image-$(uname -r)
Reading package lists... Done
Picking 'linux' as source package instead of 'linux-image-4.10.0-37-generic'
...
Run Code Online (Sandbox Code Playgroud)
我去编译和修改我的驱动程序,它失败了。查看 dmesg,它显示:
version magic '4.10.17 SMP mod_unload ' should be '4.10.0-37-generic SMP mod_unload '
Run Code Online (Sandbox Code Playgroud)
在这一点上,我很困惑。我回到我下载的源代码树,当我运行时
$ make kernelversion
4.10.17
Run Code Online (Sandbox Code Playgroud)
好的,试试两个。下载内核 4.10.17 并安装它。
$ uname -r
4.10.17-041017-generic
Run Code Online (Sandbox Code Playgroud)
还是报错:
version magic '4.10.17 SMP mod_unload ' should be '4.10.17-041017-generic SMP mod_unload
Run Code Online (Sandbox Code Playgroud)
所以也许有人可以提供帮助:对我来说,在 ubuntu 上获得工作内核和匹配源的最佳和正确方法是什么(嗯,xubuntu,但我认为这不重要)?我是否需要从 kernel.org 获取代码并从头开始构建它?我有点想匹配随附的 Ubuntu 内核。
我遇到了 ASIX AX88179 USB 3.0 千兆位以太网适配器的一个相对常见的问题,它根本无法工作,或者偶尔工作,并且dmesg显示如下错误
[23552.344134] ax88179_178a 2-1:2.1 eth1: Failed to read reg index 0x0000: -32
Run Code Online (Sandbox Code Playgroud)
在网上搜索时,我发现了有关此问题或类似问题的报告,但没有令人满意的解决方案或解释。
经过一番调试,发现如果cdc_mbim之前加载了模块,问题就解决了ax88179_178a。以下解决了该问题,直到下次重新启动为止:
# rmmod ax88179_178a
# modprobe cdc_mbim
# modprobe ax88179_178a # optional
Run Code Online (Sandbox Code Playgroud)
我已经检查过没有直接或间接cdc_mbim声明为 的依赖项。ax88179_178a
我怎样才能使ax88179_178a依赖cdc_mbim,以便cdc_mbim始终自动加载ax88179_178a?
更新。
我的问题似乎与Create Linux module dependency for autoloading module重复。
kernel-modules ×10
kernel ×5
drivers ×4
compiling ×3
linux-kernel ×3
linux ×2
ubuntu ×2
arch-linux ×1
debugging ×1
dependencies ×1
header-file ×1
modprobe ×1
udev ×1
upgrade ×1
usb ×1