国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

ARM-Linux移植之(一)——內(nèi)核啟動(dòng)流程分析

發(fā)布者:SereneNature最新更新時(shí)間:2024-07-16 來源: elecfans關(guān)鍵字:ARM  Linux移植 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

       內(nèi)核版本:2.6.22  為什么要采用這樣一個(gè)較低的版本進(jìn)行移植了,因?yàn)?a href="http://m.womende.cn/zhuanti/ivfv10" style="color:#4595e6;" target="_blank">韋東山大牛說了,低版本的才能學(xué)到東西,越是高版本需要移植時(shí)做的工作量越少,學(xué)的東西越少。


       內(nèi)核啟動(dòng)分為三個(gè)階段,第一是運(yùn)行head.S文件和head-common.S,第三個(gè)階段是允許第二是運(yùn)行main.c文件


       對(duì)于ARM的處理器,內(nèi)核第一個(gè)啟動(dòng)的文件是arc/arm/kernel下面的head.S文件。當(dāng)然arc/arm/boot/compress下面也有這個(gè)文件,這個(gè)文件和上面的文件略有不同,當(dāng)要生成壓縮的內(nèi)核時(shí)zImage時(shí),啟動(dòng)的是后者,后者與前者不同的時(shí),它前面的代碼是做自解壓的,后面的代碼都相同。我們這里這分析arc/arm/kernel下面的head.S文件。當(dāng)head.S所作的工作完成后它會(huì)跳到init/目錄下跌的main.c的start_kernel函數(shù)開始執(zhí)行。


 


第一階段:


 


首先截取部分head.S文件


ENTRY(stext)


       msr  cpsr_c,#PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode


                                          @ andirqs disabled


       mrc  p15,0, r9, c0, c0           @ get processor id


       bl    __lookup_processor_type             @ r5=procinfo r9=cpuid


       movs       r10,r5                         @ invalidprocessor (r5=0)?


       beq  __error_p                     @ yes, error 'p'


       bl    __lookup_machine_type        @ r5=machinfo


       movs       r8,r5                           @ invalidmachine (r5=0)?


       beq  __error_a                     @ yes, error 'a'


       bl    __create_page_tables


 


       /*


        *The following calls CPU specific code in a position independent


        *manner.  See arch/arm/mm/proc-*.S fordetails.  r10 = base of


        *xxx_proc_info structure selected by __lookup_machine_type


        *above.  On return, the CPU will be readyfor the MMU to be


        *turned on, and r0 will hold the CPU control register value.


        */


       ldr   r13,__switch_data        @ address to jump toafter


                                          @ mmuhas been enabled


       adr   lr,__enable_mmu          @ return (PIC)address


 



第一步,執(zhí)行的是__lookup_processor_type,這個(gè)函數(shù)是檢查處理器型號(hào),它讀取你的電路板的CPU型號(hào)與內(nèi)核支持的處理器進(jìn)行比較看是否能夠處理。這個(gè)我們不關(guān)心它的具體實(shí)現(xiàn)過程,因?yàn)楝F(xiàn)在主流處理器內(nèi)核都提供了支持。


       第二步,執(zhí)行的是__lookup_machine_type,這個(gè)函數(shù)是來檢查機(jī)器型號(hào)的,它會(huì)讀取你bootloader傳進(jìn)來的機(jī)器ID和他能夠處理的機(jī)器ID進(jìn)行比較看是否能夠處理。內(nèi)核的ID號(hào)定義在arc/arm/tool/mach_types文件中MACH_TYPE_xxxx宏定義。內(nèi)核究竟就如何檢查是否是它支持的機(jī)器的呢?實(shí)際上每個(gè)機(jī)器都會(huì)在/arc/arm/mach-xxxx/smdk-xxxx.c文件中有個(gè)描述特定機(jī)器的數(shù)據(jù)結(jié)構(gòu),如下


 


MACHINE_START(S3C2440,'SMDK2440')

       /* Maintainer: Ben Dooks */

       .phys_io  =S3C2410_PA_UART,

       .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

       .boot_params  = S3C2410_SDRAM_PA + 0x100,

 

       .init_irq   =s3c24xx_init_irq,

       .map_io          =smdk2440_map_io,

       .init_machine  = smdk2440_machine_init,

       .timer             =&s3c24xx_timer,

MACHINE_END

 



MACHINE_START和 MACHINE_END實(shí)際上被展開成一個(gè)結(jié)構(gòu)體


