linux - 如何下载 Torvalds Linux Kernel master,(重新)编译它,并使用 QEMU 引导它?

标签 linux linux-kernel qemu macos-high-sierra

这几天,我正在做一个小项目来探索内核编程。然而,我在网上看了很多,之前也问过一个关于内核编译的问题,我在某些时候仍然感到迷茫。

如果我需要进行一些内核编程,我认为使用 Linus Torvalds 的 Linux 源代码是最好的起点。所以我做了以下(来自 MacOS High Sierra):

  • 下载内核源代码:https://github.com/torvalds/linux
  • 解压
  • 启动终端并运行:
    • vagrant 初始化
    • vagrant up
    • vagrant ssh
  • 连接后,我输入:
    • cd/vagrant/linux 为了进入 Linux 源解压文件夹
    • make menuconfig 我刚刚按下 ok/save
    • sudo make -j 4 && sudo make modules_install -j 4 && sudo make install -j 4

现在,我得到了一个小错误:

agrant @vagrant-ubuntu-trusty-64:/vagrant/Kernel-Programming/linx-kernel$ sudo make -j 4 && sudo make modules_install -j 4 && sudo make install -j 4
  CHK include/config/kernel.release
CHK     include/generated/uapi/linux/version.h
CHK     include/generated/utsrelease.h
CHK     scripts/mod/devicetable-offsets.h
CHK     include/generated/timeconst.h
CHK     include/generated/bounds.h
CHK     include/generated/asm-offsets.h
CALL    scripts/checksyscalls.sh
CHK     include/generated/compile.h
SKIPPED include/generated/compile.h
CC      my_syscalls/uptime.o
AR      my_syscalls/built-in.o
CC[M]  net/ipv4/netfilter/ipt_ECN.o
In file included from net/ipv4/netfilter/ipt_ECN.c:20:0:
net/ipv4/netfilter/ipt_ECN.c: In function 'set_ect_ip':
./include/uapi/linux/netfilter_ipv4/ipt_ECN.h:16:27: error: 'XT_DSCP_MASK' undeclared(first use in this function)
 #define IPT_ECN_IP_MASK (~XT_DSCP_MASK)
                           ^
net/ipv4/netfilter/ipt_ECN.c:33:18: note: in expansion of macro 'IPT_ECN_IP_MASK'
  if ((iph->tos & IPT_ECN_IP_MASK) != (einfo->ip_ect & IPT_ECN_IP_MASK)) {
                  ^
./include/uapi/linux/netfilter_ipv4/ipt_ECN.h:16:27: note: each undeclared identifier is reported only once for each function it appears in
 #define IPT_ECN_IP_MASK (~XT_DSCP_MASK)
                           ^
net/ipv4/netfilter/ipt_ECN.c:33:18: note: in expansion of macro 'IPT_ECN_IP_MASK'
  if ((iph->tos & IPT_ECN_IP_MASK) != (einfo->ip_ect & IPT_ECN_IP_MASK)) {
                  ^
net/ipv4/netfilter/ipt_ECN.c: In function 'ecn_tg_check':
./include/uapi/linux/netfilter_ipv4/ipt_ECN.h:16:27: error: 'XT_DSCP_MASK' undeclared(first use in this function)
 #define IPT_ECN_IP_MASK (~XT_DSCP_MASK)
                           ^
net/ipv4/netfilter/ipt_ECN.c:105:23: note: in expansion of macro 'IPT_ECN_IP_MASK'
  if (einfo->ip_ect & ~IPT_ECN_IP_MASK)
{
                       ^
make[3]: *** [net / ipv4 / netfilter / ipt_ECN.o] Error 1
make[2]: *** [net / ipv4 / netfilter] Error 2
make[1]: *** [net / ipv4] Error 2
make: *** [net] Error 2
make: ***Waiting for unfinished jobs....

但是,我不知道这个错误是否会破坏一切。另外,即使编译完全没问题,我如何测试我的“新编译的Linux”?因为我添加了一个系统调用,我想测试它是否有效......我发现了一些关于 update-initramfs 但我没有看到链接/点,因为我编译的内核不是一个 Ubuntu。

最佳答案

构建根

https://buildroot.org/

Buildroot 是执行此操作的绝佳方式。

在很少的命令中它:

  • 下载 GCC 并生成交叉编译器
  • 下载Linux内核、ulibc等并生成根镜像
  • 下载 QEMU 并为您编译

对于 aarch64,命令是:

git clone https://github.com/buildroot/buildroot
cd buildroot
git checkout 2018.02
make qemu_aarch64_virt_defconfig
printf '
BR2_CCACHE=y
BR2_PACKAGE_HOST_QEMU=y
BR2_PACKAGE_HOST_QEMU_LINUX_USER_MODE=n
BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE=y
BR2_PACKAGE_HOST_QEMU_VDE2=y
' >>.config
make olddefconfig
time make BR2_JLEVEL="$(nproc)" HOST_QEMU_OPTS='--enable-sdl --with-sdlabi=2.0'
./output/host/usr/bin/qemu-system-aarch64 \
  -M virt \
  -cpu cortex-a57 \
  -nographic \
  -smp 1 \
  -kernel output/images/Image \
  -append "root=/dev/vda console=ttyAMA0" \
  -netdev user,id=eth0 \
  -device virtio-net-device,netdev=eth0 \
  -drive file=output/images/rootfs.ext4,if=none,format=raw,id=hd0 \
  -device virtio-blk-device,drive=hd0 \
;

您现在留在 shell 上,您可以使用用户名 root(无密码)登录。

QEMU 引导命令记录在 Buildroot 中:https://github.com/buildroot/buildroot/blob/2018.02/board/qemu/aarch64-virt/readme.txt

然后要使用您自己的 Linux 内核源代码,您基本上只需要使用 LINUX_OVERRIDE_SRCDIR,如以下解释:How to modify the source of Buildroot packages for package development?

然后基本上是免费的,您还可以:

我已经自动化并记录了所有这些事情 on this GitHub repo .为了使内核开发更好,那:

  • repo 直接编译内核而不是通过 Buildroot
  • 提供运行和 GDB 调试内核的快捷方式

在以下位置提及的其他 ISA:https://cirosantilli.com/linux-kernel-module-cheat/#buildroot-hello-world

在 Ubuntu 18.04 中测试。

关于linux - 如何下载 Torvalds Linux Kernel master,(重新)编译它,并使用 QEMU 引导它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47557262/

相关文章:

php - SNMP Php 无响应,在 linux shell 中工作

java - 如何限制Java VM整体内存消耗?

linux - 将 Ext4 打补丁并编译为内核模块

build - 为 QEMU 构建 TSAN,找不到 longjmp buf

qemu - 如何在没有 TCG 和 KVM 的情况下运行 QEMU

linux - 无法远程连接到 Apache 服务器

java - 无法从 opencv 处理 unix 上的图像,但相同的程序可在 windows 上运行

c - obj-y += something/in linux kernel Makefile 是什么意思?

linux-kernel - 将数据从 Linux 内核缓冲区零拷贝移动到硬盘

linux - SCHED_DEADLINE 的 sched_setaffinity()