天天看點

嵌入式作業系統基礎

這是一篇關于關于嵌入式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不屬于核心,其與平台相關的代碼采用彙編編寫,該部分程式不具備可移植性。

  1. ARM上電後從0位址開始執行。是以,需将uboot映射到0位址處。

16. bootloader程式分兩階段:彙編、C。前者完成模式切換、關MMC、看門狗、中斷等,初始化時鐘、記憶體、可信域,拷備uboot部分代碼,設定棧,跳到C部分(board_init_f());彙編階段初始化本階段所需硬體,等一小會(要麼進uboot系統,要麼設定核心參數、啟動核心)。

---------------------------------------------------------------------

17. uboot常用指令:

  1. help; //查指令集,查具體指令
  2. mmc類指令:
  3. 環境變量類:setenv、editenv、saveenv、printenv(pri)
  4. 指令序列定義:用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執行完整流程:

  1. 手動建立裝置檔案:mknod 檔案名 類型 主裝置号 次裝置号
  2. 裝置号:dev_t類型資料,高12位主裝置号,低20位次裝置号

    宏: MAJOR()、MINOR()、MKDEV()

  3. 自動建立裝置檔案:

    class_create()

    device_create()

    銷毀:

    device_destroy()

    class_destroy()

  4. 虛位址概念:作業系統啟動MMU後,CPU經MMU擷取的位址。

    實位址概念:實體位址。

  5. 位址映射:

    建立映射: 虛位址=ioremap(實位址,大小)

    取消映射: iounmap(虛位址)

  6. 并發:真并發、僞并發,及原因。
  7. 臨界區的概念:會産生并發通路,且包含共享資源的代碼段。
  8. 原子操作:整型原子操作、位原子操作。僅用于保證這兩種類型的變量在進行操作時具有不可分割性。
  9. 死鎖:單程序死鎖、多程序多資源死鎖。
  10. 其他同步:自旋鎖、讀寫自寫鎖、信号量、讀寫信号量、互斥體,掌握各種同步方法的特點。

繼續閱讀