日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux Kernel系列一:开篇和Kernel启动概要

發(fā)布時間:2025/3/21 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux Kernel系列一:开篇和Kernel启动概要 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

近期幾個月將Linux Kernel的大概研究了一下,以下須要進行深入具體的分析。主要將以S3C2440的一塊開發(fā)板為硬件實體。大概包含例如以下內(nèi)容:

1 bootloader分析,以uboot為主,結合詳細開發(fā)板的情況。我的目標是解釋清楚uboot的工作原理(說實話,分析過程中不太想被硬件綁架,可是須要以一個實際的樣例

來做分析)

2 kernel部分,這就非常多內(nèi)容了。打算從kernel啟動的流程開始分析。

3 除kernel本身外,還有非常多的知識,比如ld的輸入script分析等,這里會一起介紹。


kernel啟動流程概要

一:內(nèi)核Image的組成 1 ES(Embed System)啟動的時候,CPU加電,運行的第一條語句是Bootloader,這個很類似PC機上的BIOS。BL將內(nèi)核載入后,控制器移交給LK 2 LK運行的第一條語句是什么?vmlinux是單體的內(nèi)核表示。依據(jù)前面說的內(nèi)核編譯連接知識,第一條語句是head.S中(歷史原因,MD,有非常多文件都叫head.S) ?我們須要又一次分析一下內(nèi)核(這里就是zImage了)的組成,(方法非常easy,研究make的運行過程,通過make V=1 zImage能夠得到差點兒所有信息)
  • vmlinux,這個是未壓縮、未strip的內(nèi)核模塊,ELF結構
  • Image:二進制、未壓縮、可是strip后的內(nèi)核
  • head.o:ARM相關的,由BL將控制權轉交給它。即前面提到的head.S生成
  • pigg.gz:Image文件的gzip壓縮
  • piggy.o:由piggy.S生成,這個S文件通過include Bin方式將Image包括進來。piggy的意思就是背負、肩扛。非常形象不是?
  • misc.o:從上面看,涉及到一些解壓方面的內(nèi)容,而misc提供一些輔助函數(shù)
  • vmlinux:悲催.....這個文件是head+pigg+misc構成的vmlinux。名字一樣不是?真的非常混淆!
  • zImage:再由上面這個vmlinux壓縮而來
圖1非常好得展示了這個過程。
圖1 內(nèi)核的構成 3 piggy的故事 piggy.S非常有意思,建立了一個section,而且有一個標志來指示piggy.gz的邊界。 piggy相應的是一個叫bootstrap的image,注意,Bootstrap和Bootloader不一樣,它是在BL之后的一段代碼,用來 解壓kernel,設置內(nèi)存等作用。也能夠叫second stage boot。 ? 4 Bootloadre和BootstrapLoader BL和BSL的差別是什么?
  • BL僅僅是初始化硬件,不依賴linux,不處理linux
  • BSL在BL后執(zhí)行,依賴linux,由于要解壓linux。另外一個重要點就是BSL須要為LINUX的執(zhí)行建立環(huán)境
BSL的工作包含:
  • head.O:初始化CPU等工作
  • misc.O:解壓,重定位(比如將kernel移動到另外一個位置上) decompress_kernel
  • 其它工作
init/main.c:start_kernel 啟動調(diào)用圖見圖2.
圖2 啟動調(diào)用流程圖 以下來分析這個啟動流程 1 kernel中的head.o分析:盡量保持CPU系列的通用,比如arm的CPU等初始化都在做。可是詳細板子(比如CPU+其它硬件)怎么初始化?這就是由mach文件夾中的初始化函數(shù)做到的。所以,kernel初始化分為:generic CPU初始化+詳細板子的初始化。head.o初始化后,跳轉到main.o的start_kernel,繼續(xù)后面的流程 2 start_kernel:(init/main.c):start_kernel的轉移由head.O做的,只是代碼一般包括在更通用的head_common.S中 ?? 以后想做kernel的分析,就從main開始吧. start_kernel做了什么事情呢?
  • 剛才僅僅是初始化了cpu相關的,而詳細和板子相關的由start_arch運行
3 kernel 參數(shù)分析:kernel command line。注意,這個參數(shù)是由BL傳遞給kernel的,只是這個參數(shù)又是誰設置的呢?又存在什么地方呢?這個line放在一個global的地方, ? 另外,kernel怎樣處理這些參數(shù)呢?有一個比較好的辦法,__set_up宏,將一些參數(shù)和相應的函數(shù)指針存在一個特殊的section中,然后循環(huán)調(diào)用這個section中的函數(shù)。(和驅動module中的非常像)。定義在init.h中。關于一些特殊參數(shù)的取值,在arch/arm/kernel/vmlinux.lds.S中定義。(以后得去看看ld的manual了)__set_up這個宏另一個flags比方early,表示處理階段是否在early-stage做。標志有__init的section終于占用的內(nèi)存會被拋棄.. 4 子系統(tǒng)初始化:包含中斷、等。?section嵌套section? 5 kernel_init進程:start_kernel最后會fork一個kernel_init進程,而原運行進程變成idle進程了.. 6 用戶空間的init進程:由kernel_init進程終于通過execve init完畢 7 參考文獻。ELP這本書給的參考文獻都巨強..
?

轉載于:https://www.cnblogs.com/bhlsheji/p/4201225.html

《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Linux Kernel系列一:开篇和Kernel启动概要的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。