娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

     1. kernel運(yùn)行的史前時(shí)期和內(nèi)存布局

     在 arm平臺(tái)下,zImage.bin壓縮鏡像是由bootloader加載到物理內(nèi)存,然后跳到zImage.bin里一段程序,它專門于將被壓縮的 kernel解壓縮到KERNEL_RAM_PADDR開(kāi)始的一段內(nèi)存中,接著跳進(jìn)真正的kernel去執(zhí)行。該kernel的執(zhí)行起點(diǎn)是stext函數(shù),定義于arch/arm/kernel/head.S。


     1在分析stext函數(shù)前,先介紹此時(shí)內(nèi)存的布局如下圖所示

     在開(kāi)發(fā)板tqs3c2440中,SDRAM連接到內(nèi)存控制器的Bank6中,它的開(kāi)始內(nèi)存地址是0x30000000,大小為64M,即 0x20000000。 arm Linux kernel將SDRAM的開(kāi)始地址定義為PHYS_OFFSET。經(jīng)bootloader加載kernel并由自解壓部分代碼運(yùn)行后,最終kernel 被放置到KERNEL_RAM_PADDR(=PHYS_OFFSET + TEXT_OFFSET,即0x30008000)地址上的一段內(nèi)存,經(jīng)此放置后,kernel代碼以后均不會(huì)被移動(dòng)。


     1在進(jìn)入kernel代碼前,即bootloader和自解壓縮階段,arm未開(kāi)啟MMU功能。因此kernel啟動(dòng)代碼一個(gè)重要功能是設(shè)置好相應(yīng)的頁(yè)表,并開(kāi)啟MMU功能。為了支持MMU功能,kernel鏡像中的所有符號(hào),包括代碼段和數(shù)據(jù)段的符號(hào),在鏈接時(shí)都生成了它在開(kāi)啟MMU時(shí),所在物理內(nèi)存地址映射到的虛擬內(nèi)存地址。


     1以arm kernel第一個(gè)符號(hào)(函數(shù))stext為例,在編譯鏈接,它生成的虛擬地址是0xc0008000,而放置它的物理地址為0x30008000(還記得這是PHYS_OFFSET+TEXT_OFFSET嗎?)。實(shí)際上這個(gè)變換可以利用簡(jiǎn)單的公式進(jìn)行表示:va = pa – PHYS_OFFSET + PAGE_OFFSET。arm linux最終的kernel空間的頁(yè)表,就是按照這個(gè)關(guān)系來(lái)建立。


     之所以較早提及arm linux 的內(nèi)存映射,原因是在進(jìn)入kernel代碼,里面所有符號(hào)地址值為清一色的0xCXXXXXXX地址,而此時(shí)arm未開(kāi)啟MMU功能,故在執(zhí)行stext 函數(shù)第一條執(zhí)行時(shí),它的PC值就是stext所在的內(nèi)存地址(即物理地址,0x30008000)。因此,下面有些代碼,需要使用地址無(wú)關(guān)技術(shù)。


     2.一覽stext函數(shù)

     stext函數(shù)定義在Arch/arm/kernel/head.S,它的功能是獲取處理器類型和機(jī)器類型信息,并創(chuàng)建臨時(shí)的頁(yè)表,然后開(kāi)啟MMU功能,并跳進(jìn)第一個(gè)C語(yǔ)言函數(shù)start_kernel。

     stext函數(shù)的在前置條件是:MMU, D-cache, 關(guān)閉; r0 = 0, r1 = machine nr, r2 = atags prointer.

     代碼如下:


  1.   .section ".text.head", "ax" 


  2. (stext) 


  3. /* 設(shè)置CPU運(yùn)行模式為SVC,并關(guān)中斷 */ 


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


  5.                                      @ and irqs disabled 


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


  7.   bl    __lookup_processor_type         @ r5=procinfo r9=cupid 


  8. /* r10指向cpu對(duì)應(yīng)的proc_info記錄 */ 


  9.    movs  r10, r5                         @ invalid processor (r5=0)? 


  10.   beq __error_p                    @ yes, error 'p' 


  11.   bl    __lookup_machine_type            @ r5=machinfo 


  12. /* r8 指向開(kāi)發(fā)板對(duì)應(yīng)的arch_info記錄 */ 


  13.    movs  r8, r5                           @ invalid machine (r5=0)? 


  14.   beq __error_a                    @ yes, error 'a' 


  15. /* __vet_atags函數(shù)涉及bootloader造知kernel物理內(nèi)存的情況,我們暫時(shí)不分析它。 */ 


  16.   bl    __vet_atags 


  17. /*  創(chuàng)建臨時(shí)頁(yè)表 */ 


  18.   bl    __create_page_tables 




  19.   /*


  20.    * The following calls CPU specific code in a position independent


  21.    * manner.  See arch/arm/mm/proc-*.S for details.  r10 = base of


  22.    * xxx_proc_info structure selected by __lookup_machine_type


  23.    * above.  On return, the CPU will be ready for the MMU to be


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


  25.    */ 


  26. /* 這里的邏輯關(guān)系相當(dāng)復(fù)雜,先是從proc_info結(jié)構(gòu)中的中跳進(jìn)__arm920_setup函數(shù),


  27.   * 然后執(zhí)__enable_mmu 函數(shù)。最后在__enable_mmu函數(shù)通過(guò)mov pc, r13來(lái)執(zhí)行__switch_data,


  28.   * __switch_data函數(shù)在最后一條語(yǔ)句,魚躍龍門,跳進(jìn)第一個(gè)C語(yǔ)言函數(shù)start_kernel。

  29.    */ 


  30.   ldr   r13, __switch_data             @ address to jump to after 


  31.                                      @ mmu has been enabled 


  32.   adr  lr, __enable_mmu        @ return (PIC) address 


  33.   add pc, r10, #PROCINFO_INITFUNC 


  34. OC(stext) 


     3 __lookup_processor_type 函數(shù)

     __lookup_processor_type 函數(shù)是一個(gè)非常講究技巧的函數(shù),如果你將它領(lǐng)會(huì),也將領(lǐng)會(huì)kernel了一些魔法。


     Kernel 代碼將所有CPU信息的定義都放到.proc.info.init段中,因此可以認(rèn)為.proc.info.init段就是一個(gè)數(shù)組,每個(gè)元素都定義了一個(gè)或一種CPU的信息。目前__lookup_processor_type使用該元素的前兩個(gè)字段cpuid和mask來(lái)匹配當(dāng)前CPUID,如果滿足 CPUID & mask == cpuid,則找到當(dāng)前cpu的定義并返回。


     下面是tqs3c2440開(kāi)發(fā)板,CPU的定義信息,cpuid = 0x41009200,mask = 0xff00fff0。如果是碼是運(yùn)行在tqs3c2440開(kāi)發(fā)板上,那么函數(shù)返回下面的定義:


  1.        .section ".proc.info.init", #alloc, #execinstr 




  2.        .type       __arm920_proc_info,#object 


  3. __arm920_proc_info: 


  4.        .long       0x41009200 


  5.        .long       0xff00fff0 


  6.        .long   PMD_TYPE_SECT |  


  7.               PMD_SECT_BUFFERABLE |  


  8.               PMD_SECT_CACHEABLE |  


  9.               PMD_BIT4 |  


  10.               PMD_SECT_AP_WRITE |  


  11.               PMD_SECT_AP_READ 


  12.        .long   PMD_TYPE_SECT |  


  13.               PMD_BIT4 |  


  14.               PMD_SECT_AP_WRITE |  


  15.               PMD_SECT_AP_READ 


  16.       /* __arm920_setup函數(shù)在stext的未尾被調(diào)用,請(qǐng)往回看。*/ 


  17.        b     __arm920_setup 


  18.        .long       cpu_arch_name 


  19.        .long       cpu_elf_name 


  20.        .long       HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB 


  21.        .long       cpu_arm920_name 


  22.        .long       arm920_processor_functions 


  23.        .long       v4wbi_tlb_fns 


  24.        .long       v4wb_user_fns 


  25. #ifndef CONFIG_CPU_DCACHE_WRITETHROUGH 


  26.        .long       arm920_cache_fns 


  27. #else 


  28.        .long       v4wt_cache_fns 


  29. #endif 


  30.        .size __arm920_proc_info, . - __arm920_proc_info 


  1. /*

  2. * Read processor ID register (CP#15, CR0), and look up in the linker-built

  3. * supported processor list.  Note that we can't use the absolute addresses

  4. * for the __proc_info lists since we aren't running with the MMU on

  5. * (and therefore, we are not in the correct address space).  We have to

  6. * calculate the offset.

  7. *

  8. *   r9 = cpuid

  9. * Returns:

  10. *   r3, r4, r6 corrupted

  11. *   r5 = proc_info pointer in physical address space

  12. *   r9 = cpuid (preserved)

  13. */  

  14. __lookup_processor_type: 

  15.       /* adr 是相對(duì)尋址,它的尋計(jì)算結(jié)果是將當(dāng)前PC值加上3f符號(hào)與PC的偏移量,

  16.        * 而PC是物理地址,因此r3的結(jié)果也是3f符號(hào)的物理地址 */ 


  17.        adr  r3, 3f 


  18.       /* r5值為_(kāi)_proc_info_bein, r6值為_(kāi)_proc_ino_end,而r7值為.,

  19.        * 也即3f符號(hào)的鏈接地址。請(qǐng)注意,在鏈接期間,__proc_info_begin和

  20.        * __proc_info_end以及.均是鏈接地址,也即虛執(zhí)地址。

  21.        */ 


  22.        ldmda     r3, {r5 - r7} 


  23.      /* r3為3f的物理地址,而r7為3f的虛擬地址。結(jié)果是r3為虛擬地址與物理地址的差值,即PHYS_OFFSET - PAGE_OFFSET。*/ 


  24.        sub  r3, r3, r7                     @ get offset between virt&phys 


  25.      /* r5為_(kāi)_proc_info_begin的物理地址, 即r5指針__proc_info數(shù)組的首地址 */ 


  26.        add r5, r5, r3                     @ convert virt addresses to 


  27.      /* r6為_(kāi)_proc_info_end的物理地址 */ 


  28.        add r6, r6, r3                     @ physical address space 


  29.      /* 讀取r5指向的__proc_info數(shù)組元素的CPUID和mask值 */ 


  30. 1:    ldmia      r5, {r3, r4}                  @ value, mask 


  31.      /* 將當(dāng)前CPUID和mask相與,并與數(shù)組元素中的CPUID比較是否相同

  32.       * 若相同,則找到當(dāng)前CPU的__proc_info定義,r5指向訪元素并返回。

  33.       */ 


  34.        and  r4, r4, r9                     @ mask wanted bits 

