帶你閱讀linux內核源碼:下載源碼、編譯內核並運行一個最小系統

要學習linux內核,先要能夠編譯內核,還需要了解內核如何啟動根文件系統。這樣你才能在修改linux內核代碼之後,完成驗證的過程。

本文教你完成下列過程:

1.下載linux並編譯linux內核源碼

2.編譯busybox

3.製作一個最小的根文件系統

4.qemu啟動你編譯好的內核和根文件系統

帶你閱讀linux內核源碼:下載源碼、編譯內核並運行一個最小系統

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且需要安裝交叉編譯器。

<code>

export

ARCH=x86

/<code>

2.配置board config,此處配置為 x86_64_defconfig。好了,我們點好菜了,菜單就是x86_64_defconfig

<code>/<code>

3.配置內核

這一步其實是對第2步的菜單進行微調,我們需要內核支持ramdisk驅動,所以需要選中如下配置:

<code>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)/<code>

4.編譯內核

<code>/<code>

編譯成功後的內核位於:arch/x86_64/boot/bzImage

帶你閱讀linux內核源碼:下載源碼、編譯內核並運行一個最小系統

下載buysbox源碼,下載地址:

https://busybox.net/downloads/

我使用的版本是busybox-1.30.0

1.解壓buysbox源碼

<code># 

tar

xvf

busybox-1

.30

.0

.tar

.bz2

/<code>

2.配置buysbox源碼

在這裡我們把busybox配置為靜態編譯,這樣busybox在運行的時候就不需要額外的動態鏈接庫了。

<code> 
Busybox Settings  --->
      Build Options  --->
            [ ] 

Build BusyBox

as

a

static

binary

(

no shared libs

)

/<code>

3.編譯和安裝

<code>#

make

&&

make

install/<code>

4.編譯完成後的busybox就安裝在源碼根目錄下的_install目錄了,我們進入_install目錄,補充一些必要的文件或目錄,相關的shell命令如下:

<code> 
 
 
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

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

:

:sysinit

:/etc/init

.d/rcS

:

:respawn

:-/bin/sh

:

:askfirst

:-/bin/sh

:

:cttlaltdel

:/bin/umount

-a -r /<code>

這樣一個最小的、完整的可以被內核啟動的文件系統就齊活啦。

帶你閱讀linux內核源碼:下載源碼、編譯內核並運行一個最小系統

製作根文件系統鏡像文件。

思路:

1.先製作一個空的鏡像文件;

2.然後把此鏡像文件格式化為ext3格式;

3.然後把此鏡像文件掛載,並把根文件系統複製到掛載目錄;

4.卸載該鏡像文件。

5.打成gzip包。

<code> 
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 /<code>

最終生成的文件系統鏡像名字為:rootfs.img.gz

準備好了內核和文件系統鏡像,幸福的一刻馬上來臨了:

帶你閱讀linux內核源碼:下載源碼、編譯內核並運行一個最小系統

通過qemu模擬器啟動我們自己編譯的內核和文件系統:

<code> 
    

./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

/<code>

這樣一個完整的最小linux系統就起來啦:

帶你閱讀linux內核源碼:下載源碼、編譯內核並運行一個最小系統

好了,經過以上的步驟,你可以自己編譯一個內核和文件系統。有了這樣的基礎,你在之後就可以自由的修改linux內核代碼並run起來進行驗證啦。

記得關注“技術簡說”,持續分享linux內核知識,讓你一步一步成為linux內核高手。


分享到:


相關文章: