freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

嵌入式系統(tǒng)bootloader啟動(dòng)全過(guò)程詳解-資料下載頁(yè)

2025-04-09 11:41本頁(yè)面
  

【正文】 rt。 params = memory_map[i].size。 params = tag_next(params)。 }}可以看出,在 memory_map[]數(shù)組中,每一個(gè)有效的內(nèi)存段都對(duì)應(yīng)一個(gè) ATAG_MEM 參數(shù)標(biāo)記。Linux 內(nèi)核在啟動(dòng)時(shí)可以以命令行參數(shù)的形式來(lái)接收信息,利用這一點(diǎn)我們可以向內(nèi)核提供那些內(nèi)核不能自己檢測(cè)的硬件參數(shù)信息,或者重載(override)內(nèi)核自己檢測(cè)到的信息。比如,我們用這樣一個(gè)命令行參數(shù)字符串console=ttyS0,115200n8來(lái)通知內(nèi)核以 ttyS0 作為控制臺(tái),且串口采用 115200bps、無(wú)奇偶校驗(yàn)、8位數(shù)據(jù)位這樣的設(shè)置。下面是一段設(shè)置調(diào)用內(nèi)核命令行參數(shù)字符串的示例代碼:char *p。 /* eat leading white space */ for(p = mandline。 *p == 39。 39。 p++) 。 /* skip nonexistent mand lines so the kernel will still * use its default mand line. */ if(*p == 39。\039。) return。 params = ATAG_CMDLINE。 params = (sizeof(struct tag_header) + strlen(p) + 1 + 4) 2。 strcpy(params, p)。 params = tag_next(params)。請(qǐng)注意在上述代碼中,設(shè)置 tag_header 的大小時(shí),必須包括字符串的終止符39。\039。,此外還要將字節(jié)數(shù)向上圓整4個(gè)字節(jié),因?yàn)?tag_header 結(jié)構(gòu)中的size 成員表示的是字?jǐn)?shù)。下面是設(shè)置 ATAG_INITRD 的示例代碼,它告訴內(nèi)核在 RAM 中的什么地方可以找到 initrd 映象(壓縮格式)以及它的大?。?params = ATAG_INITRD2。 params = tag_size(tag_initrd)。 params = RAMDISK_RAM_BASE。 params = INITRD_LEN。 params = tag_next(params)。下面是設(shè)置 ATAG_RAMDISK 的示例代碼,它告訴內(nèi)核解壓后的 Ramdisk 有多大(單位是KB):params = ATAG_RAMDISK。params = tag_size(tag_ramdisk)。 params = 0。params = RAMDISK_SIZE。 /* 請(qǐng)注意,單位是KB */params = 1。 /* automatically load ramdisk */ params = tag_next(params)。最后,設(shè)置 ATAG_NONE 標(biāo)記,結(jié)束整個(gè)啟動(dòng)參數(shù)列表:static void setup_end_tag(void){ params = ATAG_NONE。 params = 0。} 調(diào)用內(nèi)核Boot Loader 調(diào)用 Linux 內(nèi)核的方法是直接跳轉(zhuǎn)到內(nèi)核的第一條指令處,也即直接跳轉(zhuǎn)到 MEM_START+0x8000 地址處。在跳轉(zhuǎn)時(shí),下列條件要滿足:1. CPU 寄存器的設(shè)置: R0=0; R1=機(jī)器類型 ID;關(guān)于 Machine Type Number,可以參見 linux/arch/arm/tools/machtypes。 R2=啟動(dòng)參數(shù)標(biāo)記列表在 RAM 中起始基地址; 2. CPU 模式: 必須禁止中斷(IRQs和FIQs); CPU 必須 SVC 模式; 3. Cache 和 MMU 的設(shè)置: MMU 必須關(guān)閉; 指令 Cache 可以打開也可以關(guān)閉; 數(shù)據(jù) Cache 必須關(guān)閉; 如果用 C 語(yǔ)言,可以像下列示例代碼這樣來(lái)調(diào)用內(nèi)核:void (*theKernel)(int zero, int arch, u32 params_addr) = (void (*)(int, int, u32))KERNEL_RAM_BASE。……theKernel(0, ARCH_NUMBER, (u32) kernel_params_start)。注意,theKernel()函數(shù)調(diào)用應(yīng)該永遠(yuǎn)不返回的。如果這個(gè)調(diào)用返回,則說(shuō)明出錯(cuò)。4. 關(guān)于串口終端在 boot loader 程序的設(shè)計(jì)與實(shí)現(xiàn)中,沒有什么能夠比從串口終端正確地收到打印信息能更令人激動(dòng)了。此外,向串口終端打印信息也是一個(gè)非常重要而又有效的調(diào)試手段。但是,我們經(jīng)常會(huì)碰到串口終端顯示亂碼或根本沒有顯示的問題。造成這個(gè)問題主要有兩種原因:(1) boot loader 對(duì)串口的初始化設(shè)置不正確。(2) 運(yùn)行在 host 端的終端仿真程序?qū)Υ诘脑O(shè)置不正確,這包括:波特率、奇偶校驗(yàn)、數(shù)據(jù)位和停止位等方面的設(shè)置。此外,有時(shí)也會(huì)碰到這樣的問題,那就是:在 boot loader 的運(yùn)行過(guò)程中我們可以正確地向串口終端輸出信息,但當(dāng) boot loader 啟動(dòng)內(nèi)核后卻無(wú)法看到內(nèi)核的啟動(dòng)輸出信息。對(duì)這一問題的原因可以從以下幾個(gè)方面來(lái)考慮:(1) 首先請(qǐng)確認(rèn)你的內(nèi)核在編譯時(shí)配置了對(duì)串口終端的支持,并配置了正確的串口驅(qū)動(dòng)程序。(2) 你的 boot loader 對(duì)串口的初始化設(shè)置可能會(huì)和內(nèi)核對(duì)串口的初始化設(shè)置不一致。此外,對(duì)于諸如 s3c44b0x 這樣的 CPU,CPU 時(shí)鐘頻率的設(shè)置也會(huì)影響串口,因此如果 boot loader 和內(nèi)核對(duì)其 CPU 時(shí)鐘頻率的設(shè)置不一致,也會(huì)使串口終端無(wú)法正確顯示信息。(3) 最后,還要確認(rèn) boot loader 所用的內(nèi)核基地址必須和內(nèi)核映像在編譯時(shí)所用的運(yùn)行基地址一致,尤其是對(duì)于 uClinux 而言。假設(shè)你的內(nèi)核映像在編譯時(shí)用的基地址是 0xc0008000,但你的 boot loader 卻將它加載到 0xc0010000 處去執(zhí)行,那么內(nèi)核映像當(dāng)然不能正確地執(zhí)行了。5. 結(jié)束語(yǔ)Boot Loader 的設(shè)計(jì)與實(shí)現(xiàn)是一個(gè)非常復(fù)雜的過(guò)程。如果不能從串口收到那激動(dòng)人心的unpressing linux.................. done, booting the kernel……內(nèi)核啟動(dòng)信息,恐怕誰(shuí)也不能說(shuō):嗨,我的 boot loader 已經(jīng)成功地轉(zhuǎn)起來(lái)了!。
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1