亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? arm 嵌入式linux啟動過程(1).txt

?? arm 嵌入式LINUX啟動過程,詳細(xì)介紹了啟動過程
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
.global JumpToKernel0x 
// r0 = jump address 
// r1 = arguments to use (these get shifted) 


由于arm-GCC的c參數(shù)調(diào)用的順序是從左到右R0開始,所以R0是KERNKEL的地址, 
r1是參數(shù)字符串的地址: 



到此為止,為linux引導(dǎo)做的準(zhǔn)備工作就結(jié)束了,下一回我們就正式進(jìn)入linux的代碼。 



好,從本節(jié)開始,我們走過了bootloader的漫長征途,開始進(jìn)入linux的內(nèi)核: 
說實(shí)話,linux寶典的確高深莫測,洋人花了十幾年修煉,各種內(nèi)功心法層處不窮。有些地方反復(fù)推敲也領(lǐng)悟不了其中奧妙,煉不到第九重啊。。 


linux的入口是一段匯編代碼,用于基本的硬件設(shè)置和建立臨時(shí)頁表,對于 
ARM LINUX是 linux/arch/arm/kernle/head-armv.S, 走! 


#if defined(CONFIG_MX1) 
mov r1, #MACH_TYPE_MX1 
#endif 


這第一句話好像就讓人看不懂,好像葵花寶典開頭的八個字:欲練神功。。。。 


那來的MACH_TYPE_MX1?其實(shí),在head-armv.S 
中的一項(xiàng)重要工作就是設(shè)置內(nèi)核的臨時(shí)頁表,不然mmu開起來也玩不轉(zhuǎn),但是內(nèi)核怎么知道如何映射內(nèi)存呢?linux的內(nèi)核將映射到虛地址0xCxxx xxxx處,但他怎么知道把哪一片ram映射過去呢? 


因?yàn)椴煌ǖ南到y(tǒng)有不通的內(nèi)存影像,所以,LINUX約定,內(nèi)核代碼開始的時(shí)候, 
R1放的是系統(tǒng)目標(biāo)平臺的代號,對于一些常見的,標(biāo)準(zhǔn)的平臺,內(nèi)核已經(jīng)提供了支持,只要在編譯的時(shí)候選中就行了,例如對X86平臺,內(nèi)核是從物理地址1M開始映射的。如果老兄是自己攢的平臺,只好麻煩你自己寫了。 


小弟拿人錢財(cái),與人消災(zāi),用的是摩托的MX1,只好自己寫了,定義了#MACH_TYPE_MX1,當(dāng)然,還要寫一個描述平臺的數(shù)據(jù)結(jié)構(gòu): 


MACHINE_START(MX1ADS, "Motorola MX1ADS") 
MAINTAINER("SPS Motorola") 


BOOT_MEM(0x08000000, 0x00200000, 0xf0200000) 


FIXUP(mx1ads_fixup) 
MAPIO(mx1ads_map_io) 
INITIRQ(mx1ads_init_irq) 
MACHINE_END 


看起來怪怪的,但現(xiàn)在大家只要知道他定義了基本的內(nèi)存映象:RAM從0x08000000開始,i/o空間從0x00200000開始,i/o空間映射到虛擬地址空間 
0xf0200000開始處。摩托的芯片i/o和內(nèi)存是統(tǒng)一編址的。 
其他的項(xiàng),在下面的初始化過程中會逐個介紹到。 


好了好了,再看下面的指令: 



mov r0, #F_BIT | I_BIT | MODE_SVC @ make sure svc mode //設(shè)置為SVC模式,允許中斷和快速中斷 
//此處設(shè)定系統(tǒng)的工作狀態(tài),arm有7種狀態(tài) 
//每種狀態(tài)有自己的堆棧 


msr cpsr_c, r0 @ and all irqs diabled 
bl __lookup_processor_type 


//定義處理器相關(guān)信息,如value, mask, mmuflags, 
//放在proc.info段中 
//__lookup_processor_type 取得這些信息,在下面 
//__lookup_architecture_type 中用 


這一段是查詢處理器的種類,大家知道arm有arm7, arm9等類型,如何區(qū)分呢? 
在arm協(xié)處理器中有一個只讀寄存器,存放處理器相關(guān)信息。__lookup_processor_type將返回如下的結(jié)構(gòu): 


__arm920_proc_inf 
.long 0x41009200 //CPU id 
.long 0xff00fff0 //cpu mask 
.long 0x00000c1e @ mmuflags 
b __arm920_setup 
.long cpu_arch_name 
.long cpu_elf_name 
.long HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT 
.long cpu_arm920_info 
.long arm920_processor_functions 



