色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式Linux移植與系統啟動解讀

嵌入式開發愛好者 ? 來源:嵌入式開發愛好者 ? 2023-11-25 10:07 ? 次閱讀

1、Linux系統啟動與U-Boot

所謂移植就是把程序代碼從一種運行環境轉移到另一種運行環境。對于內核移植來說,主要是從一種硬件平臺轉移到另一種硬件平臺上運行。

體系結構級別的移植是指在不同體系結構平臺上Linux內核的移植,例如,在ARM、MIPS、PPC等不同體系結構上分別都要對每個體系結構進行特定的移植工作。一個新的體系結構出現就需要進行這個層次上的移植。

SoC級別的移植是指在具體的SoC處理器平臺上Linux內核的移植,例如,ARM i.MX6Dual處理器要進行SoC特定的移植工作,主要包括處理器相關的內核修改、集成外設驅動。

主板級別的移植是指在具體的目標主板上Linux內核的移植,例如,在i.MX6DualFS2410目標板上,需要進行主板特定的移植工作,主要包括特定目標板系統啟動與主板擴展外設相關的外設驅動等。

基于同一款處理器的不同嵌入式設備并不是所有的外部設備都相同,不同的開發板可以使用不同的SDRAM、Flash、以太網接口芯片等。這就需要根據硬件修改或者開發驅動程序。

一個最基本的Linux操作系統應該包括:引導程序、內核與根文件系統三部分。因此,需要移植一個Linux系統的話,那么需要以下4個步驟:

搭建交叉開發環境;

BootLoader的選擇和移植;

kernel的配置、編譯、和移植;

根文件系統的制作。

(1)BootLoader簡介

引導加載程序(Boot Loader)就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境。

如下圖所示:

29f4be74-8ae3-11ee-939d-92fbcf53809c.png

為什么系統移植之前要先移植BootLoader?

BootLoader的任務是引導操作系統,所謂初始化CPU運行環境,引導操作系統。就是啟動內核,讓內核運行就是把內核加載到內存RAM中去運行。

是誰把CPU運行環境初始化的?

是誰把內核搬到內存中去運行?

SRAM只要系統上電就可以運行,而SDRAM需要軟件進行初始化才能運行,那么內存是由誰來初始化的呢?

(2)Bootloader的執行過程

uboot 啟動流程詳細分析

初始化SDRAM;

初始化串口;

檢測處理器類型;

設置Linux啟動參數;

調用Linux內核映像。

(3)BootLoader的分類

很多人說BootLoader就是U-Boot,這種說法是錯誤的,確切來說是U-Boot是BootLoader的一種。u-boot和bootloader到底有什么區別。

如下圖所示。

2a072758-8ae3-11ee-939d-92fbcf53809c.png

可以知道如果使用開發板board/,就先執行“make _config”命令進行配置,然后執行“make all”, 就可以生成如下3個文件:

u-boot.bin:二進制可執行文件,它就是可以直接燒入eMMC中的文件。

u-boot: ELF格式的可執行文件。

u-boot.srec: 原摩托羅拉格式的可執行文件。

對于imx6dlsabresd開發板,可以根據開發板的型號選擇執行“make imx6dlsabresd_defconfig”、“make"進行編譯。

編譯后生成的u-boot.imx鏡像可以燒入SD卡中執行,具體命令如下:

sudo dd if=u-boot.imx of=/dev/sdb bs=512 seek=2
其中sdb代表SD卡在系統中對應的設備。

(4)u-boot配置過程

在配置之前,為了使編譯后的u-boot在開發板上運行,首先需要安裝交叉編譯鏈。并使用如下命令配置環境變量:

source /opt/fsl-imx-fb/4.14-sumo/environment-setup-cortexa9hf-neon-poky- linux-gnueabi

2a312cba-8ae3-11ee-939d-92fbcf53809c.png

u-boot啟動流程分析如下

第一階段:(注明下每個步驟的作用)

