日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简单BootLoader

發(fā)布時間:2025/4/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单BootLoader 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 簡單BootLoader
  • 概述
  • NOR與NAND啟動
  • 鏈接腳本規(guī)劃
  • 初始化規(guī)劃
  • 參數(shù)設(shè)置

簡單BootLoader

概述

目標(biāo):?啟動內(nèi)核,也就是需要讀取內(nèi)核到內(nèi)存,也就是操作flash和內(nèi)存

一個最基本的BootLoader應(yīng)該有以下步驟:

  • 初始化硬件:關(guān)看門狗、設(shè)置時鐘、設(shè)置SDRAM、初始化NAND FLASH
  • 如果bootloader比較大,要把它重定位到SDRAM
  • 把內(nèi)核從NAND FLASH讀到SDRAM
  • 設(shè)置要傳給內(nèi)核的參數(shù)
  • 跳轉(zhuǎn)執(zhí)行內(nèi)核
  • 優(yōu)化: 為了加快運(yùn)行速度,應(yīng)該提高主頻,打開Icach

    /* 啟動ICACHE */mrc p15, 0, r0, c1, c0, 0 @ read control regorr r0, r0, #(1<<12)mcr p15, 0, r0, c1, c0, 0 @ write it back

    NOR與NAND啟動

    參考文檔 ARM裸機(jī)>啟動流程

    • NAND 啟動自動復(fù)制到4KRAM

    • NOR啟動,片內(nèi)RAM為0x4000,0000

    鏈接腳本規(guī)劃

    我們從上圖可以看到,SDRAM的起始地址為0x3000,0000,SDRAM大小為64M,也就是地址頂端為0x3400,0000.預(yù)留512K給Bootloader,也就是規(guī)劃hex(0x34000000-512*1024)=0x33f8,0000為Bootloader的起始地址.鏈接腳本考慮字節(jié)對齊.

    SECTIONS {. = 0x33f80000;.text : { *(.text) }. = ALIGN(4);.rodata : {*(.rodata*)} . = ALIGN(4);.data : { *(.data) }. = ALIGN(4);__bss_start = .;.bss : { *(.bss) *(COMMON) }__bss_end = .; }

    鏈接腳本中有個COMMON段,這是未初始化的全局變量,一般情況下也是直接在鏈接階段放在bss段進(jìn)行清零.但是注意未初始化的全局變量與初始化為0的全局變量,并不對等.[未初始化的全局變量(COMMON段)為弱符號,如果有同名的全局變量,可能會存在覆蓋的情況]

    對于全局變量來說,如果初始化了不為0的值,那么該全局變量則被保存在data段,如果初始化的值為0,那么將其保存在bss段,如果沒有初始化,則將其保存在common段,等到鏈接時再將其放入到BSS段。關(guān)于第三點(diǎn)不同編譯器行為會不同,有的編譯器會把沒有初始化的全局變量直接放到BSS段。

    鏈接腳本中值的獲取,具體參考./鏈接腳本.md

    //匯編方法1 .global _bss_start _bss_start:.word __bss_start ldr r1, _bss_start //讀取內(nèi)存,這里是讀取label所在內(nèi)存的數(shù)據(jù) //匯編方法2 ldr r1, =__bss_start //C方法 extern int __bss_start; int val =&__bss_start; //!< 獲得__bss_start的值

    初始化規(guī)劃

    #define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02)) #define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01)) #define MEM_CTL_BASE 0x48000000.text .global _start _start:/* 1. 關(guān)看門狗 */ldr r0, =0x53000000mov r1, #0str r1, [r0]/* 2. 設(shè)置時鐘 */ldr r0, =0x4c000014// mov r1, #0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1mov r1, #0x05; // FCLK:HCLK:PCLK=1:4:8str r1, [r0]/* 如果HDIVN非0,CPU的總線模式應(yīng)該從“fast bus mode”變?yōu)椤癮synchronous bus mode” */mrc p15, 0, r1, c1, c0, 0 /* 讀出控制寄存器 */ orr r1, r1, #0xc0000000 /* 設(shè)置為“asynchronous bus mode” */mcr p15, 0, r1, c1, c0, 0 /* 寫入控制寄存器 *//* MPLLCON = S3C2440_MPLL_200MHZ */ldr r0, =0x4c000004ldr r1, =S3C2440_MPLL_400MHZstr r1, [r0]/* 啟動ICACHE */mrc p15, 0, r0, c1, c0, 0 @ read control regorr r0, r0, #(1<<12)mcr p15, 0, r0, c1, c0, 0 @ write it back/* 3. 初始化SDRAM */ldr r0, =MEM_CTL_BASEadr r1, sdram_config /* sdram_config的當(dāng)前地址 */add r3, r0, #(13*4) 1:ldr r2, [r1], #4str r2, [r0], #4cmp r0, r3bne 1b/* 4. 重定位 : 把bootloader本身的代碼從flash復(fù)制到它的鏈接地址去 */ldr sp, =0x34000000bl nand_initmov r0, #0ldr r1, =_startldr r2, =__bss_startsub r2, r2, r1bl copy_code_to_sdrambl clear_bss/* 5. 執(zhí)行main */ldr lr, =haltldr pc, =main halt:b haltsdram_config:.long 0x22011110 //BWSCON.long 0x00000700 //BANKCON0.long 0x00000700 //BANKCON1.long 0x00000700 //BANKCON2.long 0x00000700 //BANKCON3 .long 0x00000700 //BANKCON4.long 0x00000700 //BANKCON5.long 0x00018005 //BANKCON6.long 0x00018005 //BANKCON7.long 0x008C04F4 // REFRESH.long 0x000000B1 //BANKSIZE.long 0x00000030 //MRSRB6.long 0x00000030 //MRSRB7

    參數(shù)設(shè)置

    nand_read(0x60000+64, (unsigned char *)0x30008000, 0x200000); setup_start_tag(); setup_memory_tags(); setup_commandline_tag("noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"); setup_end_tag();void setup_start_tag(void) {params = (struct tag *)0x30000100;params->hdr.tag = ATAG_CORE;params->hdr.size = tag_size (tag_core);params->u.core.flags = 0;params->u.core.pagesize = 0;params->u.core.rootdev = 0;params = tag_next (params); }

    內(nèi)核存儲在0x60000+64,讀取到運(yùn)行地址0x30008000,參數(shù)存儲在0x30000100,最后傳入機(jī)器ID=362

    theKernel = (void (*)(int, int, unsigned int))0x30008000; theKernel(0, 362, 0x30000100);

    轉(zhuǎn)載:https://www.cnblogs.com/zongzi10010/p/10023691.html?

    總結(jié)

    以上是生活随笔為你收集整理的简单BootLoader的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲精品乱码久久久久久自慰 | 国产一区二区三区高清视频 | 高清av免费 | 在线观看 中文字幕 | 中文字幕一区二区三区四区 | 国产有码在线观看 | 亚洲精品一品 | 91香蕉久久 | 国产一区二区精品在线观看 | 色老头综合 | 美女免费黄色 | 香蕉国产片 | 中文字幕国产一区二区 | 91资源在线播放 | 香蕉在线看 | 国产乱人视频 | 亚洲区小说区图片区qvod | 免费网站在线观看人数在哪动漫 | 国内精品久久久久久久久久久 | 亚洲视频自拍偷拍 | 国产猛男猛女超爽免费视频 | 海角国产乱辈乱精品视频 | 日日夜夜爱爱 | 成人动漫在线观看免费 | 国产伦精品一区二区三区免费视频 | 久久对白| 午夜在线观看av | 一区二区三区91 | 男女视频免费 | 91精品国产亚洲 | 成人免费毛片网 | 亚洲精品91在线 | 青青视频一区二区 | 色婷婷aⅴ一区二区三区 | 亚洲涩涩在线 | 少妇一晚三次一区二区三区 | 免费观看美女裸体网站 | 精品国产乱码久久久久久蜜柚 | 老司机在线观看视频 | 日本一区视频在线播放 | 日韩专区在线观看 | 日本精品中文字幕 | 久久99久久99精品蜜柚传媒 | 在线看成人片 | 伊人伊色| 欧美成人精品一区二区 | 午夜寂寞院| 韩国三级hd两男一女 | 日日碰狠狠添天天爽无码av | www.夜夜 | av中文字幕在线免费观看 | 久久久电影 | 深夜的私人秘书 | 欧美一级片免费看 | 杨贵妃颤抖双乳呻吟求欢小说 | 谁有免费的黄色网址 | 内射国产内射夫妻免费频道 | 中日毛片 | 国产乱淫视频 | 非洲一级片 | 国产v在线观看 | 成人看片网 | 中文字幕在线免费观看 | 女主播在线观看 | 人善交videos欧美3d动漫 | 亚洲福利社区 | 一区二区三区四区日韩 | 激情欧美亚洲 | 日本大奶少妇 | 依人综合网| 国产日产精品一区二区三区四区 | 亚洲一区二区三区电影在线观看 | 老司机激情视频 | 日本色视频 | 亚洲国产成人精品久久久 | 福利视频在线看 | 色国产精品 | av黄色天堂 | 午夜精品导航 | 亚洲精品在线观看av | 五月天激情婷婷 | 中国一级特黄录像播放 | 毛色毛片 | 污污的视频软件 | 6680新视觉电影免费观看 | 国产精品欧美久久久久天天影视 | 香港三级韩国三级日本三级 | 男ji大巴进入女人的视频 | 成人久久毛片 | 国产视频一二三 | 告诉我真相俄剧在线观看 | 老司机激情影院 | 亚洲精品乱码久久久久久9色 | 男人午夜视频 | 中国一级黄色 | 不卡日本视频 | 亚洲一区二区三区不卡视频 | 亚洲一区欧洲一区 | 欧美成人手机在线视频 |