[1] [2] [3] [4]
關(guān)鍵字:arm  linux  啟動(dòng)過(guò)程 引用地址:arm-linux啟動(dòng)過(guò)程

上一篇:關(guān)于ARM CM3的啟動(dòng)文件分析
下一篇:ARM 之LCD和LCD控制器

推薦閱讀

沒(méi)錯(cuò),小米電視在印度正受到消費(fèi)者的喜愛(ài),尤其是小尺寸智能電視,由于價(jià)格便宜,他們受到很多中低消費(fèi)者的熱捧。不過(guò),在印度彩電市場(chǎng),三星、LG和索尼的競(jìng)爭(zhēng)對(duì)手卻不是小米電視,而是TCL和還未面世的OnePlus電視。原因有三:一是三星、LG和索尼電視屬于中高端。由于定位的不同,區(qū)分出來(lái)和小米電視的消費(fèi)人群有一定差異;二是目前持有索尼、三星、LG和TC...
ARM處理器的工作狀態(tài)在ARM的體系結(jié)構(gòu)中,可以工作在三種不同的狀態(tài),一是ARM狀態(tài),二是Thumb狀態(tài)及Thumb-2狀態(tài),三是調(diào)試狀態(tài)。《嵌入式系統(tǒng)開(kāi)發(fā)與應(yīng)用教程(第2版)》上介紹說(shuō):有兩種狀態(tài)ARM狀態(tài)和Thumb狀態(tài),當(dāng)時(shí)初學(xué)甚為不解,現(xiàn)在一知半解時(shí)再看忽然想到了顯示中的例子:ARM核就好比一個(gè)高中學(xué)校,那種包含普通高中和職業(yè)高中的。普通高中就相當(dāng)于ARM...
近日,建廣資產(chǎn)完成對(duì)深圳文思海輝信息科技有限公司的投資,成為其戰(zhàn)略股東。目前,公司已更名為深圳建廣數(shù)字科技有限公司(“建廣數(shù)科”)。建廣數(shù)科專注于為傳統(tǒng)產(chǎn)業(yè)數(shù)字化轉(zhuǎn)型提供完整IT解決方案和端到端的IT服務(wù)。作為國(guó)內(nèi)最早從事ERP實(shí)施服務(wù)的專業(yè)咨詢公司之一,建廣數(shù)科目前已發(fā)展為本土最大的SAP和領(lǐng)先的Oracle全系列產(chǎn)品服務(wù)提供商,為高端裝備制...
日前,全志科技在投資者互動(dòng)平臺(tái)表示,公司基于RISC- V架構(gòu)內(nèi)核開(kāi)發(fā)的D1芯片已經(jīng)實(shí)現(xiàn)量產(chǎn),搭載這一芯片的開(kāi)發(fā)板已經(jīng)陸續(xù)開(kāi)始銷售,可根據(jù)客戶需求適配包括鴻蒙在內(nèi)的多個(gè)操作系統(tǒng)。此前全志科技披露,D1處理器芯片可廣泛應(yīng)用于智慧城市、智能汽車、智能商顯、智能家電、智能辦公等多個(gè)領(lǐng)域市場(chǎng)。據(jù)了解,全志科技D1芯片與平頭哥玄鐵906密切合作,結(jié)合其...