a -- 設置cpu工作模式為SVC模式。需要SVC權限對CPU的狀態寄存器進行操作 b -- 關閉中斷,mmu,,cache。需要直接物理地址訪問 v -- 關看門狗 d -- 初始化內存,串口。用于初始化基本的存儲空間與通信接口,用于啟動信息交互 e -- 設置棧。用于系統啟動臨時數據交換和初始化棧指針 f -- 代碼自搬移。用于拷貝系統啟動代碼 g -- 清bss

h -- 跳c

第二階段:

a -- 初始化外設,進入超循環

b -- 超循環處理用戶命令

函數前期執行流程如下:

1)_start(arch/arm/lib/vector.S)
b reset 2)reset(arch/arm/cpu/$CPU/start.S)

bl cpu_init_cp15
bl cpu_init_crit
bl _main

3)_main(archarmlibcrt0.S)

board_init_f(commonBoard_f.c)
b relocate_code
ldr lr, =board_init_r(common/Board_r.c)

4)main_loop()

5)啟動內核:

main_loop->autoboot_command->run_command_list->cli_simple_run_ command_list->cli_simple_run_command->cmd_process->find_cmd/cmd_call(result=(cmdtp->cmd)(cmdtp, flag, argc, argv))

uboot的最終目的是引導內核,在此之前uboot需要完成一系列初始化操作,包括設置時鐘、初始化DDR、Flash、串口、網卡等等。

這時uboot有兩條路走

(1)通過按鍵,觸發uboot進入命令行模式,等待處理命令。

(2)引導內核

2、Linux系統裁剪與移植

內核編譯相關文件主要包括頂層Makefile與子目錄下的Makefile、各級目錄Kconfig文件。

a--在內核配置之前先使用make mrproper命令清除以前的內核。

b--詳細配置make menuconfig

c--編譯

make zImage ---生成內核鏡像/arch/arm/boot/zImage

make dtbs ---生成設備樹文件/arch/arm/boot/dts/imx6dl-sabresd.dtb

make modules ---把配置值選成M的代碼編譯生成模塊文件。(.ko)放在對應的源碼目錄下。

可以看出,內核編譯主要包括兩部分:一部分是內核配置;另一部分是內核編譯。如下圖所示。

2a3e2154-8ae3-11ee-939d-92fbcf53809c.png 內核的Kconfig分析:

a -- 我們解壓內核后需要先修改內核頂層目錄下的Makefile,配置好交叉編譯工具

b -- 然后導入默認配置(使用make imx_v7_defconfig 或者

cparch/arm/configs/imx_v7_deconfig.config)

c -- 配置內核

如下圖所示。

2a7d47bc-8ae3-11ee-939d-92fbcf53809c.png

內核中的哪些文件將被編譯?它們是怎樣被編譯的?它們連接時的順序如何確定?哪個文件在最前面?哪些文件或函數先執行?這些都是通過Makefile來管理的。

從最簡單的角度來總結Makefile的作用,有以下3點:

1)-- 決定編譯哪些文件?

2)-- 怎樣編譯這些文件?

3)-- 怎樣連接這些文件,最重要的是它們的順序如何?

2a9cf864-8ae3-11ee-939d-92fbcf53809c.png

1)頂層Makefile 決定內核根目錄下哪些子目錄將被編進內核;

2)arch/$(ARCH)/Makefile 決定arch/$(ARCH)目錄下哪些文件、哪些目錄將被編進內核;

3)各級子目錄下的Makefile決定所在目錄下哪些文件將被編進內核,哪些文件將被編程模塊(即驅動程序),進入哪些子目錄繼續調用它們的Makefile。

與移植U-Boot的過程相似,在移植Linux之前,先了解它的啟動過程。

Linux 的過程可以分為兩部分:架構/開發板相關的引導過程、后續的通用啟動過程。對于uImage、zImage ,它們首先進行自解壓得到vmlinux ,然后執行 vmlinux 開始“正常的”啟動流程。

引導階段通常使用匯編語言編寫,它首先檢查內核是否支持當前架構的處理器,然后檢查是否支持當前開發板。

通過檢查后,就為調用下一階段的start_kernel函數作準備了。

這主要分如下兩個步驟:

1) 連接內核時使用的虛擬地址,所以要設置頁表、使能MMU;

2)調用C 函數 start_kernel 之前的常規工作,包括復制數據段、清除BSS段、調用start_kernel 函數。