第一項(xiàng)是CPU id,將與協(xié)處理器中讀出的id作比較,其余的都是與處理器相關(guān)的 
信息,到下面初始化的過程中自然會用到。。 


查詢到了處理器類型和系統(tǒng)的內(nèi)存映像后就要進(jìn)入初始化過程中比較關(guān)鍵的一步了,開始設(shè)置mmu,但首先要設(shè)置一個臨時(shí)的內(nèi)核頁表,映射4m的內(nèi)存,這在初始化過程中是足夠了: 


//r5=0800 0000 ram起始地址 r6=0020 0000 io地址,r7=f020 0000 虛io 
teq r7, #0 @ invalid architecture? 
moveq r0, #'a' @ yes, error 'a' 
beq __error 
bl __create_page_tables 


其中__create_page_tables為: 
__create_page_tables: 
pgtbl r4 
//r4=0800 4000 臨時(shí)頁表的起始地址 
//r5=0800 0000, ram的起始地址 
//r6=0020 0000, i/o寄存器空間的起始地址 
//r7=0000 3c08 
//r8=0000 0c1e 


//the page table in 0800 4000 is just temp base page, when init_task's sweaper_page_dir ready, 
// the temp page will be useless 
// the high 12 bit of virtual address is base table index, so we need 4kx4 = 16k temp base page, 


mov r0, r4 
mov r3, #0 
add r2, r0, #0x4000 @ 16k of page table 
1: str r3, [r0], #4 @ Clear page table 
str r3, [r0], #4 
str r3, [r0], #4 
str r3, [r0], #4 
teq r0, r2 
bne 1b 
/* 
* Create identity mapping for first MB of kernel. 
* This is marked cacheable and bufferable. 
* 
* The identity mapping will be removed by 
*/ 


// 由于linux編譯的地址是0xC0008000,load的地址是0x08008000,我們需要將虛地址0xC0008000映射到0800800一段 
//同時(shí),由于部分代碼也要直接訪問0x08008000,所以0x08008000對應(yīng)的表項(xiàng)也要填充 
// 頁表中的表象為section,AP=11表示任何模式下可訪問,domain為0。 
add r3, r8, r5 @ mmuflags + start of RAM 
//r3=0800 0c1e 
add r0, r4, r5, lsr #18 
//r0=0800 4200 
str r3, [r0] @ identity mapping 
//*0800 4200 = 0800 0c1e 0x200表象 對應(yīng)的是0800 0000 的1m 
/* 
* Now setup the pagetables for our kernel direct 
* mapped region. We round TEXTADDR down to the 
* nearest megabyte boundary. 
*/ 
//下面是映射4M 


add r0, r4, #(TEXTADDR & 0xfff00000) >> 18 @ start of kernel 
//r0 = r4+ 0x3000 = 0800 4000 + 3000 = 0800 7000 
str r3, [r0], #4 @ PAGE_OFFSET + 0MB 
//*0800 7004 = 0800 0c1e 
add r3, r3, #1 << 20 
//r3=0810 0c1e 
str r3, [r0], #4 @ PAGE_OFFSET + 1MB 
//*0800 7008 = 0810 0c1e 
add r3, r3, #1 << 20 
str r3, [r0], #4 
//*0800 700c = 0820 0c1e @ PAGE_OFFSET + 2MB 
add r3, r3, #1 << 20 
str r3, [r0], #4 @ PAGE_OFFSET + 3MB 
//*0800 7010 = 0830 0c1e 





bic r8, r8, #0x0c @ turn off cacheable 
//r8=0000 0c12 @ and bufferable bits 
mov pc, lr //子程序返回。 
下一回就要開始打開mmu的操作了 


上回書講到已經(jīng)設(shè)置好了內(nèi)核的頁表,然后要跳轉(zhuǎn)到__arm920_setup, 
這個函數(shù)在arch/arm/mm/proc-arm929.s 


__arm920_setup: 
mov r0, #0 
mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 
mcr p15, 0, r0, c7, c10, 4@ drain write buffer on v4 
mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 
mcr p15, 0, r4, c2, c0 @ load page table pointer 
mov r0, #0x1f @ Domains 0, 1 = client 
mcr p15, 0, r0, c3, c0 @ load domain access register 
mrc p15, 0, r0, c1, c0 @ get control register v4 
/* 
* Clear out 'unwanted' bits (then put them in if we need them) 
*/ 
@ VI ZFRS BLDP WCAM 
bic r0, r0, #0x0e00 
bic r0, r0, #0x0002 
bic r0, r0, #0x000c 
bic r0, r0, #0x1000 @ ...0 000. .... 000. 
/* 
* Turn on what we want 
*/ 
orr r0, r0, #0x0031 
orr r0, r0, #0x2100 @ ..1. ...1 ..11 ...1 