史海拾趣

問(wèn)答坊 | AI 解惑

新型反激變換器準(zhǔn)諧振控制器ICE1QS01及其應(yīng)用電路與設(shè)計(jì)

摘要:ICE1QS01是一種支持低功率待機(jī)和功率因數(shù)校正(PFC)的開(kāi)關(guān)電源準(zhǔn)諧振控制器。介紹了ICE1QS01的基本結(jié)構(gòu)、工作原理及其應(yīng)用電路與設(shè)計(jì)。 關(guān)鍵詞:準(zhǔn)諧振控制器;ICE1QS01;反激變換器;設(shè)計(jì)     0    引言   &nbs ...…

查看全部問(wèn)答∨

YX7603C

本人求購(gòu) YX7603C 有意者請(qǐng)留言!!!! 關(guān)于此芯片的信息 大家 交流 謝謝 ~——~ 初來(lái)乍到請(qǐng)多關(guān)照!!…

查看全部問(wèn)答∨

FPGA中DSP slice

請(qǐng)問(wèn) 怎樣使用Xilinx virtex系列器件內(nèi)嵌的dsp slice? 高手指教,謝謝!…

查看全部問(wèn)答∨

電腦會(huì)閑出病嗎?

    一位同事出差半個(gè)月回到家,電腦卻打不開(kāi)了,他把電腦搬到我的維修間來(lái)檢查,我先把機(jī)箱拆開(kāi),把板卡和內(nèi)存條拔出來(lái)重新插進(jìn)去,然后接上電源開(kāi)機(jī)試驗(yàn),看到電腦風(fēng)扇呼呼地轉(zhuǎn)動(dòng)起來(lái),顯示屏上出現(xiàn)了正常的自檢畫面,不一會(huì)兒,藍(lán)天白 ...…

