几天以来,我正在开发一个小项目,以发现内核编程。但是,我在互联网上阅读了很多内容并在内核编译之前提出了一个问题,我觉得在某些时候仍然丢失了。
如果我需要做一些内核编程,我认为使用Linus Torvalds的Linux源代码将是最好的开始。所以我做了以下(来自MacOS High Sierra):
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。
好的工作请记录下来的工作并将其发布在git / blog上,以便在mac OS X上编译linux内核所需的调整。
现在回答你的问题。
我希望我已经回答你了。
Buildroot里面
update-initramfs
Buildroot是一个很棒的方法来做到这一点。
在极少数命令中:
对于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
然后基本上免费,你也有办法:
我已经自动化并记录了所有这些事情How to modify the source of Buildroot packages for package development?。
在Ubuntu 18.04中测试过。