• <form id="ojxtu"></form>

    <nobr id="ojxtu"><progress id="ojxtu"></progress></nobr>

          <ins id="ojxtu"><mark id="ojxtu"><acronym id="ojxtu"></acronym></mark></ins>

        1. 加入星計劃,您可以享受以下權益:

          • 創作內容快速變現
          • 行業影響力擴散
          • 作品版權保護
          • 300W+ 專業用戶
          • 1.5W+ 優質創作者
          • 5000+ 長期合作伙伴
          立即加入
          • 正文
          • 推薦器件
          • 相關推薦
          • 電子產業圖譜
          申請入駐 產業圖譜

          Linux BSP實戰課(SoC bringup篇):Kernel 的初始化過程

          2023/11/21
          3346
          閱讀需 11 分鐘
          加入交流群
          掃碼加入
          獲取工程師必備禮包
          參與熱點資訊討論

          最全最詳細的Linux BSP 實戰教程,共100篇,包含SOC Bringup, Uboot, 內核啟動, 中斷, 時鐘, 電源, GPIO, DMA, 低速總線, 高速總線, 音頻, 顯示, 攝像頭, 網絡驅動等;博主創建了專門的專欄技術討論群,以及免費的ChatGPT使用,和大佬們一起討論實戰;經過兩年的輸出和完善打磨,將碎片化的知識進行整理;通過圖文并茂的方式淺入深出。

          內核運行的第一行代碼

          .head.text 文本段

          Head.S

          start_kernel

          setup_arch

          mm_init

          sched_init

          init_IRQ

          tick_init

          init_timers

          hrtimers_init

          softirq_init

          time_init

          console_init

          vfs_caches_init

          rest_init

           

          上文我們講到,內核中各個階段的初始化非常重要,涉及內容很多,比如內存管理,進程管理,文件系統,中斷管理,時鐘管理等。就算淺嘗輒止的描述每個模塊,至少也要一萬字的總結,所以內核的重要程度很有必要單獨作為一章梳理。

          讓我們一起正式進入內核的世界,站在內核的角度,內核之前的所有程序都是系統引導程序,其中 CPU 的狀態如下:

          r0 = 0.

          r1 = CPU 類型.

          r2 = kernel參數list的物理地址.

          irq & fiq 必須關閉.

          MMU 必須關閉,這里內存地址都是物理地址.

          D-cache 必須關閉,I-cache 沒有要求.

          內核運行的第一行代碼

          Linux啟動,會啟動內核編譯后的文件 vmlinux,vmlinux 是一個 ELF 文件,按照 ./arch/arm64/kernel/vmlinux.lds 設定的規則進行鏈接,vmlinux.lds 是 vmlinux.lds.S 編譯之后生成的。所以為了確定 vmlinux 內核的起始地址, 首先通過 vmlinux.lds.S 鏈接腳本進行分析。如下所示:

          $?readelf?-h?vmlinux
          ELF?Header:
          ??Magic:???7f?45?4c?46?02?01?01?00?00?00?00?00?00?00?00?00
          ??Class:?????????????????????????????ELF64
          ??Data:??????????????????????????????2's?complement,?little?endian
          ??Version:???????????????????????????1?(current)
          ??OS/ABI:????????????????????????????UNIX?-?System?V
          ??ABI?Version:???????????????????????0
          ??Type:??????????????????????????????DYN?(Shared?object?file)
          ??Machine:???????????????????????????AArch64
          ??Version:???????????????????????????0x1
          ??Entry?point?address:???????????????0xffff800010000000
          ??Start?of?program?headers:??????????64?(bytes?into?file)
          ??Start?of?section?headers:??????????494679672?(bytes?into?file)
          ??Flags:?????????????????????????????0x0
          ??Size?of?this?header:???????????????64?(bytes)
          ??Size?of?program?headers:???????????56?(bytes)
          ??Number?of?program?headers:?????????5
          ??Size?of?section?headers:???????????64?(bytes)
          ??Number?of?section?headers:?????????38
          ??Section?header?string?table?index:?37
          
          $?readelf?-l?vmlinux
          
          Elf?file?type?is?DYN?(Shared?object?file)
          Entry?point?0xffff800010000000
          There?are?5?program?headers,?starting?at?offset?64
          
          Program?Headers:
          ??Type???????????Offset?????????????VirtAddr???????????PhysAddr
          ?????????????????FileSiz????????????MemSiz??????????????Flags??Align
          ??LOAD???????????0x0000000000010000?0xffff800010000000?0xffff800010000000
          ?????????????????0x0000000001beacdc?0x0000000001beacdc??RWE????10000
          ??LOAD???????????0x0000000001c00000?0xffff800011c00000?0xffff800011c00000
          ?????????????????0x00000000000c899c?0x00000000000c899c??R?E????10000
          ??LOAD???????????0x0000000001cd0000?0xffff800011cd0000?0xffff800011cd0000
          ?????????????????0x0000000000876200?0x0000000000905794??RW?????10000
          ??NOTE???????????0x0000000001bfaca0?0xffff800011beaca0?0xffff800011beaca0
          ?????????????????0x000000000000003c?0x000000000000003c??R??????4
          ??GNU_STACK??????0x0000000000000000?0x0000000000000000?0x0000000000000000
          ?????????????????0x0000000000000000?0x0000000000000000??RW?????10
          
          ?Section?to?Segment?mapping:
          ??Segment?Sections...
          ???00?????.head.text?.text?.got.plt?.rodata?.pci_fixup?__ksymtab?__ksymtab_gpl?__ksymtab_strings?__param?__modver?__ex_table?.notes
          ???01?????.init.text?.exit.text?.altinstructions
          ???02?????.init.data?.data..percpu?.hyp.data..percpu?.rela.dyn?.data?__bug_table?.mmuoff.data.write?.mmuoff.data.read?.pecoff_edata_padding?.bss
          ???03?????.notes
          ???04
          

          通過上面的查詢可知,此 vmlinux 為一個 aarch64 架構平臺的 ELF 可執行文件,其程序入口的地址為 0xffff800010000000,此段對應的 section 為.head.text .text .got.plt......,所以 vmlinux 的入口在 .head.text 文本段。

          推薦器件

          更多器件
          器件型號 數量 器件廠商 器件描述 數據手冊 ECAD模型 風險等級 參考價格 更多信息
          7M48072002 1 TXC Corporation CRYSTAL 48.0000MHZ 8PF SMD
          $1.15 查看
          MX25L3206EM2I-12G 1 Macronix International Co Ltd Flash, 16MX2, PDSO8, 0.200 INCH, HALOGEN FREE AND ROHS COMPLIANT, SOP-8
          $1.47 查看
          ASFL1-12.000MHZ-ERS-T 1 Abracon Corporation XTAL OSC XO 12.0000MHZ HCMOS TTL
          $1.28 查看

          相關推薦

          電子產業圖譜

          1024在线精品视频