1. 程式人生 > >嵌入式linux燒寫(一)—BootLoader的裁剪和編譯

嵌入式linux燒寫(一)—BootLoader的裁剪和編譯

一、BootLoader的概念

   BootLoader是系統加電啟執行的第一段軟體程式碼.回憶一下PC的體系結構我們可以知道,PC機中的引導載入程式由BIOS(其本質就是一段韌體程式)和位於硬碟MBR中的載入程式一起組成。BIOS在完成硬體檢測和資源分配後,將硬碟MBR中的載入程式讀到系統的RAM中,然後將控制權交給載入程式。載入程式的主要執行任務就是將核心映象從硬碟上讀到RAM中 然後跳轉到核心的入口點去執行,也即開始啟動作業系統。

    而在嵌入式系統中,通常並沒有像BIOS那樣的韌體程式(有的嵌入式系統也會內嵌一段短小的啟動程式),因此整個系統的載入啟動任務就完全由BootLoader來完成.比如在一個基於 ARM7TDMI core的嵌入式系統中,系統在上電或復位時都從地址 0x00000000開始執行.而在這個地址處安排的通常就是系統的BootLoader程式。

    簡單地說BootLoader就是在作業系統核心或使用者應用程式執行之前執行的一段小程式。通過這段小程式,我們可以初始化硬體裝置、建立記憶體空間的對映圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終呼叫作業系統核心或使用者應用程式準備好正確的環境。對於一個嵌入式系統來說,可能有的包括作業系統,有的小型系統也可以只包括應用程式,但是在這之前都需要BootLoader為它準備一個正確的環境。通常,BootLoader是依賴於硬體而實現的,特別是在嵌入式領域,為嵌入式系統建立一個通用的BootLoader是很困難的。

二、Boot Loader的操作模式

    大多數BootLoader都包含兩種不同的操作模式。“啟動載入”模式和“下載”模式,這種區別僅對於開發人員才有意義。但從終端使用者的角度看,BootLoader的作用就是用來載入作業系統,而並不存在所謂的啟動載入模式與下載工作模式的區別。

    啟動載入(Boot loading)模式:這種模式也稱為“自主”(Autonomous)模式,也即BootLoader從目標機上的某個固態儲存裝置上將作業系統載入到RAM中執行,整個過程並沒有使用者的介入。這種模式是BootLoader的正常工作模式。因此在嵌入式產品釋出的時候,BootLoader顯然必須工作在這種模式下.

    下載(Down loading)模式:在這種模式下 目標機上的BootLoader將通過串列埠連線或網路連線等通訊手段從主機下載檔案,比如:下載應用程式、資料檔案、核心映像等.從主機下載的檔案通常首先被BootLoader儲存到目標機的RAM中然後再被BootLoader寫到目標機上的固態儲存裝置中。BootLoader的這種模式通常在系統更新時使用。工作於這種模式下的BootLoader通常都會向它的終端使用者提供一個簡單的命令列介面。

三、BootLoader的工作

總體上Bootloader需要完成以下工作。

n     初始化CPU速度;

n     初始化記憶體,包括啟用記憶體庫,初始化記憶體配置暫存器等;

n     初始化中斷控制器,在系統啟動時,關閉中斷,關閉看門狗;

n     初始化串列埠(如果在目標上有的話);

n     啟用指令/資料快取記憶體;

n     設定堆疊指標;

n     設定引數區域並構造引數結構和標記(這是重要的一步,因為核心在標識根裝置、頁面大小、記憶體大小以及更多內容時要使用引導引數);

n     執行POST(加電自檢)來標識存在的裝置並報告有何問題;

n     為電源管理提供掛起/恢復支援;

n     傳輸作業系統核心映象檔案到目標機。也可以將作業系統核心映象檔案事先存放在Flash中,這樣就不需要BootLoader和主機傳輸作業系統核心映象檔案,這通常是在做成產品的情況下使用。而一般在開發過程中,為了除錯核心的方便,不將作業系統核心映象檔案固化在Flash中,這就需要主機和目標機進行檔案傳輸;

n     跳轉到核心的開始,在此又分為ROM啟動和RAM啟動。所謂ROM啟動就是用XIP技術直接在Flash中執行作業系統映象檔案;所謂RAM啟動就是指把核心映象從Flash複製到RAM中,然後再將PC指標跳轉到RAM中的作業系統啟動地址。

四、VIVI的剪裁

http://blog.chinaunix.net/uid-9532036-id-2403549.html

Bootloader有很多種,如vivi,uboot,redboot,lilo等等。viv是韓國mizi公司專門為三星s3c2410晶片設計的Bootloader。下面我們以它為例講述一下Bootloader的裁剪和燒寫.

首先是上網下載vivi,我的版本是v0.1.4。http://blogimg.chinaunix.net/blog/upfile/071017080947.rar

第一步:解壓後進入vivi目錄,在終端下輸入make distclean命令,清除已生成的目標檔案的影像檔案;

第二步:輸入make menuconfig命令,啟動vivi配置GUI程式,如下圖:

第三步:根據自己需要修改選項,*號表示選中,如圖中使vivi支援UART1(串列埠2).修改後關閉配置頁面.

第四步:輸入make命令,在當前目錄下會生成vivi映像檔案;

生成的映像檔案我們先儲存著,以後會用到.

相關推薦

嵌入式linux()—BootLoader裁剪編譯

一、BootLoader的概念    BootLoader是系統加電啟執行的第一段軟體程式碼.回憶一下PC的體系結構我們可以知道,PC機中的引導載入程式由BIOS(其本質就是一段韌體程式)和位於硬碟MBR中的載入程式一起組成。BIOS在完成硬體檢測和資源分配後,將硬碟MBR

嵌入式linux核心,檔案系統的2種方式

一.網路下載燒寫 tftpboot 二.linux下的DNW,win7下的DNW無法使用 第一種方式 1.設定開發板ip,及其伺服器IP在同一段 set ipaddr 192.168.1.X set serverip 192.168.1.X 與上面不同 save 2.從

Linux Kernel系列:開篇Kernel啟動概要

mis misc 跳轉 line global 最終 width lin 通過 前言 最近幾個月將Linux Kernel的大概研究了一下,下面需要進行深入詳細的分析。主要將以S3C2440的一塊開發板為硬件實體。大概包括如下內容: 1 bootloader分析,以uboo

嵌入式程序的基礎知識有哪些

splay 應用編程 硬件 直接 中間 單獨 邏輯或 學習 rom 在嵌入式的基礎知識學習中,燒寫程序是必備的知識點之一,需要把寫的程序代碼燒寫到單片機上,在單片機上檢驗寫的程序代碼是否正確,是否能夠正常運行,下面我們來學習下什麽是燒寫和固件、常見的幾種燒寫方式、三種編程方

嵌入式Linux開發——(十)u-boot原始碼分析

1、U-Boot的特性:     ①開放原始碼     ②支援多種嵌入式作業系統核心:Linux、NetBSD、VxWorks、QNx、RTEMS、ARTOS、 LynxOS     ③支援多種架構的CPU:Power

stm32f031G6U6微控制器SWD次後,無法再次解決方法。

這幾天在做一個小專案,需要用到stm32f0系列的微控制器,畫好的板子引出swd,方便除錯和燒寫程式,可是第一次swd燒寫程式後,想再次燒寫,發現keil裡始終找不到裝置,而且我的程式裡也並沒有複用swd的兩個引腳,很是疑惑。上網找了很多方法,我試了幾個發現,只有一個對我這

使用J-LinkU-boot的+裸板程式(JZ2440-S3C2440)

一、使用J-Link 燒寫NOR Flash 注意:J-Link 只支援NOR Flash,不支援NAND Flash。 1、安裝J-link 驅動(在Windows 下)在JZ2440 開發板JLI

“轉”使用UBOOT根檔案系統核心的方法

①此處param區存放著uboot傳遞給kernel的標記列表,(是uboot傳遞給核心的,核心去讀取),和nandflash上的param儲存區(是uboot自己的)的內容不一樣 nandflash的param儲存區存放的是如 bootargs=console=ttySAC0 noinitrd root=/

