學習嵌入式Linux的筆記和體會

2021-03-31 15:07:24 字數 4658 閱讀 4663

以下是我初次學習嵌入式linux的筆記和體會,製作了軟盤mini***應用,在此基礎上也清楚了軟盤linux的實現,並利用busybox實際製作了軟盤上的linux系統。希望能給新手一些幫助和啟發,同時也請高手批評指正。

yihui,

eazi@163.*** 2023年2月12日

乙個典型的桌面linux系統包括3個主要的軟體層---linux核心、c庫和應用程式**。

核心是唯一可以完全控制硬體的層,核心驅動程式代表應用程式與硬體之間進行會話。核心之上是c庫,負責把posix api轉換為核心可以識別的形式,然後呼叫核心,從應用程式向核心傳遞引數。應用程式依靠驅動核心來完成特定的任務。

在設計嵌入式應用的時候,可以不按照這種層次,應用程式越過c庫直接和核心會話,或者把應用和核心**在一起,甚至可以把應用寫為核心的乙個執行緒,在核心中執行,雖然這樣在移植上帶來了困難,但考慮嵌入式系統對尺寸要求小的特點,是完全可行的。不過我們使用三層軟體結構的模式來學習嵌入式linux將會是我們認識更清晰,簡單可行並使應用具有彈性。

再進行實際操作之前,先來搞清楚幾個基礎知識。

核心裝載器loader,它的作用是把核心從外部儲存器,移動到記憶體中。它只作這個事情,一旦完成了調入核心的工作,loader就跳轉到核心位置開始執行。不同架構有不同的loader,在x86結構的pc上,通常使用的loader有lilo,grub,syslinux,syslinux在嵌入式linux中也同樣工作。其他非x86架構的應用中,你必須使用專門的loader,或者自己編寫loader來裝入核心。也有不使用loader的情況,系統加電以後,核心直接從燒錄有映象的flash上開始執行。

核心,一旦核心開始執行,它將通過驅動程式初始化所有硬體,這可以從我們的pc機監視器的輸出看出來,每個驅動程式都列印一些有關它的資訊。初始化完成後,計算機就準備執行嵌入式應用。也許乙個,也許是多個應用程式組成了嵌入式應用,但通常首先呼叫的是init(通過loader 向核心傳入init=/program 可以定製首先執行的程式)。桌面linux中,init會讀取/etc/inittab檔案,來決定執行級別和哪些指令碼和命令。嵌入式應用中,可以根據實際的情況決定是否使用標準的init執行方式,也許這個init是個靜態程式,它能夠完成我們的嵌入應用的特定任務,那完全不用考慮inittab了。

initrd檔案系統,initrd以一種把核心從儲存介質裝入到記憶體的相同的機制來裝入乙個小型檔案系統。這個檔案系統最好是以壓縮的方式儲存在介質上的,解壓縮到ram盤上。通過使用initrd,包含有核心驅動和啟動指令碼的小檔案系統,就可以直接從介質上和核心一起啟動起來,核心屆壓縮這個檔案系統,並執行這個檔案系統上叫做/linuxrc的指令碼檔案,這個指令碼通常會把啟動過程中所需要的驅動程式裝入。指令碼退出以後,initrd檔案系統也卸下了,啟動過程進入真正初始化過程。對於嵌入式來講,可以將需要的應用軟體都執行在這個initrd檔案系統上,只要/linxrc檔案不結束,核心啟動過程的其他部分就不會繼續。

做個試驗:

cp /boot/initrd-2.4.20.img /tmp

cd /tmp

mv initrd-2.4.2-.img initrd.img.gz

gunzip initrd.img.gz

mount -o loop initrd.img /mnt

cd /mnt

ls

cat linuxrc 可以看到裡面執行了載入了兩個模組的操作,你在啟動linxu的時候會看見螢幕列印資訊。

入門試驗,製作乙個簡單的應用:我們使用一張軟盤啟動一台假象的只有乙個串列埠,鍵盤輸入,顯示輸出的x86架構的linux系統,執行的特定應用就是執行mini***,通過串列埠撥號。需要軟體: mini***-xx.src.tar.gz 和 syslinux-xx.tar.gz,xx代表版本號 ,開始之前,在主目錄建立乙個目錄,來釋放這兩個軟體包:

cd

mkdir -p project/minilinux

cd project/minilinux

tar zxvf mini***-xx.src.tar.gz

tar zxvf syslinux-xx.tar.gz

1、裁減linux核心(需要系統安裝核心檔案包)

配置核心的時候,我們需要選擇這些:摸塊編入核心,386處理器、物理記憶體off、支援elf、標準pc軟盤、支援ram盤(4096)、支援initial ram disk (initrd)、虛你終端、虛擬終端控制台、標準串列埠、ext2檔案系統、控制台驅動,vga text console、dos fat、msdos檔案系統,其他的都可以不要,這樣核心編出來較小。