查看全部問(wèn)答∨

關(guān)于VGA顯示掃描模塊

用vga640480這程序  實(shí)現(xiàn)一個(gè)HS里包含800個(gè)CLK  1個(gè)VS里包含525個(gè)HS library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity vga640480 is   port (clk :in std_logic;   ...…

查看全部問(wèn)答∨

windows ce 虛擬串口對(duì)驅(qū)動(dòng)

求wincewindows ce 虛擬串口對(duì)開(kāi)發(fā)思路? 要求windows ce 虛擬串口驅(qū)動(dòng)建立一個(gè)虛擬串口對(duì),這個(gè)虛擬串口對(duì),是彼此連接的。應(yīng)用程序,可以其中任何一個(gè)串口(com2),寫數(shù)據(jù),另一個(gè)串口com3,讀出數(shù)據(jù)。 大家?guī)蛶兔ρ剑 ?

查看全部問(wèn)答∨

wince的串口安全判斷問(wèn)題

wince需要與解碼器相連,如果斷開(kāi)時(shí)需要有發(fā)送不成功的提示,出了系統(tǒng)自帶的讀寫異常還有其他辦法來(lái)判斷發(fā)送沒(méi)有正確呢開(kāi)發(fā)語(yǔ)言是c#現(xiàn)在情況是這樣的,我用的是serialport控件,串口線接上以后接收事件就自動(dòng)觸發(fā),但沒(méi)法判斷是不是連接了解碼器,所以想 ...…

