如何下载Torvalds Linux内核主机,(重新)编译它,并用QEMU启动它?

问题描述 投票:1回答:2

几天以来,我正在开发一个小项目,以发现内核编程。但是,我在互联网上阅读了很多内容并在内核编译之前提出了一个问题,我觉得在某些时候仍然丢失了。

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

  • 下载内核源代码:qazxsw poi
  • 拉开拉链
  • 启动终端并运行: https://github.com/torvalds/linux vagrant init vagrant up
  • 连接后,我键入: vagrant ssh为了进入Linux源解压缩文件夹 cd /vagrant/linux我只是按了确定/保存 make menuconfig

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

sudo make -j 4 && sudo make modules_install -j 4 && sudo make install -j 4

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

linux linux-kernel qemu macos-high-sierra
2个回答
1
投票

好的工作请记录下来的工作并将其发布在git / blog上,以便在mac OS X上编译linux内核所需的调整。

现在回答你的问题。

  1. 运行vmware / virtualbox的最简单方法。因为他们是直截了当的。然后scp图像和测试。
  2. QEMU是测试内核的最佳方式。但普通人群并未广泛使用。还需要一点努力才能让它发挥作用。还需要编译Root FS来启动,因为你想测试系统调用。(你可以使用你的系统调用编写c代码并将其定义为init进程)

我希望我已经回答你了。


1
投票

Buildroot里面

update-initramfs

Buildroot是一个很棒的方法来做到这一点。

在极少数命令中:

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

对于aarch64,命令是:

https://buildroot.org/

然后使用你自己的Linux内核源代码,你基本上只需要使用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 ,如下所述:LINUX_OVERRIDE_SRCDIR buildroot-packages-for-package-development / 44984714#44984714

然后基本上免费,你也有办法:

  • 交叉编译用户态测试以查看内核正在执行的操作
  • 从树中交叉编译内核模块,这是直接与内核交互而不触及主线树的好方法
  • GDB调试内核

我已经自动化并记录了所有这些事情How to modify the source of Buildroot packages for package development?

在Ubuntu 18.04中测试过。

© www.soinside.com 2019 - 2024. All rights reserved.