#defineMACHINE_START(_type,_name)                 

staticconst struct machine_desc __mach_desc_##_type       

 __used                                             

 __attribute__((__section__('.arch.info.init')))= {   

       .nr          =MACH_TYPE_##_type,           

       .name             =_name,

      

#defineMACHINE_END                         

};



 


于是上面的數(shù)據(jù)結(jié)構(gòu)就被展開為


staticconst struct machine_desc __mach_desc_S3C2440     

 __used                                             

 __attribute__((__section__('.arch.info.init')))= {   

       .nr          =MACH_TYPE_S3C2440,         

       .name             =”SMDK2440”,};

.phys_io  = S3C2410_PA_UART,

       .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

       .boot_params  = S3C2410_SDRAM_PA + 0x100,

 

       .init_irq   =s3c24xx_init_irq,

       .map_io          =smdk2440_map_io,

       .init_machine  = smdk2440_machine_init,

       .timer             =&s3c24xx_timer,

 

}



每個(gè)機(jī)器都會(huì)有一個(gè)machine_desc__mach_desc結(jié)構(gòu),內(nèi)核通過檢查每個(gè)machine_desc__mach_desc的nr號(hào)和bootloader傳上來的ID進(jìn)行比較,如果相同,內(nèi)核就認(rèn)為支持該機(jī)器,而且內(nèi)核在后面的工作中會(huì)調(diào)用該機(jī)器的machine_desc__mach_desc_結(jié)構(gòu)中的方法進(jìn)行一些初始化工作。


       第三步,創(chuàng)建一級(jí)頁(yè)表。


       第四步,在R13中保存__switch_data 這個(gè)函數(shù)的地址,在第四步使能mmu完成后會(huì)跳到該函數(shù)執(zhí)行。


第五步,執(zhí)行的是__enable_mmu,它是使能MMU,這個(gè)函數(shù)調(diào)用了__turn_mmu_on函數(shù),讓后在_turn_mmu_on在最后將第三步賦給R13的值傳給了PC指針 (mov    pc, r13),于是內(nèi)核開始跳到__switch_data這個(gè)函數(shù)開始執(zhí)行。


 


我們?cè)賮砜碼rch/arm/kenel/head-common.S這個(gè)文件中的__switch_data函數(shù)


 


__switch_data:

       .long       __mmap_switched

       .long       __data_loc                    @ r4

       .long       __data_start                  @ r5

       .long       __bss_start                    @ r6

       .long       _end                            @ r7

       .long       processor_id                 @ r4

       .long       __machine_arch_type           @ r5

       .long       cr_alignment                 @ r6

       .long       init_thread_union+ THREAD_START_SP @ sp

 

/*

 * The following fragment of code is executedwith the MMU on in MMU mode,

 * and uses absolute addresses; this is notposition independent.

 *

 *  r0  =cp#15 control register

 * r1  = machine ID

 * r9  = processor ID

 */

       .type       __mmap_switched,%function

__mmap_switched:

       adr   r3,__switch_data + 4

 

       ldmia      r3!,{r4, r5, r6, r7}

       cmp r4,r5                           @ Copy datasegment if needed

1:    cmpne     r5,r6

       ldrne       fp,[r4], #4

       strne       fp,[r5], #4

       bne  1b

 

       mov fp,#0                           @ Clear BSS(and zero fp)

1:    cmp r6,r7

       strcc fp,[r6],#4

       bcc  1b

 

       ldmia      r3,{r4, r5, r6, sp}

       str    r9, [r4]                  @ Save processor ID

       str    r1, [r5]                  @ Save machine type

       bic   r4,r0, #CR_A               @ Clear 'A' bit

       stmia       r6,{r0, r4}                   @ Save controlregister values

       b     start_kernel



 


這個(gè)函數(shù)做的工作是,復(fù)制數(shù)據(jù)段清楚BBS段,設(shè)置堆在指針,然后保存處理器內(nèi)核和機(jī)器內(nèi)核等工作,最后跳到start_kernel函數(shù)。于是內(nèi)核開始執(zhí)行第二階段。


 


第二階段:


 


       我們?cè)賮砜磇nit/目錄下的main.c的start_kernel函數(shù),這里我只截圖了部分。


asmlinkage void __init start_kernel(void)

