带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统 |
您所在的位置:网站首页 › windows交叉编译linux内核 › 带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统 |
要学习linux内核,先要能够编译内核,还需要了解内核如何启动根文件系统。这样你才能在修改linux内核代码之后,完成验证的过程。 本文教你完成下列过程: 1.下载linux并编译linux内核源码 2.编译busybox 3.制作一个最小的根文件系统 4.qemu启动你编译好的内核和根文件系统 ![]() linux源码下载地址: https://mirrors.edge.kernel.org/pub/linux/kernel/ 我选择的版本是:4.9.229 https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.229.tar.xz 下载到本地,解压,然后进入linux-4.9.229目录: 1.指定硬件体系架构。 为了减少安装编译器的过程,我在本例中使用的是x86,因为我的开发环境就是x86。如果你要编译arm的内核,则指定ARCH=arm且需要安装交叉编译器。 # export ARCH=x86 2.配置board config,此处配置为 x86_64_defconfig。好了,我们点好菜了,菜单就是x86_64_defconfig # make x86_64_defconfig 3.配置内核 这一步其实是对第2步的菜单进行微调,我们需要内核支持ramdisk驱动,所以需要选中如下配置: General setup ---> ----> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support Device Drivers ---> [*] Block devices ---> RAM block device support (65536) Default RAM disk size (kbytes) 4.编译内核 # make 编译成功后的内核位于:arch/x86_64/boot/bzImage ![]() 下载buysbox源码,下载地址: https://busybox.net/downloads/ 我使用的版本是busybox-1.30.0 1.解压buysbox源码 # tar xvf busybox-1.30.0.tar.bz2 2.配置buysbox源码 在这里我们把busybox配置为静态编译,这样busybox在运行的时候就不需要额外的动态链接库了。 # make menuconfigBusybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs) 3.编译和安装 #make && make install 4.编译完成后的busybox就安装在源码根目录下的_install目录了,我们进入_install目录,补充一些必要的文件或目录,相关的shell命令如下: # mkdir etc dev mnt# mkdir -p etc/init.d/# vim etc/fstabproc /proc proc defaults 0 0tmpfs /tmp tmpfs defaults 0 0none /tmp ramfs defaults 0 0sysfs /sys sysfs defaults 0 0mdev /dev ramfs defaults 0 0# vim etc/init.d/rcSmkdir -p /procmkdir -p /tmpmkdir -p /sysmkdir -p /mnt/bin/mount -amkdir -p /dev/ptsmount -t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplugmdev -s# chmod 755 etc/init.d/rcS# vim etc/inittab::sysinit:/etc/init.d/rcS::respawn:-/bin/sh::askfirst:-/bin/sh::cttlaltdel:/bin/umount -a -r# chmod 755 etc/inittab# cd dev# mknod console c 5 1# mknod null c 1 3# mknod tty1 c 4 1 这样一个最小的、完整的可以被内核启动的文件系统就齐活啦。 ![]() 制作根文件系统镜像文件。 思路: 1.先制作一个空的镜像文件; 2.然后把此镜像文件格式化为ext3格式; 3.然后把此镜像文件挂载,并把根文件系统复制到挂载目录; 4.卸载该镜像文件。 5.打成gzip包。 #!/bin/bashrm -rf rootfs.ext3rm -rf fsdd if=/dev/zero of=./rootfs.ext3 bs=1M count=32mkfs.ext3 rootfs.ext3mkdir fsmount -o loop rootfs.ext3 ./fscp -rf ./_install/* ./fsumount ./fsgzip --best -c rootfs.ext3 > rootfs.img.gz 最终生成的文件系统镜像名字为:rootfs.img.gz 准备好了内核和文件系统镜像,幸福的一刻马上来临了: ![]() 通过qemu模拟器启动我们自己编译的内核和文件系统: # qemu-system-x86_64 \ -kernel ./linux-4.9.229/arch/x86_64/boot/bzImage \ -initrd ./busybox-1.30.0/rootfs.img.gz \ -append "root=/dev/ram init=/linuxrc" \ -serial file:output.txt 这样一个完整的最小linux系统就起来啦: ![]() 好了,经过以上的步骤,你可以自己编译一个内核和文件系统。有了这样的基础,你在之后就可以自由的修改linux内核代码并run起来进行验证啦。 ![]() 关注”技术简说“(头条同名),linux内核开发100讲免费视频教程,带你由浅入深学习linux内核源码。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |