我需要一个在 ChrUbuntu 中构建内核模块的分步指南

Mou*_*inX 2 compiling drivers ubuntu kernel-modules

我没有构建内核模块的经验。更糟糕的是,我正在尝试在 ChrUbuntu 上执行此操作,因此我似乎无法遵循现有的 Ubuntu 指南。例如,此命令失败:

# apt-get install linux-headers-$(uname -r)
Run Code Online (Sandbox Code Playgroud)

因为 ChrUbuntu 内核是 3.4.0 版,并且没有该版本的 Ubuntu 存储库 (afaik)。

uname -a

Linux ChrUbuntu 3.4.0 #1 SMP Sun Aug 26 19:17:55 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

以下是我看过的一些参考资料:

内核/编译 - 社区 Ubuntu 文档

如何:编译 Linux 内核模块

Debian / Ubuntu Linux 安装内核头文件包

Hello World 可加载内核模块 | 马克·洛伊索

64 位 - 如何编译内核模块?- 询问 Ubuntu

编译内核模块

为构建内核模块设置 Ubuntu - Drew Stephens

Mou*_*inX 5

这一切都来自 Redditer michaela_elise。(谢谢!)

有一个脚本可以在您的 Ubuntu 安装上获取和构建 ChromeOS 3.4 内核。这很棒,因为现在我们可以编译内核模块了。

apt-get install linux-headers-$(uname -r)不起作用,因为3.4.0似乎是谷歌的具体构建和你不能只让那些头。

我在这里添加了脚本。只需将它作为 sudo 运行并放手即可。完成后,您将拥有/usr/src/kernel(这是源代码和编译后的内核)、/usr/src/linux-headers-3.4.0,它还安装了此版本的内核。

#!/bin/bash

set -x

#
# Grab verified boot utilities from ChromeOS.
#
mkdir -p /usr/share/vboot
mount -o ro /dev/sda3 /mnt
cp /mnt/usr/bin/vbutil_* /usr/bin
cp /mnt/usr/bin/dump_kernel_config /usr/bin
rsync -avz /mnt/usr/share/vboot/ /usr/share/vboot/
umount /mnt

#
# On the Acer C7, ChromeOS is 32-bit, so the verified boot binaries need a
# few 32-bit shared libraries to run under ChrUbuntu, which is 64-bit.
#
apt-get install libc6:i386 libssl1.0.0:i386

#
# Fetch ChromeOS kernel sources from the Git repo.
#
apt-get install git-core
cd /usr/src
git clone  https://git.chromium.org/git/chromiumos/third_party/kernel.git
cd kernel
git checkout origin/chromeos-3.4

#
# Configure the kernel
#
# First we patch ``base.config`` to set ``CONFIG_SECURITY_CHROMIUMOS``
# to ``n`` ...
cp ./chromeos/config/base.config ./chromeos/config/base.config.orig
sed -e \
  's/CONFIG_SECURITY_CHROMIUMOS=y/CONFIG_SECURITY_CHROMIUMOS=n/' \
  ./chromeos/config/base.config.orig > ./chromeos/config/base.config
./chromeos/scripts/prepareconfig chromeos-intel-pineview
#
# ... and then we proceed as per Olaf's instructions
#
yes "" | make oldconfig

#
# Build the Ubuntu kernel packages
#
apt-get install kernel-package
make-kpkg kernel_image kernel_headers

#
# Backup current kernel and kernel modules
#
tstamp=$(date +%Y-%m-%d-%H%M)
dd if=/dev/sda6 of=/kernel-backup-$tstamp
cp -Rp /lib/modules/3.4.0 /lib/modules/3.4.0-backup-$tstamp

#
# Install kernel image and modules from the Ubuntu kernel packages we
# just created.
#
dpkg -i /usr/src/linux-*.deb

#
# Extract old kernel config
#
vbutil_kernel --verify /dev/sda6 --verbose | tail -1 > /config-$tstamp-orig.txt
#
# Add ``disablevmx=off`` to the command line, so that VMX is enabled (for VirtualBox & Co)
#
sed -e 's/$/ disablevmx=off/' \
  /config-$tstamp-orig.txt > /config-$tstamp.txt

#
# Wrap the new kernel with the verified block and with the new config.
#
vbutil_kernel --pack /newkernel \
  --keyblock /usr/share/vboot/devkeys/kernel.keyblock \
  --version 1 \
  --signprivate /usr/share/vboot/devkeys/kernel_data_key.vbprivk \
  --config=/config-$tstamp.txt \
  --vmlinuz /boot/vmlinuz-3.4.0 \
  --arch x86_64

#
# Make sure the new kernel verifies OK.
#
vbutil_kernel --verify /newkernel

#
# Copy the new kernel to the KERN-C partition.
#
dd if=/newkernel of=/dev/sda6
Run Code Online (Sandbox Code Playgroud)

让我知道它是如何为你工作的。我已经用这个编译并插入了内核模块。

这是您如何#include 标题

include </usr/src/linux-headers-3.4.0/include/linux/module.h>
include </usr/src/linux-headers-3.4.0/include/linux/kernel.h>
include </usr/src/linux-headers-3.4.0/include/linux/init.h>
include </usr/src/linux-headers-3.4.0/include/linux/syscalls.h>
Run Code Online (Sandbox Code Playgroud)

//或任何你特别需要的

我猜你已经知道这一点,但万一有人不知道这是内核模块的基本 makefile。一旦你使用了我链接的脚本,你就可以用这个 makefile 运行 make,一切都很好。用您的 source.c 调用的任何内容替换 kmod.o,但将其保留为 .o

Makefile obj-m += kmod.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)

ps 我不得不修改 sysinfo.h 因为类型 __kernel_ulong_t 没有定义。我将其更改为 uint64_t。这似乎工作得很好。到目前为止,我的模组没有任何问题。确保您是否必须这样做才能编辑 3.4.0 标头中的 sysinfo.h

pps 这解决了 vbox 和 vmware player 的问题!!!他们只是安装和工作!