這是一篇關于關于嵌入式Linux作業系統知識點的文章,希望通過此,大家能溫故了解Linux和嵌入式的知識點概念。
1. Linux系統組成
使用者角度:由内到外,依次是:核心-》系統程式(工具)-》shell-》使用者工具;
開發者角度:分兩部分,軟體與硬體:硬體是基礎,軟體包括兩部分:系統軟體和使用者軟體,其中系統軟體包含驅動程式。系統軟體主要實作對系統軟、硬體資源的管理,使用者軟體主要根據具體需求實作相應功能。
靜态角度:以PC為例的話,包括:BIOS、Grub、核心、根檔案系統;以嵌入式系統為例的話,包括:Bootloader、核心、根檔案系統。
2. Linux檔案系統主要目錄作用:
/bin:普通指令;
/sbin:系統指令;
/lib:動态庫預設位置;
/dev:裝置檔案目錄;
/etc:配置檔案所在目錄;
/root:root使用者所在目錄;
/home:普通使用者所在目錄
3. linux常見指令:
ls:檢視目錄檔案或其屬性;
cp:拷備
rm:删除
mv:剪切、重命名
tar:打包、壓縮、解壓、拆包,常用操作:
打包壓縮:tar -jcvf file.tar.bz2 file //注:前面的”-”也可省掉,采用bsd模式
tar -zcvf file.tar.gz file
解壓拆包:tar -jxvf file.tar.bz2
tar -zxvf file.tar.gz
man:查系統指令、庫函數等
tab:用于自動補齊檔案名
---------------------------------------------------------------------
4. 嵌入式系統概念:以應用為中心、以計算機技術為基礎,軟、硬體可裁剪,對性能、可靠性、功耗、體積等有嚴格要求的專用計算機系統。
5. 靜态角度看嵌入式Linux系統構成:bootloader、核心、根檔案系統
6. 本地開發:在一種平台上完成編輯、編譯、調試、運作的開發模式;
交叉開發:在一種平台上完成編輯、編譯、調試,在另一種平台上運作的開發模式。通常采用的模式為主控端——目标機。
7. 嵌入式系統軟體分類:系統軟體、應用軟體。前者用于完成系統軟、硬體資源,後者用于滿足使用者具體應用需求。
8. 常用交叉工具:arm-linux-gcc/as/ld/ar等。
9. 嵌入式Linux系統在emmc上布局:最開頭部分放置bootloader,然後放置核心,通常核心與bootloader之間會空一些區域用于存放系統啟動參數,其他區域放置根檔案系統或其他擴充檔案系統。
10. gcc編譯四個階段:預處理、編譯、彙編、連結。
預處理:gcc -E -o hello.i hello.c
編譯: gcc -S -o hello.s hello.i
彙編: gcc -c hello.s -o hello.o
連結: gcc hello.o -c hello
執行: ./hello
11. 采用gdb調試程式時,在編譯程式時需使其包含調試資訊,編譯時需加“-g”選項。
12. bootloader概念:在系統啟動前或應用程式執行前,首先執行的一小段代碼。
13. bootloader作用:初始化硬體,建立記憶體映射,為系統啟動準備環境。
14. bootloader不屬于核心,其與平台相關的代碼采用彙編編寫,該部分程式不具備可移植性。
- ARM上電後從0位址開始執行。是以,需将uboot映射到0位址處。
16. bootloader程式分兩階段:彙編、C。前者完成模式切換、關MMC、看門狗、中斷等,初始化時鐘、記憶體、可信域,拷備uboot部分代碼,設定棧,跳到C部分(board_init_f());彙編階段初始化本階段所需硬體,等一小會(要麼進uboot系統,要麼設定核心參數、啟動核心)。
---------------------------------------------------------------------
17. uboot常用指令:
- help; //查指令集,查具體指令
- mmc類指令:
- 環境變量類:setenv、editenv、saveenv、printenv(pri)
-
指令序列定義:用setenv定義,指令序列用雙引号括起,各指令用分号分隔。
指令序列運作:run 指令序列變量名
18. 與核心啟動相關的兩個重要環境變量:
bootcmd:自啟動指令序列;
bootargs:自啟動指令參數;以實驗時bootargs取值為例,詳細說明每一段的作用。
“root=/dev/nfs” --告訴核心根目錄是網絡中的共享
“nfsroot=$serverip:/opt/rootfs” --共享的目錄在哪裡
“ip=$ipaddr” --開發闆的ip位址
“ethmac=$usbethaddr” --開發闆的mac位址
“console=ttySAC0,115200” --核心啟動時,資訊向哪裡列印,ttySAC0指的是開發闆的序列槽0。
“init=/sbin/init” --告訴核心,核心啟動後,第一個要啟動的程式是什麼,也就是1号程序。
19. 核心配置4種方法:make config、make menuconfig、make gconfig、make xconfig
21. 核心最終配置檔案為:.config
22. 核心編譯:make,可用選項:-jn,采用n線程;v=1,完整資訊輸出;重定向(略)
23. Linux核心編譯的最終結果:zImage,位置在arch/arm/boot下,是一個可執行檔案。
24. Linux核心配置系統三部分:Makefile、Kconfig、以及配置工具。其中,Makefile和Kconfig通過.config檔案聯系起來。
25. zImage生成過程:(了解),執行make時,讀取.config檔案,根據其中的配置項,再由Makefile對相應目錄下源檔案進行編譯,生成*.o,之後對各目錄下的*.o檔案進行合并得到built-in.o,再對各個built-in.o檔案進行連結,得到最原始的核心檔案vmlinux,接着對vmlinux檔案進行瘦身,去除調試資訊、符号表等内容,進行格式轉換(轉成二進制),生成arch/arm/boot/Image檔案,再接着利用gzip對其進行壓縮,生成arch/arm/boot/compressed/piggy.gz檔案,然後編譯head.s、misc.s等檔案,将piggy.o一起合并為壓縮的、包含自解壓工具的核心檔案arch/arm/boot/compressed/vmlinux,之後再進行格式化轉換得到zImage。
26. 根檔案系統概念:存放運作、維護系統所必須的各種工具軟體、庫、配置檔案及其他檔案的地方。
27. 根檔案系統建構方法:按照FHS标準建立目錄,然後填充目錄:填充指令(/bin、/sbin、/usr/bin、/usr/sbin)、填充庫(/lib、/usr/lib)、填充/etc(initfs、inittab、profile)、填充/dev(null、console)
28. init執行完整流程:
- 手動建立裝置檔案:mknod 檔案名 類型 主裝置号 次裝置号
-
裝置号:dev_t類型資料,高12位主裝置号,低20位次裝置号
宏: MAJOR()、MINOR()、MKDEV()
-
自動建立裝置檔案:
class_create()
device_create()
銷毀:
device_destroy()
class_destroy()
-
虛位址概念:作業系統啟動MMU後,CPU經MMU擷取的位址。
實位址概念:實體位址。
-
位址映射:
建立映射: 虛位址=ioremap(實位址,大小)
取消映射: iounmap(虛位址)
- 并發:真并發、僞并發,及原因。
- 臨界區的概念:會産生并發通路,且包含共享資源的代碼段。
- 原子操作:整型原子操作、位原子操作。僅用于保證這兩種類型的變量在進行操作時具有不可分割性。
- 死鎖:單程序死鎖、多程序多資源死鎖。
- 其他同步:自旋鎖、讀寫自寫鎖、信号量、讀寫信号量、互斥體,掌握各種同步方法的特點。