#ifdef CONFIG_CPU_ARM920_D_CACHE_ON 
orr r0, r0, #0x0004 @ .... .... .... .1.. 
#endif 
#ifdef CONFIG_CPU_ARM920_I_CACHE_ON 
orr r0, r0, #0x1000 @ ...1 .... .... .... 
#endif 
mov pc, lr 


這一段首先關(guān)閉i,d cache,清除write buffer ,然后設(shè)置頁目錄地址,設(shè)置 
domain的保護(hù),在上節(jié)中,注意到頁目錄項(xiàng)的domain都是0,domain寄存器中 
的domain 0 對應(yīng)的是0b11,表示訪問模式為manager,不受限制。 


接下來設(shè)置控制寄存器,打開d,i cache和mmu 
注意arm的d cache必須和mmu一起打開,而i cache可以單獨(dú)打開 


其實(shí),cache和mmu的關(guān)系實(shí)在是緊密,每一個頁表項(xiàng)都有標(biāo)志標(biāo)示是否是 
cacheable的,可以說本來就是設(shè)計(jì)一起使用的 


最后,自函數(shù)返回后,有一句 
mcr p15, 0, r0, c1, c0 
使設(shè)置生效。 



上回我們講到arm靠初始化完成了,打開了cache, 
到此為止,匯編部分的初始化代碼就差不多了,最后還有幾件事情做: 


1。初始化BSS段,全部清零,BSS是全局變量區(qū)域。 
2。保存與系統(tǒng)相關(guān)的信息:如 
.long SYMBOL_NAME(compat) 
.long SYMBOL_NAME(__bss_start) 
.long SYMBOL_NAME(_end) 
.long SYMBOL_NAME(processor_id) 
.long SYMBOL_NAME(__machine_arch_type) 
.long SYMBOL_NAME(cr_alignment) 
.long SYMBOL_NAME(init_task_union)+8192 
不用講,大家一看就明白意思 


3。重新設(shè)置堆棧指針,指向init_task的堆棧。init_task是系統(tǒng)的第一個任務(wù),init_task的堆棧在task structure的后8K,我們后面會看到。 


4。最后就要跳到C代碼的start_kernel。 
b SYMBOL_NAME(start_kernel) 


