Linux 之框架學習法
入門級:
Bootloader=Boot(啓動) + loader(加載)= 啓動內核 = 加載和啓動操作系統,確保內核正確加載並啓動,爲操作系統的正常運行創建必要的環境。
Boot 的目的:
最終目的:跳到 C 語言中;爲了 C 語言運行程序會進行一系列的初始化,系統一上電後如何通過一系列的設置讓軟件程序員進入 C 語言 / 更高級語言環境的開發,這個過程就是 boot 的主要目的。
Loader 的目的:
主要目的是開始執行應用邏輯,比如點燈:需要燈的接口開發;串口輸入輸出:需要串口編程;加載 linux 的內核:flash 的編程、網卡的編程、內核啓動前的初始化部分。根據不同的應用會有不同的變化。
1. 執行片外程序:在啓動內核之前會執行一些額外的程序,即片外程序,主要包括:初始化操作、硬件檢測、設置系統參數。目的是確保系統處於正確的狀態,併爲內核的加載和執行創建必要的條件。
2. 啓動內核: BootLoader 的作用就是啓動內核。
3. 生命週期、調用關係:
- 啓動階段:
-
開機:計算機啓動時,引導加載器(bootloader)負責加載操作系統內核。
-
內核初始化:內核初始化階段負責初始化硬件、創建進程、設置系統參數等。
-
用戶空間初始化:初始化進程(通常是 init 或者 systemd),該進程啓動用戶空間的各種服務和應用程序。
- 用戶空間運行:
-
用戶空間運行期間,用戶和應用程序與操作系統進行交互。
-
應用程序可以發起系統調用請求來執行操作系統提供的服務,例如文件訪問、網絡通信等。
-
應用程序也可以與其他應用程序進行通信,例如進程間通信(IPC)。
- 系統調用:
-
當應用程序需要執行特權操作或訪問底層硬件資源時,它會發起系統調用請求。
-
系統調用是應用程序和內核之間的接口,它允許應用程序請求操作系統執行特定的任務,例如打開文件、讀寫數據、創建進程等。
-
內核接收到系統調用請求後,會根據請求的參數和權限來執行相應的操作。
- 內核態和用戶態:
-
Linux 操作系統使用了分離的內核態和用戶態,用戶態是指應用程序運行的環境,內核態是指操作系統內核運行的環境。
-
用戶態的應用程序沒有直接訪問硬件資源的權限,必須通過系統調用請求內核來執行這些操作。
-
內核態有更高的權限,可以訪問和管理硬件資源,執行操作系統的核心功能。
- 關閉和終止:
- 當用戶關閉計算機或結束應用程序時,操作系統會清理資源、終止進程,並最終關閉計算機。
4. 編譯、燒寫和命令:
Linux 系統要啓動就必須需要一個 bootloader 程序,也就說芯片上電以後先運行一段 bootloader 程序。這段 bootloader 程序會先初始化 DDR 等外設,然後將 Linux 內核從 flash(NAND, NOR FLASH,SD,MMC 等) 拷貝到 DDR 中,最後啓動 Linux 內核。
4.1 uBoot 編譯步驟:
①解壓 uboot 源碼(官方網站下載):
tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
②編譯 uboot 的命令:
#ARCH=arm表示設置目標爲arm架構,相當於make distclean,清除工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
#配置uboot,配置文件爲mx6ull_14x14_evk_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
#V=1用於設置編譯過程中的信息輸出級別,相當於make -j12,即使用12核來編譯uboot
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
##########################################################################
#每次編譯uboot都需要輸入一長串命令
#爲了簡單起見,建立一個shell腳本文件,將這些命令寫到shell腳本里
#執行shell腳本即可完成編譯工作
#新建mx6ull_evk_emmc.sh腳本文件
##########################################################################
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
##########################################################################
#通過命令“./mx6ull_evk_emmc.sh”編譯uboot
編譯完成以後會生成 u-boot.bin、u-boot.imx 等文件,但是這些文件是 NXP 官方開發板配置生成的,所以接下來將其燒錄到開發板上看看能否使用。
u-boot.bin 是編譯出來的 uboot 二進制文件。uboot 是個裸機程序,因此需要在其前面加上頭部 (IVT 、 DCD 等數據) 才能在 I.MX6U 上執行。
u-boot.imx 是添加頭部以後的 u-boot.bin,u-boot.imx 就是要燒寫到開發板中的 uboot 鏡像文件。
③創建一個 Shell 腳本文件,編寫下列代碼,然後進行可執行權限設置並執行。
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
chmod 777 mx6ull_tek_emmc.sh
./mx6ull_tek_emmc.sh
4.2 燒寫驗證與測試
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/tsNZBnBCDllxjPcIGcSYYg