第二階段的關鍵代碼主要使用C語言編寫。

它進行內核初始化的全部工作,最后調用 rest_init 函數啟動init 過程,創建系統第一個進程:init 進程。在第二階段,仍有部分架構/開發板相關的代碼,比如重新設置頁表、設置系統時鐘、初始化串口等。

內核自解壓階段:

Linux內核有兩種映像:一種是非壓縮內核,叫Image,另一種是它的壓縮版本,叫zImage。根據內核映像的不同,Linux內核的啟動在開始階段也有所不同。

zImage是Image經過壓縮形成的,所以它的大小比Image小。但為了能使用zImage,必須在它的開頭加上解壓縮的代碼,將zImage解壓縮之后才能執行,因此它的執行速度比Image要慢。

但考慮到嵌入式系統的存儲空容量一般比較小,采用zImage可以占用較少的存儲空間,因此犧牲一點性能上的代價也是值得的。所以一般的嵌入式系統均采用壓縮內核的方式。

內核自解壓階段依次完成以下工作:開啟MMU和Cache,調用decompress_kernel()解壓內核,最后通過調用call_kernel()進入非壓縮內核Image的啟動。

內核引導階段:

內核引導階段是內核啟動第一階段,該部分代碼實現在arch/arm/kernel的 head.S中,該文件中的匯編代碼通過查找處理器內核類型和機器碼類型調用相應的初始化函數,再建 立頁表,最后跳轉到start_kernel()函數開始內核的初始化工作。如下圖所示:

2ab36b58-8ae3-11ee-939d-92fbcf53809c.png

內核初始化階段:

Linux內核啟動的第二階段從start_kernel()函數開始。start_kernel()是所有Linux平臺進入系統內核初始化后的入口函數,它主要完成剩余的與硬件平臺相關的初始化工作,在進行一系列與內核相關的初始化后,調用第一個用戶進程-init進程并等待用戶進程的執行,這樣整個Linux內核便啟動完畢。

2acc6bd0-8ae3-11ee-939d-92fbcf53809c.png
2ae69cee-8ae3-11ee-939d-92fbcf53809c.png

BusyBox初始化階段:

除了基本的命令之外,BusyBox還支持init功能,如同其它的init一樣,busybox的init也是完成系統的初始化工作,關機前的工作等等。

BusyBox的init進程會依次進行以下工作:

為init設置信號處理過程;

初始化控制臺;

分析 inittab文件,/etc/inittab;

執行系統初始化腳本,缺省情況下會使用/etc/init.d/rcS;

執行所有導致init暫停的inittab命令(動作類型:wait);

執行所有僅執行一次的inittab(動作類型:once)。

3、Linux根文件系統移植

(1)文件系統與根文件系統

根,可以理解為基礎的意思。根文件系統是一種最基礎的文件系統。

Linux系統也可以將磁盤或Flash等存儲設備劃分為若干個分區,在不同的分區存放不同類型的文件,在某個分區存放u-boot的可執行文件;在某個分區存放內核映像文件,在另一分區存放根文件系統映像文件等。

Linux也需要在一個分區上存放系統啟動的必要文件,比如內核啟動運行后的第一個程序(init進程)、用于掛接文件系統的腳本、給用戶提供操作界面的shell程序,應用程序所要依賴的庫等,這些必要的基本文件的集合稱為根文件系統(一般也叫做rootfs)。

Linux系統啟動后首先會掛載這個分區,這稱為掛載(mount)根文件系統。其他分區上的所有目錄、文件的集合,稱為文件系統。

為什么需要根文件系統?

1)init進程的應用程序在根文件系統上;

2)根文件系統提供了根目錄/;

3)內核啟動后的應用層配置(etc目錄)在根文件系統上。可以認為:發行版=內核+rootfs。

4)shell命令程序在根文件系統上。譬如ls、cd等命令。

因此,一套Linux體系,只有內核本身是不能工作的,必須要rootfs(上的etc目錄下的配置文件、/bin與/sbin等目錄下的shell命令,還有/lib目錄下的庫文件等)相配合才能工作。

(2)根文件系統概述

