Emi*_*m23 1 linux qemu linux-kernel macos-high-sierra
几天来,我正在研究一个小项目,以探索内核编程。然而,我在网上看了很多关于内核编译的问题,并在之前问过一个问题,但我在某些时候仍然感到迷茫。
如果我需要进行一些内核编程,我认为使用 Linus Torvalds 的 Linux 源代码将是最好的起点。所以我做了以下操作(来自 MacOS High Sierra):
vagrant initvagrant upvagrant sshcd /vagrant/linux 为了进入Linux源解压文件夹make menuconfig 我只是按了确定/保存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....
Run Code Online (Sandbox Code Playgroud)
但是,我不知道这个错误是否会破坏一切。另外,即使编译完全没问题,我该如何测试我的“新编译的Linux”呢?因为我添加了一个系统调用,我想测试它是否有效...我找到了一些关于update-initramfs但我没有看到链接/点,因为我编译的内核不是 Ubuntu。
构建根
Buildroot 是一个很棒的方法来做到这一点。
在很少的命令中它:
对于 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 \
;
Run Code Online (Sandbox Code Playgroud)
您现在处于 shell 中,可以使用用户名root(无密码)登录。
QEMU 启动命令记录在 Buildroot 本身中:https://github.com/buildroot/buildroot/blob/2018.02/board/qemu/aarch64-virt/readme.txt
然后,要使用您自己的 Linux 内核源代码,您基本上只需LINUX_OVERRIDE_SRCDIR按照以下说明使用:如何修改 Buildroot 软件包的源代码以进行软件包开发?
然后基本上免费你还可以:
我已经在这个 GitHub 存储库上自动化并记录了所有这些事情。为了使内核开发更好,需要:
其他 ISA 提及: https: //cirosantilli.com/linux-kernel-module-cheat/#buildroot-hello-world
在 Ubuntu 18.04 中测试。