{

       …………………….

       ……………………..

       printk(KERN_NOTICE);

       printk(linux_banner);

       setup_arch(&command_line);

       setup_command_line(command_line);

      

      

       parse_early_param();

       parse_args('Booting kernel',static_command_line, __start___param,

                __stop___param - __start___param,

[1] [2]
關(guān)鍵字:ARM  Linux移植 引用地址:ARM-Linux移植之(一)——內(nèi)核啟動(dòng)流程分析

上一篇:ARM-Linux移植之(二)——Linux2.6.22內(nèi)核移植
下一篇:mini2440內(nèi)核大于2M燒寫方法

推薦閱讀最新更新時(shí)間:2025-06-08 02:40

基于ARM的嵌入式Linux移植真實(shí)體驗(yàn)(4)――設(shè)備驅(qū)動(dòng)
設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口,它為應(yīng)用程序屏蔽硬件的細(xì)節(jié),一般來說,Linux的設(shè)備驅(qū)動(dòng)程序需要完成如下功能: 設(shè)備初始化、釋放; 提供各類設(shè)備服務(wù); 負(fù)責(zé)內(nèi)核和設(shè)備之間的數(shù)據(jù)交換; 檢測(cè)和處理設(shè)備工作過程中出現(xiàn)的錯(cuò)誤。 Linux下的設(shè)備驅(qū)動(dòng)程序被組織為一組完成不同任務(wù)的函數(shù)的集合,通過這些函數(shù)使得Linux的設(shè)備操作猶如文件一般。在應(yīng)用程序看來,硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作,如open ()、close ()、read ()、write () 等。 Linux主要將設(shè)備分為二類:字符設(shè)備和塊設(shè)備。字符設(shè)備是指設(shè)備發(fā)送和接收數(shù)據(jù)以字符的形式進(jìn)行;而
[單片機(jī)]
基于<font color='red'>ARM</font>的嵌入式<font color='red'>Linux</font><font color='red'>移植</font>真實(shí)體驗(yàn)(4)――設(shè)備驅(qū)動(dòng)
Linux移植之make uImage編譯過程分析
編譯出uboot可以運(yùn)行的linux內(nèi)核代碼的命令是make uImage,下面詳細(xì)介紹下生成linux-2.6.22.6/arch/arm/boot/uImage的過程: 1、vmlinux、Image、uImage、zImage的區(qū)別 2、vmlinux生成過程簡(jiǎn)介 3、uImage生成過程簡(jiǎn)介 1、vmlinux、Image、uImage、zImage的區(qū)別,在執(zhí)行make uImage之后會(huì)在%生成如下幾個(gè)文件Image、uImage、zImage。 vmlinux是可引導(dǎo)的、壓縮的內(nèi)核。“vm”代表“Virtual Memory”。Linux 支持虛擬內(nèi)存,不像老的操作系統(tǒng)比如DOS有640KB內(nèi)存的限制。Lin
[單片機(jī)]
<font color='red'>Linux</font><font color='red'>移植</font>之make uImage編譯過程分析
Linux中SPI子系統(tǒng)圖解和mini2440下的SPI驅(qū)動(dòng)移植
1.SPI子系統(tǒng)框圖詳解: SPI總線上有兩類設(shè)備:一類是主控端,通常作為SOC系統(tǒng)的一個(gè)子模塊出現(xiàn),比如很多嵌入式MPU中都常常包含SPI模塊。一類是受控端,例如一些SPI接口的Flash、傳感器等等。主控端是SPI總線的控制者,通過使用SPI協(xié)議主動(dòng)發(fā)起SPI總線上的會(huì)話。而受控端則被動(dòng)接受SPI主控端的指令,并作出響應(yīng)的響應(yīng)。 如圖1所示,linux下的spi子系統(tǒng)主要涉及3個(gè)部分:spi核心、spiprotocol驅(qū)動(dòng)和spi主控制器驅(qū)動(dòng)。如圖1.1,spi核心負(fù)責(zé)抽象出所有控制器都具備的功能代碼,同時(shí)向上為spiprotocol驅(qū)動(dòng)提供接口比如spi_message、spi_transfer,spi_async等,具
[單片機(jī)]
<font color='red'>Linux</font>中SPI子系統(tǒng)圖解和mini2440下的SPI驅(qū)動(dòng)<font color='red'>移植</font>
OK6410A 開發(fā)板 (八) 7 linux-5.11 OK6410A usb camera移植
代碼 : https://github.com/lisider/linux/tree/ok6410a-linux-5.11 提交id : 0cf53aa024fbd417f0796a77ff7f9b891680dac8 defconfig : arch/arm/configs/ok6410A_sdboot_mini_net_lcd_x11_usb_debug_uvc_defconfig 用戶空間代碼 uvc_cam_test Makefile CROSS_COMPILE =arm-none-linux-gnueabi- KERNELDIR = CFLAGS = -I$(KERNELDIR)/include -O -Wa
[單片機(jī)]
Linux-2.6.32.2內(nèi)核在mini2440上的移植(十四)---移植看門狗驅(qū)動(dòng)
移植環(huán)境 1,主機(jī)環(huán)境:VMare下CentOS 5.5 ,1G內(nèi)存。 2,集成開發(fā)環(huán)境:Elipse IDE 3,編譯編譯環(huán)境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,開發(fā)板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,參考文章: 嵌入式linux應(yīng)用開發(fā)完全手冊(cè),韋東山,編著。 Mini2440 之Linux 移植開發(fā)實(shí)戰(zhàn)指南 Linux-2.6.32.2 內(nèi)核具有完善的S3C2440 的看夢(mèng)狗驅(qū)動(dòng),我們只需配
[單片機(jī)]
Linux-2.6.32.2內(nèi)核在mini2440上的移植(十六)---中斷的按鍵驅(qū)動(dòng)
移植環(huán)境 1,主機(jī)環(huán)境:VMare下CentOS 5.5 ,1G內(nèi)存。 2,集成開發(fā)環(huán)境:Elipse IDE 3,編譯編譯環(huán)境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,開發(fā)板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,參考文章: 嵌入式linux應(yīng)用開發(fā)完全手冊(cè),韋東山,編著。 Mini2440 之Linux 移植開發(fā)實(shí)戰(zhàn)指南 【1】硬件原理 Mini2440 具有6 個(gè)用戶測(cè)試按鍵,它們都是連接到CPU 的中斷
[單片機(jī)]
<font color='red'>Linux</font>-2.6.32.2<font color='red'>內(nèi)核</font>在mini2440上的<font color='red'>移植</font>(十六)---中斷的按鍵驅(qū)動(dòng)
Arm 架構(gòu)將占據(jù)半數(shù) 2025 年出貨到頭部云服務(wù)提供商的算力
六年多前,Arm 推出面向下一代云基礎(chǔ)設(shè)施的 Arm Neoverse 平臺(tái),并堅(jiān)信此靈活且高能效的計(jì)算平臺(tái)所帶來的可擴(kuò)展性能水平,能夠推動(dòng)數(shù)據(jù)中心生態(tài)系統(tǒng)在功能和成本方面實(shí)現(xiàn)系統(tǒng)性的變革。 如今, Neoverse 技術(shù)的部署已達(dá)到了新的高度:2025 年出貨到頭部超大規(guī)模云服務(wù)提供商的算力中,將有近 50% 是基于 Arm 架構(gòu)。 在人工智能 (AI) 時(shí)代,云計(jì)算格局正經(jīng)歷根本性重塑。復(fù)雜的訓(xùn)練與推理工作負(fù)載催生了無(wú)盡的算力需求,并對(duì)云數(shù)據(jù)中心帶來巨大的壓力。鑒于 AI 服務(wù)器的數(shù)量在未來幾年將增長(zhǎng)超過 300%,高能效不再是競(jìng)爭(zhēng)優(yōu)勢(shì),而將成為行業(yè)的基本要求。如今,數(shù)據(jù)中心設(shè)計(jì)所考量的功耗單位已從兆瓦級(jí)躍升到千兆瓦的
[網(wǎng)絡(luò)通信]
arm初識(shí)
一.CPU從指令集角度分類   1.1. CISC (X86)     1.1. 1. CISC CPU 指complex instruction set computer復(fù)雜指令集CPU     1.1.2. CISC體系的設(shè)計(jì)理念:       a. 是用最少的指令來完成任務(wù)(譬如計(jì)算乘法只需要一條MUL指令即可),因此CISC的CPU本身設(shè)計(jì)復(fù)雜、工藝復(fù)雜,但好處是編譯器好設(shè)計(jì)。CISC出現(xiàn)較早,至今Intel還一直采用CISC設(shè)計(jì)   1.2. RISC (RAM)     1.2.1. RISC CPU 指:Reduced Instruction-Set Computer精簡(jiǎn)指令集CPU     1.2.2. RISC的
[單片機(jī)]
<font color='red'>arm</font>初識(shí)
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved