在嵌入式系統(tǒng)中,BootLoader 是用來初始化硬件,加載內(nèi)核,傳遞參數(shù)。因為嵌入式系統(tǒng)的硬件環(huán)境各不相同,所以嵌入式系統(tǒng)的BootLoader 也各不相同,其中比較通用的是U-Boot,它支持不同的體系結(jié)構(gòu),如ARM,PowerPC,X86,MIPS 等。本文著重介BootLoader與內(nèi)核之間參數(shù)傳遞這一基本功能。本文的硬件平臺是基于AT91RM9200 處理器系統(tǒng),軟件平臺是Linux-2.6.19.2 內(nèi)核。內(nèi)核映像文件為zImage。
1. 系統(tǒng)硬件平臺簡介
AT91RM9200 處理器,它是由Atmel 公司基于ARM920T 內(nèi)核的微處理器,帶有內(nèi)存管理單元,CPU 時鐘最高可達(dá)240MHz,它具有豐富的標(biāo)準(zhǔn)接口,EBI 接口,內(nèi)部集成了靜態(tài)存儲控制器(SMC),SDRAM 控制器,Burst Flash 控制器。有關(guān)處理器的說明請參考AT91RM9200 的數(shù)據(jù)手冊。本系統(tǒng)SDRAM(64MB)地址為:0x20000000, NorFlash(8MB)的地址為:0x10000000[1]。
2. BootLoader 設(shè)計和實現(xiàn)
內(nèi)核源代碼目錄樹下的documentation/arm/booting[2]文檔規(guī)定了基于ARM 體系結(jié)構(gòu)BootLoader 的基本功能。本系統(tǒng)BootLoader 除了完成這些基本的功能外,還結(jié)合自身硬件的特點加入了代碼搬運等功能。
BootLoader 的流程是:系統(tǒng)上電復(fù)位后,首先從NorFlash 開始運行(由處理器BMS 引腳連接決定),因為處理器此時的0 地址就是NorFlash 的首地址(0x10000000),BootLoader就是被燒寫在這個位置,AT91RM9200 處理器能夠映射的地址范圍只有0x0000
0000—0x001f ffff。 BootLoader 執(zhí)行的第一步就是將自身代碼從NorFlash 中搬運到處理器內(nèi)部的RAM 中(0x00200000),然后將0 地址映射到內(nèi)部RAM,并且跳轉(zhuǎn)到內(nèi)部RAM 的相應(yīng)地址處繼續(xù)執(zhí)行。進(jìn)入內(nèi)部RAM 后才進(jìn)入真正的硬件初始化階段,這個階段初始化的各種控制器都是內(nèi)核所必須的,包括:PMC, EBI, SMC, SDRAM, USART 等。接著就是創(chuàng)建內(nèi)核參數(shù)鏈表(Tagged list),創(chuàng)建完鏈表就是搬運事先燒寫在NorFlash 中的內(nèi)核映像和根文件系統(tǒng)映像到SDRAM,根據(jù)內(nèi)核對BootLoader 的基本要求關(guān)閉中斷,MMU 和數(shù)據(jù)Cache,并且配置r0=0, r1=0x0000 00fb 或者0x00000106(根據(jù)內(nèi)核中l(wèi)inux/arch/arm/tools/mach-types[2]
規(guī)定的機(jī)器編號),r2=0x20000100(BootLoader 傳遞給內(nèi)核參數(shù)鏈表的物理地址),在ARM體系結(jié)構(gòu)中,這個地址在同一種處理器的機(jī)器描述符(machine_desc)中都是默認(rèn)的,所以在這里可以不指定。最后BootLoader 直接跳轉(zhuǎn)到SDRAM 的內(nèi)核處執(zhí)行。
3. 內(nèi)核參數(shù)鏈表
BootLoader 可以通過兩種方法傳遞參數(shù)給內(nèi)核, 一種是舊的參數(shù)結(jié)構(gòu)方式(parameter_struct),主要是2.6 之前的內(nèi)核使用的方式。另外一種就是現(xiàn)在的2.6 內(nèi)核在用的參數(shù)鏈表 (tagged list) 方式。這些參數(shù)主要包括,系統(tǒng)的根設(shè)備標(biāo)志,頁面大小,內(nèi)存的起始地址和大小,RAMDISK 的起始地址和大小,壓縮的RAMDISK 根文件系統(tǒng)的起始地址和大小,內(nèi)核命令參數(shù)等[3][4][5]。
內(nèi)核參數(shù)鏈表的格式和說明可以從內(nèi)核源代碼目錄樹中的 include/asm-arm/setup.h[2]中找到,參數(shù)鏈表必須以ATAG_CORE 開始,以ATAG_NONE 結(jié)束。這里的ATAG_CORE,ATAG_NONE 是各個參數(shù)的標(biāo)記,本身是一個32 位值,例如:ATAG_CORE=0x54410001。
其它的參數(shù)標(biāo)記還包括: ATAG_MEM32 , ATAG_INITRD , ATAG_RAMDISK ,ATAG_COMDLINE 等。每個參數(shù)標(biāo)記就代表一個參數(shù)結(jié)構(gòu)體,由各個參數(shù)結(jié)構(gòu)體構(gòu)成了參數(shù)鏈表。參數(shù)結(jié)構(gòu)體的定義如下:
struct tag
{
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
struct tag_videotext videotext;
struct tag_ramdisk ramdisk;
struct tag_initrd initrd;
struct tag_serialnr serialnr;
struct tag_revision revision;
struct tag_videolfb videolfb;
struct tag_cmdline cmdline;
struct tag_acorn acorn;
struct tag_memclk memclk;
} u;
};
參數(shù)結(jié)構(gòu)體包括兩個部分,一個是 tag_header 結(jié)構(gòu)體,一個是u 聯(lián)合體。
tag_header 結(jié)構(gòu)體的定義如下:
struct tag_header
{
u32 size;
u32 tag;
};
其中 size:表示整個tag 結(jié)構(gòu)體的大小(用字的個數(shù)來表示,而不是字節(jié)的個數(shù)),等于tag_header 的大小加上u 聯(lián)合體的大小,例如,參數(shù)結(jié)構(gòu)體ATAG_CORE 的
size=(sizeof(tag->tag_header)+sizeof(tag->u.core))>>2,一般通過函數(shù) tag_size(struct * tag_xxx)來獲得每個參數(shù)結(jié)構(gòu)體的size。其中tag:表示整個tag 結(jié)構(gòu)體的標(biāo)記,如:ATAG_CORE等。
聯(lián)合體u 包括了所有可選擇的內(nèi)核參數(shù)類型,包括:tag_core, tag_mem32,tag_ramdisk等。參數(shù)結(jié)構(gòu)體之間的遍歷是通過函數(shù)tag_next(struct * tag)來實現(xiàn)的。本系統(tǒng)參數(shù)鏈表包括的結(jié)構(gòu)體有: ATAG_CORE , ATAG_MEM, ATAG_RAMDISK, ATAG_INITRD32 ,ATAG_CMDLINE,ATAG_END。在整個參數(shù)鏈表中除了參數(shù)結(jié)構(gòu)體ATAG_CORE 和ATAG_END 的位置固定以外,其他參數(shù)結(jié)構(gòu)體的順序是任意的。本BootLoader 所傳遞的參數(shù)鏈表如下:第一個內(nèi)核參數(shù)結(jié)構(gòu)體,標(biāo)記為ATAG_CORE,參數(shù)類型為tag_core。每個參數(shù)類型的定義請參考源代碼文件。
tag_array 初始化為指向參數(shù)鏈表的第一個結(jié)構(gòu)體的指針。
tag_array->hdr.tag=ATAG_CORE;
tag_array->hdr.size=tag_size(tag_core);
tag_array->u.core.flags=1;
tag_array->u.core.pagesize=4096;
tag_array->u.core.rootdev=0x00100000;
tag_array=tag_next(tag_array);
tag_array->hdr.tag=ATAG_MEM;
tag_array->hdr.size=tag_size(tag_mem32);
tag_array->u.mem.size=0x04000000;
tag_array->u.mem.start=0x20000000;
tag_array=tag_next(tag_array);
……
tag_array->hdr.tag=ATAG_NONE;
tag_array->hdr.size=0;
tag_array=tag_next(tag_array);
最后將內(nèi)核參數(shù)鏈表復(fù)制到內(nèi)核默認(rèn)的物理地址0x20000100 處。這樣參數(shù)鏈表就建好了。
4. 內(nèi)核接收參數(shù)
下面從基于ARM體系結(jié)構(gòu)的zImage 映像啟動來分析Linux 內(nèi)核是怎樣接收BootLoader傳遞過來的內(nèi)核參數(shù),zImage 啟動過程如下圖所示。
(圖有時間再畫)
在文件 arch/arm/boot/compressed/head.S[2]中 start 為zImage 的起始點,部分代碼如下:
start:
mov r7, r1
mov r8, r2
…...
mov r0, r4
mov r3, r7
bl decompress_kernel
b call_kernel
call_kernel:
……
mov r0, #0
mov r1, r7
mov r2, r8
mov pc, r4
首先將BootLoader 傳遞過來的r1(機(jī)器編號)、r2(參數(shù)鏈表的物理地址)的值保存到r7、r8 中,再將r7 作為參數(shù)傳遞給解壓函數(shù)decompress_kernel()。在解壓函數(shù)中,再將r7 傳遞給全局變量__machine_arch_type。在跳到內(nèi)核(vmlinux)入口之前再將r7,r8 還原到r1,r2 中。
在文件 arch/arm/kernel/head.S[2]中,內(nèi)核(vmlinux)入口的部分代碼如下:
stext:
mrc p15, 0, r9, c0, c0
bl __lookup_processor_type
………
bl __lookup_machine_type
首先從處理器內(nèi)部特殊寄存器(CP15)中獲得ARM 內(nèi)核的類型,從處理器內(nèi)核描述符(proc_info_list)表(__proc_info_begin—__proc_info_end)中查詢有無此ARM 內(nèi)核的類型,如果無就出錯退出。處理器內(nèi)核描述符定義在 include/asm-arm/procinfo.h[2]中,具體的函數(shù)實現(xiàn)在 arch/arm/mm/proc-xxx.S[2]中,在編譯連接過程中將各種處理器內(nèi)核描述符組合成表。接著從機(jī)器描述符(machine_desc)表(__mach_info_begin—__mach_info_end)中查詢有無r1 寄存器指定的機(jī)器編號,如果沒有就出錯退出。機(jī)器編號mach_type_xxx 在arch/arm/tools/mach-types[2]文件中說明,每個機(jī)器描述符中包括一個唯一的機(jī)器編號,機(jī)器描述符的定義在 include/asm-arm/mach/arch.h[2]中,具體實現(xiàn)在 arch/arm/mach-xxxx[2]文件夾中,在編譯連接過程中將基于同一種處理器的不同機(jī)器描述符組合成表。例如,基于AT91RM9200 處理器的各種機(jī)器描述符可以參考 arch/arm/mach-at91rm9200/board-xxx.c[2],機(jī)器編號為262 的機(jī)器描述符如下所示:
MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK")
/* Maintainer: SAN People/Atmel */
.phys_io = AT91_BASE_SYS,
.io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
.boot_params = AT91_SDRAM_BASE + 0x100,
.timer = &at91rm9200_timer,
.map_io = dk_map_io,
.init_irq = dk_init_irq,
.init_machine = dk_board_init,
MACHINE_END
最后就是打開MMU,并跳轉(zhuǎn)到 init/main.c[2]的start_kernel(初始化系統(tǒng)。在 init/main.c[2] 中,函數(shù)start_kernel()的部分代碼如下:
{
……
setup_arch();
……
}
在 arch/arm/kernel/setup.c[2]中,函數(shù)setup_arch()的部分代碼如下:
{
……
setup_processor();
mdesc=setup_machine(machine_arch_type);
……
parse_tags(tags);
……
}
setup_processor()函數(shù)從處理器內(nèi)核描述符表中找到匹配的描述符,并初始化一些處理器變量。setup_machine()用機(jī)器編號(在解壓函數(shù)decompress_kernel 中被賦值)作為參數(shù)返回機(jī)器描述符。從機(jī)器描述符中獲得內(nèi)核參數(shù)的物理地址,賦值給tags 變量。然后調(diào)用parse_tags()函數(shù)分析內(nèi)核參數(shù)鏈表,把各個參數(shù)值傳遞給全局變量。這樣內(nèi)核就收到了BootLoader 傳遞的參數(shù)。
5. 參數(shù)傳遞的驗證和測試
參數(shù)傳遞的結(jié)果可以通過內(nèi)核啟動的打印信息來驗證。
Machine: Atmel AT91RM9200-DK
……
Kernel command line: console=ttyS0,115200 root=/dev/ram rw init=/linuxrc
……
Memory: 64MB = 64MB total
……
checking if image is initramfs...it isn't (no cpio magic); looks like an initrd
Freeing initrd memory: 1024K
……
RAMDISK: Compressed image found at block 0
一個完備的BootLoader 是一個很復(fù)雜的工程,本文所介紹的只是嵌入式系統(tǒng)的BootLoaer 基本功能。任何一個BootLoader 都離不開這個基本功能,內(nèi)核只有接收這些參數(shù)才能正確地啟動,同時也為內(nèi)核的移植和調(diào)試奠定了良好的基礎(chǔ)。
BootLoader與Linux內(nèi)核的參數(shù)傳遞
相關(guān)推薦
Linux內(nèi)核中常用的C語言技巧有哪些呢?
Linux內(nèi)核采用的是GCC編譯器,GCC編譯器除了支持ANSI C,還支持GNU C。在Linux內(nèi)核中,許多地方都使用了GNU C語言的擴(kuò)展特性
2023-03-20 09:04:56738
Linux內(nèi)核的作用
Linux操作系統(tǒng)是當(dāng)今世界上最為廣泛使用的開源操作系統(tǒng)之一,內(nèi)核則是一個操作系統(tǒng)的核心和靈魂所在。對于一名Linux驅(qū)動開發(fā)者來說,了解Linux內(nèi)核的運行機(jī)制和Linux內(nèi)核提供的一些關(guān)鍵功能(如虛擬內(nèi)存管理、進(jìn)程管理、文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議棧等)都是我們?nèi)粘9ぷ骱蛯W(xué)習(xí)的重點。
2023-07-06 11:46:411046
linux驅(qū)動模塊參數(shù)傳遞方式
在嵌入式linux應(yīng)用開發(fā)中,可以給main()函數(shù)傳遞參數(shù),這樣應(yīng)用程序就能知道最初的控制參數(shù)是什么,當(dāng)然也可以選擇不向應(yīng)用程序傳遞參數(shù)。在驅(qū)動開發(fā)中,會使用到insmod命令來加載一個驅(qū)動模塊,這時候我們也可以使用insmod命令向驅(qū)動模塊傳遞參數(shù)。
2023-08-09 09:10:22246
linux內(nèi)核系統(tǒng)調(diào)用之參數(shù)傳遞
與普通函數(shù)一樣,系統(tǒng)調(diào)用通常需要一些輸入/輸出參數(shù),這些參數(shù)可能包括實際值(即數(shù)字)、用戶模式進(jìn)程地址空間中的變量地址,甚至包括指向用戶模式函數(shù)指針的數(shù)據(jù)結(jié)構(gòu)的地址(參見第11章“信號相關(guān)的系統(tǒng)調(diào)用”部分)。
2023-12-20 09:32:12323
Linux內(nèi)核中信號的傳遞過程
前面我們已經(jīng)介紹了內(nèi)核注意到信號的到來,調(diào)用相關(guān)函數(shù)更新進(jìn)程描述符以便進(jìn)程接收處理信號。但是,如果目標(biāo)進(jìn)程此時沒有運行,內(nèi)核則推遲傳遞信號?,F(xiàn)在,我們看看內(nèi)核如何處理進(jìn)程掛起的信號。
2024-01-17 09:51:05391
Linux內(nèi)核地址映射模型與Linux內(nèi)核高端內(nèi)存詳解
Linux 操作系統(tǒng)和驅(qū)動程序運行在內(nèi)核空間,應(yīng)用程序運行在用戶空間,兩者不能簡單地使用指針傳遞數(shù)據(jù),因為Linux使用的虛擬內(nèi)存機(jī)制,用戶空間的數(shù)據(jù)可能被換出,當(dāng)內(nèi)核空間使用用戶空間指針時,對應(yīng)
2018-05-08 10:33:193299
Bootloader的概念和用途------轉(zhuǎn)載
處理器上電執(zhí)行第一條指令的位置。 接下來分配參數(shù)區(qū),這里可以作為Bootloader的參數(shù)保存區(qū)域?! ≡傧聛?b class="flag-6" style="color: red">內(nèi)核映像區(qū)。Bootloader引導(dǎo)Linux內(nèi)核,就是要從這個地方把內(nèi)核映像解壓到RAM
2016-05-09 23:13:02
Linux內(nèi)核之系統(tǒng)調(diào)用
Linux內(nèi)核之系統(tǒng)調(diào)用1. 應(yīng)用程序通過API而不是直接調(diào)用系統(tǒng)調(diào)用來編程;2. getpid()系統(tǒng)調(diào)用示例:asmlinkage long sys_getpid(void){ return
2012-02-21 10:49:32
Linux內(nèi)核啟動過程和Bootloader(總述)
供給 Linux 內(nèi)核。Linux 內(nèi)核在啟動過程中會根據(jù)該處理器類型調(diào)用相應(yīng)的初始化程序(4)設(shè)置 Linux啟動參數(shù) Bootloader在執(zhí)行過程中必須設(shè)置和初始化 Linux 的內(nèi)核啟動參數(shù)。目前傳遞
2012-08-18 17:35:24
Linux內(nèi)核模塊程序結(jié)構(gòu)
。 (4)模塊參數(shù)(可選)。 模塊參數(shù)是模塊被加載的時候可以被傳遞給它的值,它本身對應(yīng)模塊內(nèi)部的全局變量。 (5)模塊導(dǎo)出符號(可選)。 內(nèi)核模塊可以導(dǎo)出符號(symbol,對應(yīng)于函數(shù)或變量),這樣其他模塊可以使用本模塊中的變量或函數(shù)。 (6)模塊作者等信息聲明(可選)。
2017-05-27 09:36:50
Linux內(nèi)核的最主要目的是什么
從上圖可以知道:① 組成:嵌入式Linux系統(tǒng) = bootloader + linux內(nèi)核 + 根文件系統(tǒng)(里面含有APP)。② bootloader:它的目的是啟動內(nèi)核,去哪讀內(nèi)核?讀到哪里?去
2021-12-17 07:09:09
Linux操作系統(tǒng)分層相關(guān)資料分享
過程BootLoarder是什么Linux操作系統(tǒng)分層一個嵌入式Linux系統(tǒng)從軟件的角度看通??梢苑譃樗膫€層次:引導(dǎo)加載程序。包括固化在固件(firmware)中的boot代碼(可選),和BootLoader兩大部分。Linux內(nèi)核。特定于嵌入式板子的定制內(nèi)核以及內(nèi)核的啟動參數(shù)。文件系統(tǒng)。包括根文件系統(tǒng)和建立于F
2021-11-04 07:38:49
Linux系統(tǒng)移植篇3:STM32MP1微處理器之設(shè)備樹簡介
會加載內(nèi)核并將控制權(quán)轉(zhuǎn)交給內(nèi)核,此外,還需要把上述的三個參數(shù)信息傳遞給kernel,以便kernel可以有較大的靈活性。在linux kernel中,Device Tree的設(shè)計目標(biāo)就是如此。
2021-08-26 11:08:21
bootloader和linux內(nèi)核啟動
為什么內(nèi)核不能直接啟動,非得bootloader加載呢,bootloader對于板子的初始化等內(nèi)核不能做嗎?
2012-10-20 11:25:32
Rk3399串口配置參數(shù)的傳遞過程如何去實現(xiàn)呢
的,通過該參數(shù)告訴內(nèi)核使用哪個串口以及波特率作為調(diào)試串口,bootargs可以在設(shè)備樹(dts)下配置,chosen里有屬性項bootargs,啟動linux時,內(nèi)核會使用chosen中定義
2022-05-24 10:15:58
TI AM335x_linux-3.14.43內(nèi)核移植筆記
Device Tree牽涉面比較廣,即增加了新的用于描述設(shè)備硬件信息的文本格式(即.dts文件),又增加了編譯這一文本的工具,同時Bootloader也需要支持將編譯后的Device Tree傳遞給Linux
2018-06-04 15:49:15
【OK210試用體驗】bootloader啟動linux內(nèi)核
由bootloader加載根文件系統(tǒng)到內(nèi)存。3.3. linux啟動參數(shù)bootloader可以給linux內(nèi)核傳遞啟動參數(shù)以控制其行為。linux內(nèi)核啟動參數(shù)位置并沒有需要特別注意的地方,一般默認(rèn)
2016-01-10 15:57:45
為什么畢業(yè)班自己寫Bootloader啟動內(nèi)核時會失?。?/a>
畢業(yè)班自己寫Bootloader,啟動內(nèi)核時出現(xiàn):確定內(nèi)核和文件系統(tǒng)沒有問題,用之前的U-boot可以正常啟動,自己寫的Bootloader不行Copy kernel from
2019-09-04 05:45:01
為什么需要進(jìn)行bootloader移植?
(firmware)中的boot程序(可選),和BootLoader兩大部分。Linux內(nèi)核特定于嵌入式平臺的定制內(nèi)核文件系統(tǒng)包括了系統(tǒng)命令和應(yīng)用程序。BootLoader概念BootLoade...
2021-12-17 07:43:58
學(xué)習(xí)嵌入式Linux-JZ2440-初識Bootloader
。有的Bootloader還具有網(wǎng)絡(luò)功能。Bootloader引導(dǎo)內(nèi)核,它和內(nèi)核也需要有參數(shù)的交互,不過因為二者不能夠同時運行,所以它們的交互是單向的,只能夠由Bootloader將各類參數(shù)傳遞給內(nèi)核
2015-05-13 15:43:52
嵌入式Linux系統(tǒng)組成部分
嵌入式Linux系統(tǒng)軟件由三部分組成:BootLoader(uboot)裸板軟件,初始化硬件+從閃存加載內(nèi)核到內(nèi)存并且啟動內(nèi)核+給內(nèi)核傳遞啟動參數(shù),告訴內(nèi)核根文件系統(tǒng)rootfs在什么地方。(上電...
2021-12-14 06:24:34
嵌入式開發(fā)中BootLoader/內(nèi)核和根文件系統(tǒng)之間的關(guān)系是什么
理解嵌入式開發(fā)中BootLoader、內(nèi)核和根文件系統(tǒng)之間的關(guān)系一般來說,為了使開發(fā)板成功運行linux系統(tǒng),我們需要完成以下三個方面的開發(fā)工作:bootloader(啟動裝載)kernel(內(nèi)核
2021-11-08 07:27:56
怎樣通過BootLoader加載Linux鏡像
在前面的實驗中,我們都是直接運行Linux內(nèi)核。而在實際的嵌入式系統(tǒng)中都是通過BootLoader加載Linux鏡像,然后再去運行。嵌入式BootLoader功能類似PC中的BIOS,用以檢測硬件
2021-11-05 08:30:59
自己寫的bootloader啟動內(nèi)核出現(xiàn)下面的情況該怎么辦?
跟著畢業(yè)班 自己寫bootloader 視頻;板子是JZ2440 V3;寫bootloader,編譯沒問題,啟動內(nèi)核時出現(xiàn)(NAND和NOR都燒寫過,無論從NAND還是NOR啟動問題一樣,里面原有
2019-10-10 01:40:26
自己動手寫Bootloader(基于jz2440)
;thekernel(0, 362, 0x30000100);Bootloader與內(nèi)核的交互是單向的,Bootloader將各類參數(shù)傳給內(nèi)核,由于它們不能同時運行,傳遞的辦法只有一個:Bootloader將
2017-08-05 20:53:38
請問內(nèi)核參數(shù)在nand flash中的地址該怎么確定?
u-boot傳遞給內(nèi)核的參數(shù),在nand flash中的位置怎么確定的?。繜龑懙臅r候把u-boot放在nand flash的0~0x60000,但內(nèi)核中把內(nèi)核參數(shù)定位在0x40000~0x60000范圍,這個范圍是內(nèi)核確定的嗎?u-boot中好像沒有關(guān)于內(nèi)核參數(shù)在nand flash中位置的代碼啊
2019-07-22 05:45:07
請問是不是參數(shù)傳遞出錯了?
kernelUncompressing Linux...uImage和u-boot都是用光盤里提供的補(bǔ)丁文件編譯出來,而且之前都沒問題.怎么用自己寫bootloader那一課的代碼卻卡死了呢?請問大家覺得是不是參數(shù)傳遞出錯了??
2019-06-17 05:45:01
適用于Linux的PSoC USBHID Bootloader
你好我正在編程通過USB編程PSoC。我在網(wǎng)站上找到了基于Windows的Bootloader主機(jī)程序。但是,我在Linux上工作。有基于Linux的Bootloader主機(jī)程序嗎?謝謝美好的一周奧
2018-09-07 11:49:43
高效學(xué)習(xí)Linux內(nèi)核——內(nèi)核模塊編譯
情況下,內(nèi)核模塊應(yīng)遵循GPL 兼容許可權(quán)。Linux2.6 內(nèi)核模塊最常見的是以MODULE_LICENSE(“Dual BSD/GPL”)語句聲明模塊采用BSD/GPL 雙LICENSE4)模塊參數(shù)
2021-09-24 09:11:03
Linux的內(nèi)核教程
本章學(xué)習(xí)目標(biāo)掌握LINUX內(nèi)核版本的含義理解并掌握進(jìn)程的概念掌握管道的概念及實現(xiàn)了解內(nèi)核的數(shù)據(jù)結(jié)構(gòu)了解LINUX內(nèi)核的算法掌握LINUX內(nèi)核升級的方法
2009-04-10 16:59:190
Linux內(nèi)核解讀入門
Linux內(nèi)核解讀入門關(guān)鍵詞:Linux, 內(nèi)核,源代碼一.核心源程序的文件組織: 1. Linux核心源程序通常都安裝在/usr/src/linux下,而且它有一個非常簡單的編號約定:任何偶數(shù)的核
2010-01-16 14:40:10103
基于MIPS64的嵌入式Linux Bootloader的移
結(jié)合OCTEON3010(MIPS64)的U-boot移植經(jīng)驗,介紹了嵌入式Linux Bootloader的工作原理及功能,設(shè)計一個基于MIPS體系的Bootloader模型。對OCTEON系列的MIPS處理器Bootloader的設(shè)計有一定參考價值和指導(dǎo)
2010-12-17 16:30:3556
Linux發(fā)明者推穩(wěn)定升級版2.6.13 Linux內(nèi)核
Linux內(nèi)核的下一個穩(wěn)定的升級版本已經(jīng)發(fā)布了。Linux發(fā)明者李納斯·托沃茲(Linus Torvalds)用電子郵件向Linux內(nèi)核郵件列表發(fā)布了升級版本的Linux內(nèi)核。
2006-03-13 13:07:54824
《深入Linux內(nèi)核架構(gòu)》 莫爾勒著
電子發(fā)燒友為您提供了免費下載,《深入Linux內(nèi)核架構(gòu)》一書討論了Linux內(nèi)核的概念、結(jié)構(gòu)和實現(xiàn)。內(nèi)核對一致和非一致內(nèi)存訪問系統(tǒng)使用相同的數(shù)據(jù)結(jié)構(gòu)。 Linux 操作系統(tǒng)的源代碼復(fù)雜
2011-07-10 11:24:170
解鎖BootLoader
BootLoader就是在操作系統(tǒng)內(nèi)核運行之前運行的一段小程序。本內(nèi)容介紹了BootLoader是什么及解鎖Bootloader
2012-05-30 17:00:543504
基于Linux 2.6內(nèi)核Makefile分析
由于Linux的獨特優(yōu)勢,使越來越多的企業(yè)和科研機(jī)構(gòu)把目光轉(zhuǎn)向Linux的開發(fā)和研究上。目前Linux最新的穩(wěn)定內(nèi)核版本為2.6.17,但是當(dāng)今絕大部分對于Linux Makefile的介紹文章都是
2017-09-18 19:09:090
java方法參數(shù)傳遞簡析
問:當(dāng)一個對象被當(dāng)作參數(shù)傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞? 答:是值傳遞。Java 編程語言只有值傳遞參數(shù)。當(dāng)一個對象實例作為
2017-09-27 17:03:290
Linux內(nèi)核配置系統(tǒng)詳解
隨著 Linux 操作系統(tǒng)的廣泛應(yīng)用,特別是 Linux 在嵌入式領(lǐng)域的發(fā)展,越來越多的人開始投身到 Linux 內(nèi)核級的開發(fā)中。面對日益龐大的 Linux 內(nèi)核源代碼,開發(fā)者在完成自己的內(nèi)核代碼
2017-11-01 15:45:543
Linux內(nèi)核移植相關(guān)代碼解析
及講解的不夠清楚之處,請各位網(wǎng)友指正,這里提前謝過。本文分以下部分進(jìn)行介紹: 1. Bootloader及內(nèi)核解壓 2. 內(nèi)核啟動方式介紹 3. 內(nèi)核啟動地址的確定 4. arch/armnommu
2017-11-07 11:29:400
linux內(nèi)核啟動參數(shù)設(shè)置
name”是關(guān)鍵字,內(nèi)核用它來識別應(yīng)該把“關(guān)鍵字”后面的值傳遞給誰,也就是如何處理這個值,是傳遞給處理進(jìn)程還是作為環(huán)境變量或者拋給“init”。值的個數(shù)限制為10,你可以通過再次使用該關(guān)鍵字使用超過10個的參數(shù)。
2017-11-14 16:50:483866
Linux內(nèi)核提權(quán)攻擊研究
提權(quán)攻擊是針對Linux系統(tǒng)的一種重要攻擊手段。根據(jù)提權(quán)攻擊所利用的漏洞類型,一般可將其分為應(yīng)用層提權(quán)攻擊和內(nèi)核提權(quán)攻擊。現(xiàn)有的防御技術(shù)已經(jīng)能夠防御基本的應(yīng)用層提權(quán)攻擊,但是并不能完全防御內(nèi)核
2017-11-24 11:46:030
U-boot傳遞RAM和Linux kernel讀取RAM參數(shù)的解析
U-boot會給Linux Kernel傳遞很多參數(shù),如:串口,RAM,videofb等。而Linux kernel也會讀取和處理這些參數(shù)。兩者之間通過struct tag來傳遞參數(shù)。U-boot
2018-02-06 08:24:535580
基于AT91RM9200 處理器系統(tǒng)中BootLoader與內(nèi)核的參數(shù)傳遞
本文著重介BootLoader與內(nèi)核之間 參數(shù)傳遞 這一基本功能。本文的硬件平臺是基于AT91RM9200 處理器系統(tǒng),軟件平臺是Linux-2.6.19.2 內(nèi)核。內(nèi)核映像文件為zImage。
2018-03-28 09:04:001724
函數(shù)參數(shù)傳遞的原理
參數(shù)傳遞,是在程序運行過程中,實際參數(shù)就會將參數(shù)值傳遞給相應(yīng)的形式參數(shù),然后在函數(shù)中實現(xiàn)對數(shù)據(jù)處理和返回的過程,方法有按值傳遞參數(shù),按地址傳遞參數(shù)和按數(shù)組傳遞參數(shù)。
2018-03-02 11:41:506871
Bootloader中LCD硬件初始化和軟件驅(qū)動程序設(shè)計
Android系統(tǒng)在正常啟動中,刷屏功能一般在內(nèi)核中執(zhí)行,而Bootloader的任務(wù)應(yīng)該是執(zhí)行硬件初始化,并盡快跳轉(zhuǎn)到Linux內(nèi)核。在Bootloader啟動過程中使能一個顯示驅(qū)動,實現(xiàn)刷屏功能
2018-03-07 14:05:068513
Linux內(nèi)核與Android的關(guān)系
Android雖然建立在Linux內(nèi)核之上,但是他對內(nèi)核進(jìn)行了一些擴(kuò)展,增加了一些驅(qū)動。比如Binder,loger等等驅(qū)動。可以拿Android內(nèi)核代碼和其Baseline版本進(jìn)行對比。可以看到Android對Linux內(nèi)核的所有擴(kuò)展。
2018-09-09 09:10:004369
基于嵌入式Linux系統(tǒng)的Bootloader模型在MIPS64上的移植設(shè)計淺析
Linux具備良好的裁剪性和移植性,并且開源、資源豐富,已成為嵌入式系統(tǒng)的開發(fā)熱點。一個完整的嵌入式Linux系通通常包括Bootloader、內(nèi)核、文件系統(tǒng)三部分,目標(biāo)板上電后由
2018-09-12 16:13:32771
嵌入式教程之Bootloader的詳細(xì)資料說明
,使得Linux 內(nèi)核可以在系統(tǒng)主存中跑起來,并讓系統(tǒng)符合Linux內(nèi)核啟動的必備條件,必須要有一個先于內(nèi)核運行的程序,他就是所謂的引導(dǎo)加載程序:Bootloader。
2018-12-11 13:59:575
移植Bootloader的過程總結(jié)資料說明
linux系統(tǒng)上電后啟動過程:---啟動引導(dǎo)加載程序bootloader(一些CPU在運行bootloader之前,會先運行一段固化的程序)。
---》啟動內(nèi)核
---》掛載根文件系統(tǒng)
其中
2018-12-11 17:11:279
Linux教程之如何進(jìn)行Bootloader的編寫詳細(xì)驅(qū)動學(xué)習(xí)資料匯總
Bootloader 把外部flash 中的內(nèi)核代碼讀入內(nèi)存(需要讀flash 的驅(qū)動,初始化時鐘,上電的時候只有12M,關(guān)看門狗之類的操作),并啟動內(nèi)核(跳轉(zhuǎn)到內(nèi)核的內(nèi)存地址,并需要傳遞一些參數(shù)到給內(nèi)核,讓內(nèi)核知道內(nèi)存大的大小,根文件地址在哪里等)。-----這只是啟動內(nèi)核,高級的還可以燒寫內(nèi)核。
2018-12-13 13:53:467
Linux內(nèi)核源碼分析--內(nèi)核啟動命令行的傳遞過程
內(nèi)核的啟動參數(shù)其實不僅僅包含在了cmdline中,cmdline不過是bootloader傳遞給內(nèi)核的信息中的一部分。bootloader和內(nèi)核的通信方式根據(jù)構(gòu)架的不同而異。
2019-05-05 15:28:131537
你了解u-boot與linux內(nèi)核間的參數(shù)傳遞過程?
U-boot會給Linux Kernel傳遞很多參數(shù),如:串口,RAM,videofb、MAC地址等。而Linux kernel也會讀取和處理這些參數(shù)。兩者之間通過struct tag來傳遞參數(shù)
2019-05-13 10:00:451415
用戶與內(nèi)核空間數(shù)據(jù)交換的方式之一:內(nèi)核啟動參數(shù)
Linux 提供了一種通過 bootloader 向其傳輸啟動參數(shù)的功能,內(nèi)核開發(fā)者可以通過這種方式來向內(nèi)核傳輸數(shù)據(jù),從而控制內(nèi)核啟動行為。
2019-05-14 15:42:19407
Linux bootloader 編寫方法
通過對 linux引導(dǎo)協(xié)議進(jìn)行分析,詳細(xì)闡述了如何編寫一個可以在 i386 機(jī)器上引導(dǎo) 2.4.20內(nèi)核的基本的bootloader。1.概述 linux運行在保護(hù)模式下,但是當(dāng)機(jī)器啟動復(fù)位的時候
2019-04-02 14:39:01284
谷歌Android設(shè)備內(nèi)核引入主線Linux內(nèi)核難嗎?
Android是基于Linux內(nèi)核的操作系統(tǒng),但是,運行在Android設(shè)備上的內(nèi)核其實與Google選擇的LTS版本Linux內(nèi)核有很大不同。
2019-11-22 10:41:422793
Linux內(nèi)核創(chuàng)建者回應(yīng)用戶,不會推薦使用ZFS On Linux
Linux內(nèi)核創(chuàng)建者Linus Torvalds最近回應(yīng) Linux內(nèi)核調(diào)度器存在問題的文章引發(fā)了大家的關(guān)注,在同一個帖子里,他還回復(fù)了一名用戶抱怨Linux內(nèi)核最近破壞了內(nèi)核源碼樹外ZFS模塊的評論。
2020-01-10 10:32:432363
linux內(nèi)核是什么_linux內(nèi)核學(xué)習(xí)路線
Linux內(nèi)核是一個操作系統(tǒng)(OS)內(nèi)核,本質(zhì)上定義為類Unix。它用于不同的操作系統(tǒng),主要是以不同的Linux發(fā)行版的形式。Linux內(nèi)核是第一個真正完整且突出的免費和開源軟件示例。Linux 內(nèi)核是第一個真正完整且突出的免費和開源軟件示例,促使其廣泛采用并得到了數(shù)千名開發(fā)人員的貢獻(xiàn)。
2020-09-16 15:49:502323
linux內(nèi)核參數(shù)設(shè)置_linux內(nèi)核的功能有哪些
本文主要闡述了linux內(nèi)核參數(shù)設(shè)置及linux內(nèi)核的功能。
2020-09-17 14:40:491190
Linux操作系統(tǒng)修改內(nèi)核參數(shù)的三種方法詳細(xì)說明
linux內(nèi)核的參數(shù)設(shè)置怎么弄呢,Linux 操作系統(tǒng)修改內(nèi)核參數(shù)有以下三種方式:
2020-10-06 18:03:0010381
最硬核的Linux內(nèi)核文章
來源 :頭條號@Linux學(xué)習(xí)教程,冰凌塊兒 01 前言 本文主要講解什么是Linux內(nèi)核,以及通過多張圖片展示Linux內(nèi)核的作用與功能,以便于讀者能快速理解什么是Linux內(nèi)核,能看懂Linux
2020-10-19 17:46:081860
快速理解什么是Linux內(nèi)核以及Linux內(nèi)核的內(nèi)容
01 前言 本文主要講解什么是Linux內(nèi)核,以及通過多張圖片展示Linux內(nèi)核的作用與功能,以便于讀者能快速理解什么是Linux內(nèi)核,能看懂Linux內(nèi)核。 擁有超過1300萬行的代碼,Linux
2020-10-21 12:02:533873
Linux 5.10.5內(nèi)核正式發(fā)布
1月6日,Linux基金會宣布,Linux 5.10.5內(nèi)核正式發(fā)布,所有5.10內(nèi)核系列的用戶都必須升級。
2021-01-07 14:36:572342
BootLoader與Linux內(nèi)核的參數(shù)傳遞詳細(xì)資料說明
不同的體系結(jié)構(gòu),如 ARM, Powerpc,X86,MIPS等。本文著重介紹 Bootloader與內(nèi)核之間參數(shù)傳遞這一基本功能。本文的硬件平臺是基于AT91RM9200處理器系統(tǒng),軟件平臺是 Linux-2.6.19,2內(nèi)核。內(nèi)核映像文件為 zimage
2021-03-16 10:39:0013
嵌入式LINUX系統(tǒng)內(nèi)核和內(nèi)核模塊調(diào)試
嵌入式LINUX系統(tǒng)內(nèi)核和內(nèi)核模塊調(diào)試(嵌入式開發(fā)和硬件開發(fā))-嵌入式LINUX系統(tǒng)內(nèi)核和內(nèi)核模塊調(diào)試? ? ? ? ? ? ? ? ?
2021-07-30 13:55:219
Linux內(nèi)核文件Cache機(jī)制
Linux內(nèi)核文件Cache機(jī)制(開關(guān)電源技術(shù)與設(shè)計 第二版)-Linux內(nèi)核文件Cache機(jī)制? ? ? ? ? ? ? ??
2021-08-31 16:34:544
【2.0】bootloader工作流程、MCU啟動流程
內(nèi)存空間的映射圖,然后調(diào)用Linux 內(nèi)核。Linux 內(nèi)核在完成系統(tǒng)的初始化之后需要掛載某個文件系統(tǒng)作為根文件系統(tǒng)(RootFilesystem),然后加載必要的內(nèi)核模塊,啟動應(yīng)用程序。(一個嵌入式...
2021-10-28 11:21:018
嵌入式 Linux 啟動流程和 bootloader 介紹
目錄嵌入式 Linux 啟動流程簡介啟動流程Bootloader 簡介市面上可見的 bootloader入式 Linux 啟動流程簡介對于一個 SoC 芯片而言,bootloader 必不可少。因為
2021-11-01 16:32:3811
嵌入式Linux操作系統(tǒng)引導(dǎo)加載程序BootLoarder
過程BootLoarder是什么Linux操作系統(tǒng)分層一個嵌入式Linux系統(tǒng)從軟件的角度看通常可以分為四個層次:引導(dǎo)加載程序。包括固化在固件(firmware)中的boot代碼(可選),和BootLoader兩大部分。Linux內(nèi)核。特定于嵌入式板子的定制內(nèi)核以及內(nèi)核的啟動參數(shù)。文件系統(tǒng)。包括根文件系統(tǒng)和建立于F
2021-11-01 17:05:508
嵌入式Linux的內(nèi)核編譯
實驗環(huán)境VMware Workstation PlayerUbuntu16.04kernel-3.2.tar.bz2Linux內(nèi)核編譯在ubuntu上編譯嵌入式Linux內(nèi)核,需要大家提前安裝好交叉
2021-11-01 17:07:2016
【Linux】嵌入式Linux系統(tǒng)的移植(下篇:BootLoader,以U-Boot為例)
BootLoaderBootLoader的概念BootLoader就是在操作系統(tǒng)內(nèi)核運行之前運行的一段小程序。通過這段小程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到
2021-11-01 17:37:1019
uboot研讀筆記 | 00 - 嵌入式Linux系統(tǒng)中Bootloader的作用和基本運行原理
1. 嵌入式Linux系統(tǒng)開發(fā)架構(gòu)一個嵌入式Linux的系統(tǒng)的架構(gòu)如下圖:軟件程序開發(fā)中,從下往上每一次的作用依次為:Bootloader:將硬件初始化,并將內(nèi)核引導(dǎo)起來;Linux Kernel
2021-11-02 13:36:3112
【嵌入式Linux之QEMU模擬器】5、使用u-boot加載Linux內(nèi)核
在前面的實驗中,我們都是直接運行Linux內(nèi)核。而在實際的嵌入式系統(tǒng)中都是通過BootLoader加載Linux鏡像,然后再去運行。嵌入式BootLoader功能類似PC中的BIOS,用以檢測硬件
2021-11-02 15:21:0314
理解嵌入式開發(fā)中BootLoader、內(nèi)核和根文件系統(tǒng)之間的關(guān)系
理解嵌入式開發(fā)中BootLoader、內(nèi)核和根文件系統(tǒng)之間的關(guān)系一般來說,為了使開發(fā)板成功運行linux系統(tǒng),我們需要完成以下三個方面的開發(fā)工作:bootloader(啟動裝載)kernel(內(nèi)核
2021-11-03 12:06:0613
為STM32寫bootloader 使用串口,實現(xiàn)程序IAP升級
,以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。BIOS是windows的bootloader,u-boot等為常見的Linux開發(fā)版的bootloader。ARM內(nèi)核芯片下載程序方式可分為三類;...
2021-12-24 19:02:232
Linux內(nèi)核架構(gòu)和工作原理
作用是將應(yīng)用層序的請求傳遞給硬件,并充當(dāng)?shù)讓域?qū)動程序,對系統(tǒng)中的各種設(shè)備和組件進(jìn)行尋址。目前支持模塊的動態(tài)裝卸(裁剪)。Linux內(nèi)核就是基于這個策略實現(xiàn)的。Linux進(jìn)程1.采用層次結(jié)構(gòu),每個進(jìn)程
2022-05-07 14:05:06284
學(xué)習(xí)linux內(nèi)核的一些建議
學(xué)習(xí)linux內(nèi)核,這個可不像學(xué)一門語言,c或者java一個月或者3月你就能精通掌握。學(xué)習(xí)linux內(nèi)核是需要一步一步循序漸進(jìn),掌握正確的linux內(nèi)核學(xué)習(xí)路線對學(xué)習(xí)至關(guān)重要,本篇文章就來分享學(xué)習(xí)linux內(nèi)核的一些建議吧。
2022-05-07 15:20:27447
【Linux內(nèi)核】從小小的宏定義窺探Linux內(nèi)核的精妙設(shè)計
【Linux內(nèi)核】從小小的宏定義窺探Linux內(nèi)核的精妙設(shè)計
2022-08-31 13:30:061602
Linux驅(qū)動開發(fā)-安裝驅(qū)動參數(shù)傳遞
Linux驅(qū)動安裝時也支持傳遞參數(shù),和命令行上運行的命令原理類似。 只不過在編寫驅(qū)動的時候,需要在驅(qū)動代碼里提前將相關(guān)信息聲明好才可以使用。 這篇文章就介紹如果在命令安裝驅(qū)動時,傳遞參數(shù)給驅(qū)動代碼,演示各種類型的參數(shù)傳輸情況。
2022-09-17 15:30:151156
Linux內(nèi)核移植教程
半導(dǎo)體廠商會從 Linux內(nèi)核官網(wǎng)下載某個版本,將其移植到自己的 CPU上,測試成功后就會將其開放給該半導(dǎo)體廠商的 CPU開發(fā)者。開發(fā)者下載其提供的 Linux內(nèi)核,然后將其移植到自己的產(chǎn)品上。
2023-04-19 11:20:32701
Linux內(nèi)核模塊參數(shù)傳遞與sysfs文件系統(tǒng)
Linux應(yīng)用開發(fā)中,為使應(yīng)用程序更加靈活地執(zhí)行用戶的預(yù)期功能,我們有時候會通過命令行傳遞一些參數(shù)到main函數(shù)中,使得代碼邏輯可以依據(jù)參數(shù)執(zhí)行不同的任務(wù)。同樣,Linux內(nèi)核也提供了類似main
2023-06-07 16:23:211241
Linux內(nèi)核如何使用結(jié)構(gòu)體和函數(shù)指針?
我將結(jié)合具體的Linux內(nèi)核驅(qū)動框架代碼來展示Linux內(nèi)核如何使用結(jié)構(gòu)體和函數(shù)指針。
2023-09-06 14:17:55516
Linux內(nèi)核入口stext段分析
/kernel/head.S preserve_boot_args 保存 bootloader 傳遞過來的參數(shù)。 el2_setup 是設(shè)置 Linux 啟動模式是 EL2。Linux 有 EL0、EL1
2023-09-28 17:07:55883
Linux內(nèi)核UDP收包為什么效率低
現(xiàn)在很多人都在詬病Linux內(nèi)核協(xié)議棧收包效率低,不管他們是真的懂還是一點都不懂只是聽別人說的,反正就是在一味地懟Linux內(nèi)核協(xié)議棧,他們的武器貌似只有DPDK。 但是,即便Linux內(nèi)核協(xié)議
2023-11-13 10:38:08214
評論
查看更多