查看全部問(wèn)答∨

學(xué)完51單片機(jī),下一步PIC,AVR,還是啥呢?

如題,下一步該怎么走,還忘前輩們指教! …

查看全部問(wèn)答∨

msp430g2553 用捕獲的方法測(cè)脈寬長(zhǎng)度,但一直測(cè)的有問(wèn)題,求救啊

msp430g2553 用捕獲的方法測(cè)脈寬長(zhǎng)度,但一直測(cè)的有問(wèn)題,求救啊   程序如下: #include \"msp430g2553.h\" unsigned int start,end,overflow; float num; void main( void ) {   WDTCTL = WDTPW + WDTHOLD;  &nbs ...…

查看全部問(wèn)答∨

求助啊,很急

昨天刷了一下BOIS,nor flash的,配置什么的都沒(méi)問(wèn)題,但是再用ads調(diào)試就沒(méi)有現(xiàn)象了,程序好像正常運(yùn)行, 就是一個(gè)簡(jiǎn)單的led燈,以前沒(méi)有問(wèn)題的,什么辦法都用了,還是不行,用jlink調(diào)試出現(xiàn)下面提示,請(qǐng)高手看看是怎么回事,很急 其他功能都正常 ...…

查看全部問(wèn)答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

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

 
汽車開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(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
主站蜘蛛池模板: 南和县| 客服| 马尔康县| 三门峡市| 淄博市| 中牟县| 栾城县| 永康市| 平顶山市| 乳山市| 若尔盖县| 黎平县| 克拉玛依市| 探索| 兴和县| 大洼县| 宜兴市| 龙游县| 正定县| 吴堡县| 武定县| 安岳县| 中方县| 巴东县| 沈丘县| 南平市| 九台市| 福泉市| 武城县| 临江市| 通江县| 讷河市| 乐都县| 资中县| 永康市| 潞西市| 铜陵市| 乐东| 海丰县| 桦川县| 台中市|