www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 公眾號精選 > 嵌入式基地


Linux內(nèi)核加載過程

通常,Linux內(nèi)核都是經(jīng)過gzip加載過之后的映像文件。

  • bootloader復制壓縮內(nèi)核到內(nèi)存空間。

  • 內(nèi)核自解壓。

  • 運行內(nèi)核。


編譯完成的Linux內(nèi)核存放在哪里?

  • ./vmlinux     elf格式未壓縮內(nèi)核。

  • arch/arm/boot/compressed/vmlinux    壓縮以后的elf格式內(nèi)核。

  • arch/arm/boot/zImage    壓縮內(nèi)核。


壓縮內(nèi)核(zImage)的入口

  • /arch/arm/boot/compressed/vmlinux.lds    該文件為編譯器指定link順序。

  • ENTRY(_start)    壓縮內(nèi)核從.start段開始執(zhí)行。

  • 在/arch/arm/boot/compressed/head.S中執(zhí)行以下愛操作:

(1)檢測系統(tǒng)空間。

(2)初始化C代碼空間。

(3)跳轉(zhuǎn)到C代碼decompress_kernel,

arch/arm/boot/compressed/misc.c中。


解壓之前的串口輸出

  • include/asm-arm/arch-s3c2410/uncompress.h    中定義了puts作為串口輸出函數(shù)。

  • 解壓結(jié)束之后,程序跳轉(zhuǎn)到r5:解壓之后內(nèi)核的起始地址。


開始真正的Linux內(nèi)核

1、入口在arch/arm/kernel/head-armv.S

2、查找處理器類型

  • __lookup_processor_type

  • __lookup_architecture_type

3、初始化頁表:__creat_page_tables

4、初始化C代碼空間

5、跳轉(zhuǎn)到C代碼中,start_kernel


ARM的MMU單元

MMU:內(nèi)存管理單元

作用:

  • 虛擬地址到物理地址的映射

  • 存儲器訪問權(quán)限

  • 控制Cache


通過MMU的訪存

  • MMU會先查找TLB中的虛擬地址表

  • 如果TLB中沒有虛擬地址的入口,硬件從主存儲器中的轉(zhuǎn)換表中獲取轉(zhuǎn)換與訪問權(quán)限。


ARM的MMU訪存原理



ARM的MMU頁表格式


MMU支持基于節(jié)或者頁的存儲器訪問。


  • 節(jié):1MB的存儲器塊

  • 大頁:64KB的存儲器塊

  • 小頁:4KB的存儲器塊

  • 微頁:1KB的存儲器塊


頁表的級別


存在主存儲器內(nèi)的轉(zhuǎn)換頁表有兩個級別:

  • 第一級表:存儲節(jié)轉(zhuǎn)換表與指向第二級表的指針

  • 第二級表:

    (1)存儲大頁和小頁的轉(zhuǎn)換表。

    (2)存儲微頁的轉(zhuǎn)換表。


一級頁表的地址


第一級表占用空間16KB,必須16KB對齊


第一級描述符


一級表每個入口描述了它所關(guān)聯(lián)的1MB虛擬地址是如何映射的。


節(jié)描述符


  • Bits[1:0] 描述符類型(10b 表示節(jié)描述符)

  • Bits[3:2] 高速緩存(cache)和緩沖位(buffer)

  • Bits[4] 由具體實現(xiàn)定義

  • Bits[8:5] 控制的節(jié)的16 種域之一

  • Bits[9] 現(xiàn)在沒有使用,應該為零

  • Bits[11:10] 訪問控制(AP)

  • Bits[19:12] 現(xiàn)在沒有使用,應該為零

  • Bits[31:20] 節(jié)基址,形成物理地址的高12 位


節(jié)的轉(zhuǎn)換過程



臨時內(nèi)核頁表的創(chuàng)建 __create_page_tables


__create_page_tables:
pgtbl r4 @ page table address 0x30008000-0x4000
mov r0, r4 @r0=0x30004000
mov r3, #0
add r2, r0, #0x4000
1: str r3, [r0], #4
str r3, [r0], #4
str r3, [r0], #4
str r3, [r0], #4
teq r0, r2
bne 1b

把一級頁表0x30004000-0xa0080000清空


krnladr r2, r4 @ start of kernel

r4=0xa0004000,r2 = 內(nèi)核起始地址所在1MB對齊空間,0x30000000


add r3, r8, r2 @ flags + kernel base

r8 為從處理器信息中得到的MMU 頁表標志,r8=0xc0e, r3=0x30000c0e


str r3, [r4, r2, lsr #18]@ identity mapping

地址:0x300068000, value:0x30000c0e


add r0, r4, #(TEXTADDR & 0xff000000) >> 18 
@ start of kernel
bic r2, r3, #0x00f00000
str r2, [r0] @ PAGE_OFFSET + 0MB
add r0, r0, #(TEXTADDR & 0x00f00000) >> 18
str r3, [r0], #4 @ KERNEL + 0MB
......


映射表內(nèi)容


映射結(jié)果



進入C代碼


init/main.c中的start_kernel函數(shù),進入到了Linux內(nèi)核代碼中。

  • printk函數(shù)

  • 重新初始化頁表

  • 初始化中斷,trap_init

  • 設(shè)置系統(tǒng)定時器、控制臺…

  • 創(chuàng)建內(nèi)核進程init

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