Linux 核心來了

2021-09-21 00:03:09 字數 4236 閱讀 9990

1991 年,linus torvalds 同學入手了一台個人計算機(pc)。

當時可用的作業系統有商用 unix 和 pc windows,兩者都**不菲,於是 linus 決定寫乙個作業系統(核心)來驅動自己的計算機(?)。

其參考 unix 實現並用自己的名字與 unix 合併來命名,即 linux。

sudo apt-get update

sudo apt-get install qemu-kvm busybox-static -y

$ ll /vmlinuz

lrwxrwxrwx 1 root root 30 2月 24 21:45 /vmlinuz -> boot/vmlinuz-4.4.0-116-generic

$ ll -h /boot/vmlinuz-4.4.0-116-generic

-rw------- 1 root root 6.9m 2月 13 08:57 /boot/vmlinuz-4.4.0-116-generic

$ sudo file /boot/vmlinuz-4.4.0-116-generic

/boot/vmlinuz-4.4.0-116-generic: linux kernel x86 boot executable bzimage, version 4.4.0-116-generic (buildd@lgw01-amd64-021) #140-ubuntu smp mon , ro-rootfs, swap_dev 0x6, normal vga

沒有錯,這是乙個只有6.9m的單檔案二進位制檔案,

就是這個只有幾 m 的單檔案負責啟動計算機,管理硬體資源,提供程式執行環境(詳情參考作業系統課程)。

從前使用古董 bios 主機板和古董核心時,把核心二進位制檔案刻在磁碟起始處(硬編碼核心啟動引數),

bios 主機板通電自檢後嘗試載入磁碟第乙個扇區的**,即核心引導**,隨後核心完成自載入。

現代計算機軟硬體發展成熟,通常使用引導器(grub)載入核心

測試核心啟動最簡便的方式就是使用 qemu 虛擬機器。kvm/qemu 廣泛應用於 openstack 等雲計算環境和我的個人電腦。

建立並啟動一台虛擬機器:

qemu-system-x86_64 -enable-kvm -cpu host -smp 1 -m 1g
執行後可看到虛擬機器啟動失敗。當然會失敗,因為這是臺裸機。

qemu 虛擬機器還支援直接載入核心檔案(類似引導器),簡直不要太方便。

sudo cp -l /vmlinuz ./

sudo chown $user: ./vmlinuz

qemu-system-x86_64 -enable-kvm -cpu host -smp 1 -m 1g -kernel ./vmlinuz

果然,核心愉快的載入起來了,同時愉快的報錯:"unable to mount root fs"。

虛擬機器沒有磁碟,找不到根檔案系統,意料之中。

沒有根檔案系統?不存在的。新建乙個檔案做硬碟,建立檔案系統:

truncate -s 1g sda.raw

mkfs.ext4 sda.raw -f

啟動虛擬機器:

執行結果:

核心只負責準備好執行環境,系統服務管理、使用者互動等是 init 和 shell 的事。所以核心叫核心,shell 叫外殼嘛。

核心啟動完成後嘗試執行 init,預設路徑/sbin/init,很遺憾這個檔案不存在。

核心引數init=可自定義 init 檔案路徑。

init 怎麼配置,要裝一套系統嗎,好怕怕。沒關係,祭出上古神器 busybox(盒子很忙)。

busybox 可提供基本 shell 環境,其只有乙個單檔案可執行檔案。將其拷貝到虛擬機器硬碟,建立/bin/sh軟鏈結。

sudo mount -o loop sda.raw /mnt/

sudo rsync -rtploi /bin/busybox -r /mnt/

sudo ln -s /bin/busybox /mnt/bin/sh

sudo umount /mnt

再次啟動虛擬機器:

執行結果:

嘗試配置更完整的系統環境。

busybox 包含基本的 init 能力,類似 sysv-init,支援使用/etc/inittab配置檔案。

經測試無/etc/inittab檔案時其嘗試執行/etc/init.d/rcs初始化。

sudo chroot /mnt/ /bin/busybox --install -s /bin/

( cd /mnt/ && sudo mkdir dev/ proc/ sys/ etc/ tmp/ var/ run/ -p )

#!/bin/sh

set -e

if test -z "$(ls dev/)" ; then

mount -t devtmpfs devtmpfs dev/

fimkdir -p dev/pts

for e in "proc proc proc/" "sysfs sysfs sys/" "devpts devpts dev/pts/" ; do mount -t $ ; done

# todo fix root fs readonly, make it writable

mount -o remount,rw /

if ! ( test -d var/run || ( test -l var/run && test "$(readlink var/run)" = /run ) ) ; then

ln -sf /run var/

fimount -t tmpfs -o nosuid,noexec,size=100m,mode=755 tmpfs run/

mkdir run/lock

結果如下:

有同學會問,是不是只要在 rcs 裡增加應用啟動指令碼(或者配置 inittab),就可以做乙個「應用容器」了呢?是的。

核心必須保持小而精

如今 linux 社群發展成熟而龐大,包含豐富的硬體驅動和核心模組等。

linux 支援兩階段啟動,啟動時需要的驅動、模組和指令碼等,被放在乙個叫 initrd 的地方,以保持核心小而精。

比如 linux 網路啟動(本地無盤),網絡卡驅動、配置指令碼、nfs 客戶端等都放在 initrd 中。

第一階段基礎核心啟動,第二階段再執行 initrd 。

系統上看,每個核心檔案對應乙個 initrd 檔案:

$ ll -h /boot/vmlinuz-4.4.0-116-generic /boot/initrd.img-4.4.0-116-generic --sort=none

-rw------- 1 root root 6.9m 2月 13 08:57 /boot/vmlinuz-4.4.0-116-generic

-rw-r--r-- 1 root root 38m 2月 24 21:46 /boot/initrd.img-4.4.0-116-generic

initrd 定製相對自由,可以包含很多東西(通常還附送 busybox)。

通常使用通用型核心和 initrd,以相容各種硬體和環境。

如果針對特定硬體和環境定製,那麼核心和 initrd 可以做的很小,即嵌入式場景,現在也叫 iot 。

兩階段啟動怎麼玩?且聽下回分解。

Linux核心 了解Linux核心搶占

目錄 無強制搶占 可搶占核心 自願核心搶占 完全實時搶占 在配置linux核心時,我們可以設定一些影響系統行為的引數。您可以使用不同的優先順序,排程類和搶占模型。了解並選擇正確的引數非常重要。在這篇文章中,我將介紹不同的搶占模型,以及每種模型如何影響使用者和核心行為 如果配置核心 使用make me...

Linux 核心 vs Windows 核心

windows 和 linux 可以說是我們比較常見的兩款作業系統的。windows 基本占領了電腦時代的市場,商業上取得了很大成功,但是它並不開源,所以要想接觸原始碼得加入 windows 的開發團隊中。這兩個作業系統各有千秋,不分伯仲。作業系統核心的東西就是核心,這次我們就來看看,linux 核...

Linux 核心 vs Windows 核心

作者丨小林coding windows 和 linux 可以說是我們比較常見的兩款作業系統的。windows 基本占領了電腦時代的市場,商業上取得了很大成功,但是它並不開源,所以要想接觸原始碼得加入 windows 的開發團隊中。這兩個作業系統各有千秋,不分伯仲。作業系統核心的東西就是核心,這次我們...