現(xiàn)在讓我們來回憶一下目前的系統(tǒng)狀態(tài): 
臨時(shí)頁表已經(jīng)建立,在0X08004000處,映射了4M,虛地址0XC000000被映射到0X08000000. 
CACHE,MMU都已經(jīng)打開。 
堆棧用的是任務(wù)init_task的堆棧。 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩午夜在线观看视频| 国产91露脸合集magnet| 久久精品一二三| 中文久久乱码一区二区| 亚洲私人影院在线观看| 亚洲欧美一区二区三区极速播放| 中文字幕不卡在线观看| 国产午夜精品一区二区| 国产嫩草影院久久久久| 亚洲欧美中日韩| 婷婷中文字幕一区三区| 国产一区二区三区在线观看精品| 成人性生交大片免费看中文| 国产成人av影院| 欧美精品一二三区| 精品国产一区二区国模嫣然| 亚洲欧美在线视频观看| 亚洲超碰97人人做人人爱| 蜜臀av一区二区三区| 成人国产视频在线观看| 欧美精品久久久久久久多人混战 | 精品国产乱码久久久久久久久 | 在线播放一区二区三区| 欧美女孩性生活视频| 久久久久久亚洲综合| 夜夜夜精品看看| 国产精一区二区三区| 91精品国产综合久久精品app| 中文字幕在线不卡视频| 秋霞午夜av一区二区三区| 成人av网站在线观看| 在线播放一区二区三区| 亚洲精品免费一二三区| 美国十次了思思久久精品导航| 99re热这里只有精品视频| 欧美日韩精品一区二区| 国产精品嫩草影院com| 久久精品国内一区二区三区| 99精品桃花视频在线观看| 亚洲日本在线视频观看| 在线观看免费一区| 日韩国产欧美一区二区三区| 欧美一级在线视频| 国产成人综合在线观看| 中文字幕免费不卡| 欧美日韩高清一区二区三区| 视频一区二区三区中文字幕| 在线不卡中文字幕| 国产精品白丝jk白祙喷水网站| 国产欧美一二三区| 欧美亚洲丝袜传媒另类| 蜜臀国产一区二区三区在线播放| 久久色视频免费观看| 色婷婷精品久久二区二区蜜臀av| 日韩电影一二三区| 国产精品久久久久久户外露出| 91丨九色丨尤物| 狠狠狠色丁香婷婷综合久久五月| 国产精品伦理一区二区| 91精品国产高清一区二区三区蜜臀| 国产999精品久久久久久| 日韩在线一区二区| 亚洲男人电影天堂| 精品剧情v国产在线观看在线| 欧美亚洲综合一区| 99久久久国产精品免费蜜臀| 久久国产精品99久久久久久老狼| 亚洲美女一区二区三区| 18欧美乱大交hd1984| 国产欧美精品区一区二区三区| 欧美一区二视频| 欧美日韩极品在线观看一区| 在线观看成人小视频| eeuss鲁片一区二区三区| 国产不卡在线一区| 久久激情五月激情| 另类小说视频一区二区| 日本美女一区二区三区视频| 午夜一区二区三区在线观看| 亚洲va国产va欧美va观看| 亚洲日本电影在线| 亚洲福利电影网| 五月天视频一区| 久久不见久久见免费视频7| 天天色 色综合| 狠狠色丁香久久婷婷综合_中| 韩国成人福利片在线播放| 国产真实乱对白精彩久久| 久久99国产精品久久99| 国产精品影视在线| 91免费版在线| 日韩天堂在线观看| 久久综合色播五月| 九九国产精品视频| 色天使色偷偷av一区二区| 久久久蜜桃精品| 国产精品青草久久| 亚洲成av人综合在线观看| 久久福利资源站| 成人综合婷婷国产精品久久蜜臀| 99精品欧美一区二区三区小说| 色悠悠久久综合| 国产日韩欧美一区二区三区乱码 | 精品一区二区三区欧美| 91久久一区二区| 精品美女被调教视频大全网站| 一区二区在线观看av| 精品一二三四区| 日韩一级二级三级精品视频| 国产精品久久久久三级| av成人免费在线观看| 中文字幕一区三区| 色嗨嗨av一区二区三区| 中文字幕av资源一区| 韩国av一区二区三区| 宅男噜噜噜66一区二区66| 亚洲精品大片www| 日本韩国视频一区二区| 亚洲视频在线一区二区| 成人av影院在线| 中文字幕在线不卡一区| 成人sese在线| 亚洲理论在线观看| 欧美羞羞免费网站| 亚洲成人动漫在线免费观看| 欧美午夜精品理论片a级按摩| 亚洲另类在线制服丝袜| 在线一区二区三区四区五区 | 欧美精品xxxxbbbb| 美腿丝袜亚洲三区| 久久久亚洲高清| 99在线热播精品免费| 亚洲一区在线观看网站| 51久久夜色精品国产麻豆| 极品尤物av久久免费看| 国产精品视频一区二区三区不卡| 91麻豆自制传媒国产之光| 亚洲国产日日夜夜| 国产亚洲美州欧州综合国| 99精品欧美一区二区三区综合在线| 亚洲国产成人av| 久久奇米777| 欧美色偷偷大香| 国产成人av网站| 免费观看一级欧美片| 国产精品免费av| 欧美v亚洲v综合ⅴ国产v| av一区二区三区在线| 激情综合网激情| 亚洲国产一区二区在线播放| 国产欧美精品一区二区三区四区| 欧美日韩在线直播| 97久久精品人人澡人人爽| 国产一区二区精品在线观看| 视频在线观看91| 一区二区三区在线免费视频| 国产欧美日韩另类视频免费观看| 3d动漫精品啪啪一区二区竹菊| 成人免费观看视频| 国产黄色91视频| 国产乱一区二区| 国产中文字幕精品| 精品写真视频在线观看| 久久久亚洲国产美女国产盗摄| 成人午夜精品在线| 亚洲女同一区二区| 亚洲一区二区三区美女| 蜜臀av一区二区在线免费观看| 国产一区二区三区最好精华液 | 久久久影院官网| 国产精品免费人成网站| 亚洲女同一区二区| 亚洲午夜在线电影| 蜜桃传媒麻豆第一区在线观看| 国产一区二区导航在线播放| 99综合电影在线视频| 欧美亚日韩国产aⅴ精品中极品| 欧美性videosxxxxx| 国产欧美视频在线观看| 亚洲五码中文字幕| 国产成人精品亚洲午夜麻豆| 色综合久久中文综合久久牛| 欧美日本一区二区三区| 一区二区中文视频| 日韩和欧美一区二区| 国产一区二区三区日韩| 欧美三级视频在线播放| 国产精品天美传媒沈樵| 免费三级欧美电影| 69p69国产精品| 日本在线不卡一区| 欧美精品xxxxbbbb| 日本午夜精品一区二区三区电影| 99免费精品在线| 91豆麻精品91久久久久久| 精品国精品国产| 三级精品在线观看| 在线观看日韩一区| 17c精品麻豆一区二区免费| 日产欧产美韩系列久久99|