Linux中的根文件系統更像是一個文件夾或者叫做目錄(特殊的文件夾),在這個目錄里面會有很多的子目錄。

根目錄下和子目錄中會有很多的文件,這些文件是Linux運行所必須的,比如庫、常用的軟件和命令、設備文件、配置文件等等。

根文件系統和Linux內核是分開的,單獨的Linux內核是沒法正常工作的,必須要搭配根文件系統。

(3)根文件系統的結構

Linux的根文件系統是采用級層式的樹狀目錄結構,在此結構中的最上層是根目錄“/”,然后在此目錄下再創建其他的目錄。樹的根結點為根目錄root。
2b099686-8ae3-11ee-939d-92fbcf53809c.png
其中:

1)/root 系統管理員的主目錄

2)/bin 存放二進制可執行命令的目錄

3)/boot 存放的是啟動Linux時使用的一些核心文件,包括一些連接文件以及鏡像文件。

4)/dev 存放設備文件的目錄

5)/etc 存放系統管理和配置文件的目錄

6)/home 用戶主目錄

7)/lib 存放動態鏈接共享庫的目錄

8)/sbin存放系統管理員使用的管理程序的目錄

9)/mnt 系統提供這個目錄是讓用戶臨時掛載其他的文件系統

10)/proc 虛擬文件系統

11)/usr 最龐大的目錄

12)/var某些大文件的溢出區

13)/tmp 公用的臨時文件存儲點

一般我們在Linux驅動開發的時候都是通過nfs掛載根文件系統的,當產品最終上市開賣的時候才會將根文件系統燒寫到EMMC或者NAND中。

1)修改Makefile,添加編譯器;

2)配置busybox ;

3)編譯busybox ;

4)向根文件系統添加lib庫(完成基本根文件系統);

5)創建其他文件夾;

6)完善根文件系統。

Linux系統掛載完根文件系統之后,就會執行init程序,創建init進程。執行過程大概如下圖所示。

2b22ef00-8ae3-11ee-939d-92fbcf53809c.png







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19259

    瀏覽量

    229653
  • 嵌入式
    +關注

    關注

    5082

    文章

    19104

    瀏覽量

    304822
  • SDRAM
    +關注

    關注

    7

    文章

    423

    瀏覽量

    55205
  • Linux系統
    +關注

    關注

    4

    文章

    593

    瀏覽量

    27392
  • SoC芯片
    +關注

    關注

    1

    文章

    610

    瀏覽量

    34905

原文標題:嵌入式 Linux 移植與系統啟動