linux命令學習 :touchmkdir 建立檔案資料夾

一、檢視命令詳情 touch --help mkdir --help   二、常用命令 1、建立檔案:  touch  filename 2、建立資料夾:mkdir  directoryname       可建立父資料夾或建立多個或建立多級資料夾 mkdir -

Linux計算某列的

inux 說明 awk linu egrep gre d+ div span ll | awk ‘{print $5}‘ | egrep -v "^$"| paste -sd+|bc 簡單說明: ll:拿到當前目錄下所有的文件大小 awk:拿到第幾列 egrep:把空行

Linux LCD驅動()——硬體分析FrameBuffer

/* 畫素時鐘單位是皮秒,而時鐘的單位是赫茲,所以計算公式為:      * Hz -> picoseconds is / 10^-12      */     unsigned long long div = (unsigned long long)clk * pixclk;  

嵌入式 Linux下的動態庫原理使用

1.編寫庫的標頭檔案和原始檔.   2.把所有涉及到的原始檔用如下方式編譯為目標檔案:   #  g++/gcc  -g  -c  -fPIC  -o  library1.o  library1.cpp   #  g++/gcc  -g  -c  -fPIC  -o  library2.o  libra

嵌入式 Linux下段錯誤的原因除錯方式

[email protected]:~/segfault$ catchsegv ./segfault3 Segmentation fault (core dumped) *** Segmentation fault Register dump: EAX: 00000000 EBX: 00fb3f

嵌入式Linux移植之記憶體初始化地址對映

Linux核心有兩個重要的巨集:PHYS_OFFSET和PAGE_OFFSET。PHYS_OFFSET是實體記憶體的起始地址,PAGE_OFFSET是Linux核心空間的虛擬起始地址(預設為0xC0000000,可通過menuconfig配置,CONFIG_PAGE_OFF

boost裁剪編譯

winddows:bjam --show-libraries 查詢所有的模組1、執行bootstrap.bat編譯bjam。2、bjam.exe ./tools/bcp3、在bin.v2/tools/bcp/目錄下可以找到 bcp.exe。這就是我們所需要的程式了。假設我們允

嵌入式Linux-根檔案系統2_(利用交叉編譯工具鏈,構建/lib目錄)

光有應用程式(命令)是不夠的,因為應用程式本身需要使用C庫的庫函式,因此還必需製作for ARM的C庫,並將其放置於/lib目錄。my god,要自己寫C庫的原始碼嗎?不用!還記得交叉編譯工具鏈的3個組成部分嗎?交叉編譯器、for ARM的C庫和二進位制工具。我們只需要把嵌入式的C庫拷貝過來就可

嵌入式linux 核心根檔案系統方式簡介

總體來說,嵌入式Linux核心和根檔案的引導與PC機差不多。嵌入式linux核心和根檔案系統可以存放在各種可能的儲存裝置中,一般情況下我們將核心和根檔案系統直接燒入到Flash中(包括NOR和NAND flash),這種方法的缺點是在核心和根檔案系統出現修改時我們就不得不得

製作嵌入式Linux檔案系統過程

1.解壓tar xvf createSdcard.qt4.tar.bz2檔案,在Ubuntu下插入SD卡。 2.執行./createSdCard.sh,即可在SD卡生成 bin 和 system 目錄,bin 裡面的內容不要更改; system 目錄裡的內容將來被 燒寫到

#嵌入式Linux最小系統移植# 對uboot移植裁剪點點個人思考總結

思路: 1.分析啟動流程 2.移植config檔案(smdk440_config) 3.移植包含控制條件編譯巨集的.h檔案(configs/s3c2440.h) 4.移植板級初始化.c檔案(s3c2440.c) 5.移植RAM初始化?DDR? 6.移植NorF

Windows環境下Linux sh腳本的次挖坑填坑

utf-8 技術分享 成功 格式 挖坑 名稱 d+ 執行 man 最近在研究Docker集群和安裝的時候,需要準備若幹臺機器。所以我為節約時間,打算批量復制VM機器,然後用sh腳本命令執行機器名稱和IP等基礎配置信息的修改。 具體操作:我在windows環境下,