步驟:

cd /usr/src/linux

make mrproper

make xconfig

make dep && make bzimage

得到 /usr/src/linux/arch/i386/boot/目錄的核心檔案bziamge。

2、編譯乙個靜態的mini*** ,把它作為將來的linuxrc

cd mini***-xx/src

vi makefile

修改下面這行

mini***: $(mini***_objects) $(mini***_dependencies)

rm -f mini*** 下面的行加上 -static,連線為靜態程式

(link) -static $(mini***_ldflags) $(mini***_objects) $(mini***_ldadd) $(libs)

vi mini***.c

找到 if (real_uid==0 && dosetup==0 ) 刪除這個判斷條件語句,主要是用於許可權判斷的,因為這個嵌入應用不關注許可權問題,否則會出錯。

make

得到可執行程式,用ldd 檢查一下是不是靜態程式。

3、準備initrd壓縮檔案image.gz

dd if=/dev/zero of=image bs=1k count=4096

losetup /dev/loop0 image

mke2fs -m 0 /dev/loop0

mounmt -t ext2 /dev/loop0 /mnt/

mkdir -p /mnt/dev

mkdir -p /mnt/usr/share/terminfo/l/

cd /dev

cp -a consle null tty tty0 zero mem /mnt/dev

cp -p /usr/share/terminfo/l/linux /mnt/usr/share/terminfo/l/linux

cp ~/project/minilinux/min***/src/mini*** /mnt/linuxrc

umount /mnt

losetup -d /dev/loop0

sync

gzip -9 image

4、製作軟盤引導,並拷貝檔案 bzimage image.gz 到軟盤

a.使用grub

fdformat /dev/fd0

mke2fs /dev/fd0

mount /mnt/fd0 /mnt/floppy

mkdir -p /mnt/floppy/boot/grub

cp /boot/grub/stage1 /boot/grub/stage2 /mnt/floppy/boot/grub

執行 grub,在軟盤上建立引導

grub > root (fd0)

grub > setup (fd0)

grub > quit

cp /usr/src/linux/arch/i386/boot/bzimge /mnt/floppy

cp ~/porject/minilinux/image.gz /mnt/floppy

編輯 /mnt/floppy/boot/grub/grub.conf

default =0

timeout-=10

title minilinux

root (fd0)

kernel /bzimage

initrd /image.gz

卸下軟盤

umount /mnt/floppy

b. 使用syslinux

fdformat /dev/fd0

mkfs.msdos /dev/fd0

mount -t msdos /dev/fd0 /mnt/floppy

cp /usr/src/linux/arch/i386/boot/bzimge /mnt/floppy

cp ~/porject/minilinux/image.gz /mnt/floppy

cp syslinux-xx/ldlinxu.sys /mnt/floppy

cat > /mnt/floppy/syslinux.cfg

label linux

kernel bzimage

umont /mnt/floppy

syslinux-xx/syslinux /dev/fd0

sync

5、用軟盤啟動計算機,如果幸運,mini***的執行畫面出現在螢幕上。

到此,我們的單應用嵌入式linux做好了,但它還很簡陋,沒有什麼實際用途,但通過這個實驗,可以了解嵌入式系統的大致結構和開發過程。在進行實際的嵌入式開發時,通常要在pc機上借助嵌入式linux開發工具包,如:uclinux,bluecat等,對相應的硬體平台(目標機)進行軟體編寫編譯,除錯成功後,將核心及應用程式寫入到目標機的儲存器中,從而完成整個應用。

嵌入式Linux學習筆記

嵌入式linux學習筆記 學習 一 linux的優勢 1 廣泛的硬體支援 linux能夠支援x86 arm mips alpha powerpc等多種體系結構,目前已經成功移植到數十種硬體平台,幾乎能夠執行在所有流行的cpu上。linux有著異常豐富的驅動程式資源,支援各種主流硬體裝置和最新硬體技術...

嵌入式linux學習筆記

1 溢位 兩個數相加,如果最高位的進製和此高位的進製不同,則產生溢位。2 進製和溢位的概念不一樣。3 預取 取得是編譯後得到的機器 解碼 執行 4 arm的彙編指令長度是確定的,32位。5 一條彙編指令 條件碼 4bit 操作碼 分類碼 s 1bit 目的暫存器 4bit 源暫存器 4bit 立即數...

嵌入式Linux學習筆記(一)

一 安裝虛擬機器和ubuntu16.04 二 linux的主要目錄結構 bin 存放常用命令 boot 存放啟動程式 dev 存放裝置檔案 etc 存放啟動,關閉,配置程式與檔案 home 使用者工作跟目錄 lib 存放共享鏈結庫 root 超級使用者的工作目錄 sbin 系統管理員的常用管理程式 ...