文章出處:【微信號:嵌入式開發愛好者,微信公眾號:嵌入式開發愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux嵌入式系統環境搭建、內核配置、最小系統啟動與設備...

    Linux嵌入式系統環境搭建、內核配置、最小系統啟動與設備文件分析
    發表于 08-16 13:53

    Linux嵌入式系統環境搭建、內核配置、最小系統啟動與設備...

    Linux嵌入式系統環境搭建、內核配置、最小系統啟動與設備文件分析
    發表于 08-20 13:35

    嵌入式Linux系統的快速啟動方法

    1 嵌入式Linux系統啟動時序目前,嵌入式系統的硬件平臺和應用方向區別很大,但總體啟動流程一致
    發表于 07-24 07:14

    請問怎樣去設計嵌入式系統啟動程序?

    如何去編寫嵌入式系統啟動程序?設計嵌入式系統啟動程序的步驟流程有哪些?設計嵌入式系統啟動程序有哪
    發表于 04-25 09:18

    如何對嵌入式linux系統快速啟動進行優化

    嵌入式linux快速啟動的一些優化的方法,主要是要掌握嵌入式linux系統
    發表于 11-04 06:36

    詳細分析嵌入式Linux系統啟動流程

    嵌入式Linux專題(一)中已經對嵌入式Linux系統的架構及啟動流程有了初步的介紹,本文將詳
    發表于 11-05 09:25

    嵌入式Linux系統的構成和啟動過程

    文章目錄一、嵌入式Linux系統構成二、嵌入式Linux系統啟動過程在我們的周圍,大量的
    發表于 12-16 06:20

    嵌入式linux系統啟動的過程是怎樣的

    嵌入式linux系統啟動的過程是怎樣的?什么是u-boot?u-boot的作用有哪些?
    發表于 12-27 06:21

    嵌入式Linux系統移植研究

    介紹嵌入式系統嵌入式系統中的GUI , 詳細說明三種常見的嵌入式GUI (Microwindows、MiniGUI 和QT)的設計結構和使
    發表于 04-24 10:43 ?23次下載

    基于ARM-μCLinux嵌入式系統啟動引導的實現

    基于ARM-μCLinux嵌入式系統啟動引導的實現:介紹了 ARM-μCLinux 嵌入式系統的結構組成,重點分析了 ARM--μCLinux 嵌入
    發表于 06-25 08:14 ?36次下載

    嵌入式Linux系統中的快速啟動技術分析

    摘要 Linux在消費電子類產品中得到了廣泛應用,由于嵌入式用戶對于系統啟動速度較為敏感,因此快速啟動技術逐漸成為研究和應用中的一個重點。本文通過對
    發表于 03-29 15:11 ?1819次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>系統</b>中的快速<b class='flag-5'>啟動</b>技術分析

    Linux嵌入式Linux系統移植(上篇:交叉編譯器、連接方式)

    嵌入式Linux系統移植嵌入式Linux系統
    發表于 11-01 16:57 ?14次下載
    【<b class='flag-5'>Linux</b>】<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>系統</b>的<b class='flag-5'>移植</b>(上篇:交叉編譯器、連接方式)

    嵌入式Linux專題(一)——嵌入式Linux系統構成及啟動流程

    本文簡單的介紹了什么是嵌入式系統,以及嵌入式Linux系統結構,并且簡單的介紹了Linux
    發表于 11-02 12:36 ?15次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>專題(一)——<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>系統</b>構成及<b class='flag-5'>啟動</b>流程

    [深度理解嵌入式linux系統移植]深度理解嵌入式linux系統移植

    第一章-嵌入式系統架構與移植環境搭建第二章-uboot工程與編譯第三章-uboot啟動流程分析第四章-arm9/S3c2440 uboot移植
    發表于 11-02 13:21 ?17次下載
    [深度理解<b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b><b class='flag-5'>系統</b><b class='flag-5'>移植</b>]深度理解<b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b><b class='flag-5'>系統</b><b class='flag-5'>移植</b>

    基于嵌入式Linux系統的MiniGUI的移植

    電子發燒友網站提供《基于嵌入式Linux系統的MiniGUI的移植.pdf》資料免費下載
    發表于 10-12 10:20 ?1次下載
    基于<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>系統</b>的MiniGUI的<b class='flag-5'>移植</b>
    主站蜘蛛池模板: 天堂岛www| 扒开女人下面使劲桶动态图| 亚洲国产综合久久精品| 亚洲地址一地址二地址三| 亚洲精品AV中文字幕在线| 亚洲性爱城| 四虎国产精品高清在线观看| 我年轻漂亮的继坶2中字在线播放| 校园女教师之禁区| 日本熟妇多毛XXXXX视频| 麻豆XXXX乱女少妇精品-百度| 男生插曲女生身全过程| 久久无码av三级| 尿了么app| 视频成人app永久在线观看| 亚洲精品久久久一区| 97精品国产亚洲AV高清| 亚洲日韩在线天堂一| 亚洲精品国产AV成人毛片 | 美女扒开屁股让男人桶| 欧洲日韩av无线在码| 午夜精品久久久内射近拍高清 | 五月丁香啪啪.| 伊人久久久久久久久香港| 亚洲精品123区在线观看| 中文字幕中文字幕永久免费| 在线 国产 欧美 专区| yin乱教师系列合集| 国语自产一区第二页| 你的欲梦裸身在线播放| 亚洲AV无码久久流水呻蜜桃久色| 午夜福利合集1000在线| 中国人泡妞xxxxxxxx19| 91看片淫黄大片.在线天堂 | 666永久视频在线| 99国产福利| YIN荡的老师系列第6部分视频| 国产色偷偷男人的天堂| 牛牛精品专区在线| 亚洲国产五月综合网| yellow在线观看免费直播|