<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          詳解Linux內(nèi)核在arm上的啟動過程

          共 2995字,需瀏覽 6分鐘

           ·

          2021-10-01 23:30


          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)存管理單元

          作用:

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

          • 存儲器訪問權限

          • 控制Cache


          通過MMU的訪存


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

          • 如果TLB中沒有虛擬地址的入口,硬件從主存儲器中的轉(zhuǎn)換表中獲取轉(zhuǎ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對齊



          第一級描述符


          一級表每個入口描述了它所關聯(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

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

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




          本公眾號全部博文已整理成一個目錄,請在公眾號里回復「m」獲取!

          推薦閱讀:

          愛了,這款神器!

          再見!程序員!這次情況嚴重升級了...

          iptables 長文詳解,值得收藏細讀


          5T技術資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內(nèi)回復「1024」,即可免費獲取!!


          瀏覽 87
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美色图手机在线 | 免费观看一级a片 | 北条麻妃中文字幕在线视频 | 精品日韩免费 | 日韩第一页在线 |