要学习linux内核,先要才能编译内核,还须要了解内核怎么启动根文件系统。这样你能够在更改linux内核代码以后,完成验证的过程。

本文教你完成下述过程:

1.下载linux并编译linux内核源码

2.编译busybox

3.制做一个最小的根文件系统

4.qemu启动你编译好的内核和根文件系统

linux源码下载地址:

我选择的版本是:4.9.229

下载到本地,解压,之后步入linux-4.9.229目录:

linux设备驱动开发详解 源码_linux驱动源码分析_linux驱动开发工具

1.指定硬件体系构架。

为了降低安装编译器的过程,我在本例中使用的是x86,由于我的开发环境就是x86。假如你要编译arm的内核,则指定ARCH=arm且须要安装交叉编译器。

# export ARCH=x86

2.配置boardconfig,此处配置为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)

linux驱动开发工具_linux驱动源码分析_linux设备驱动开发详解 源码

4.编译内核

# make

编译成功后的内核坐落:arch/x86_64/boot/bzImage

下载buysbox源码,下载地址:

我使用的版本是busybox-1.30.0

1.解压buysbox源码

# tar xvf busybox-1.30.0.tar.bz2

2.配置buysbox源码

在这儿我们把busybox配置为静态编译,这样busybox在运行的时侯就不须要额外的动态链接库了。

# make menuconfig
Busybox Settings  --->
      Build Options  --->
            [*] Build BusyBox as a static binary (no shared libs)

3.编译和安装

#make && make install

4.编译完成后的busybox就安装在源码根目录下的_install目录了linux系统下载,我们步入_install目录,补充一些必要的文件或目录linux设备驱动开发详解 源码linux设备驱动开发详解 源码,相关的shell命令如下:

# mkdir etc dev mnt
# mkdir -p etc/init.d/
# vim etc/fstab
proc  /proc proc  defaults 0 0
temps /tmp  rpoc  defaults 0 0
none  /tmp  ramfs defaults 0 0
sysfs /sys  sysfs defaults 0 0
mdev  /dev  ramfs defaults 0 0
# vim etc/init.d/rcS
mkdir -p /proc
mkdir -p /tmp
mkdir -p /sys
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -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 

这样一个最小的、完整的可以被内核启动的文件系统就齐活啦。

linux设备驱动开发详解 源码_linux驱动开发工具_linux驱动源码分析

制做根文件系统镜像文件。

思路:

1.先制做一个空的镜像文件;

2.之后把此镜像文件低格为ext3格式;

3.之后把此镜像文件挂载,并把根文件系统复制到挂载目录;

4.卸载该镜像文件。

5.打成gzip包。

#!/bin/bash
rm -rf rootfs.ext3
rm -rf fs
dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
mkdir fs
mount -o loop rootfs.ext3 ./fs
cp -rf ./_install/* ./fs
umount ./fs
gzip --best -c rootfs.ext3 > rootfs.img.gz 

最终生成的文件系统镜像名子为:rootfs.img.gz

打算好了内核和文件系统镜像linux培训班,幸福的一刻马上将至了:

通过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驱动源码分析_linux驱动开发工具_linux设备驱动开发详解 源码

好了,经过以上的步骤,你可以自己编译一个内核和文件系统。有了这样的基础,你在以后就可以自由的更改linux内核代码并run上去进行验证啦。

记得关注“技术简说”,持续分享linux内核知识,让你一步一步成为linux内核大侠。

本文原创地址:https://www.linuxprobe.com/lnhrhqdgwjxt.html编辑:刘遄,审核员:暂无