最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

EFISTUB

2023-06-14 08:18 作者:附魔醬  | 我要投稿

linux內核的啟動方式有非常多種,大方向來看分為bios和uefi,在此基礎上又有各種各樣的boot loader,比如我們常見的grub,它們會根據配置信息,加載linux內核到內存,并通過一定的協(xié)議來啟動linux內核。 今天要講的是efi stub的方式,你可以把它理解成另一種boot loader,只是它是內置在linux內核里的。 通過efi stub,linux內核可以在不使用grub等傳統(tǒng)boot loader的情況下,直接在uefi硬件上,以uefi application的方式啟動,可以說是非常簡單。 該方式為我們研究內核啟動降低了不少難度,我們不用再去看類似于grub等boot loader的代碼了,從開機到啟動完畢的所有流程代碼,在內核里都可以找到,完美。 不過這也需要我們閱讀大量的相關材料,比如 uefi 的各種specification(https://uefi.org/specifications),以及 uefi application 的具體文件格式(linux內核是以 uefi application 方式啟動的,uefi 指定了 application 的格式為pecoff,該格式文檔可參考其官方說明?https://docs.microsoft.com/en-us/windows/win32/debug/pe-format)。 efi stub是linux的一個feature,它可以通過配置 CONFIG_EFI_STUB 來開啟和關閉。 它的實現(xiàn)原理是,按照 uefi 指定的 pecoff 格式,將內核偽裝成一個 uefi application,這樣在支持 uefi 的各種硬件上,就可以按照 uefi 協(xié)議,直接啟動linux內核了。 所以下面的代碼介紹和 pecoff 格式定義息息相關,建議先通讀上面鏈接中 pecoff 格式文檔,這樣理解下面的內容就非常容易了。 linux內核efi stub有關pecoff 格式定義的部分都在 arch/x86/boot/header.S 這個文件里,具體如下:

其中 AddressOfEntryPoint字段填充的就是 efi stub 的入口函數地址,或者說是 uefi application 的入口函數地址,這個可以從 pecoff 文檔

以及uefi specification中得到確認。

好,既然這個就是我們要找的 efi stub 的入口函數,那我們來看下它具體的值是什么。 由上面可見,它的初始值是0,然后注釋中說它真正的值會在build.c中設置。 build.c其實是內核的一個小工具,在構建linux內核時,make最終會調用該工具把內核編譯后的各個部分,組裝成最終的bzImage。

bzImage的文件結構大致為: setup部分 - 對應到 arch/x86/boot/ 中的代碼 compressed部分 - 對應到 arch/x86/boot/compressed/ 中的代碼 這兩個部分都可以認為是內核啟動流程的部分,并不是真正的內核邏輯,真正內核邏輯被壓縮到了compressed部分里的piggy.S文件里。 有關編譯后的bzImage的layout情況,我們會在另一篇文章中詳細講,這里只需要知道,build.c這個工具把這些部分按照一定的順序結合在一起,生成了最終的bzImage。 我們再來回頭看下build.c中是如何設置efi stub的AddressOfEntryPoint的:

上面選中行就是設置AddressOfEntryPoint的部分,其中text_start你可以認為是compressed部分的起始地址,而efi_pe_entry就是我們最終要找的 efi stub 入口函數。 選擇行中將 text_start + efi_pe_entry (efi_pe_entry運行時的地址) 的結果,賦值到 pe_header + 0x28 指向的內存里,結合 pecoff 文檔以及上面的header.S文件內容,我們可知這個地址就是 header.S 文件中的 AddressOfEntryPoint 變量的地址。 這也說明了該選中行確實是在設置 AddressOfEntryPoint。 如果看過build.c中的代碼,你會發(fā)現(xiàn) efi_pe_entry 也是一個變量,那該變量具體指向的是哪個函數呢?

還是在build.c里,由上可見,efi_pe_entry是從zoffset.h中解析出來的,而zoffset.h是在make的過程中生成的:

zoffset.h的生成方式是用nm命令查詢compressed中vmlinux的各種指定symbol的地址,zoffset最終文件內容如下:

也就是說,build.c中解析的 efi_pe_entry 其實指向的就是 compressed 部分中的某個函數,我們搜索后會發(fā)現(xiàn)這個:

這個就是我們最終要找的函數了。 這時,有些同學可能會有疑問,不是說是compressed部分里的代碼嗎,這怎么是driver里的代碼了? 看compressed部分的makefile:

看上面選中行,compressed部分在編譯時,也把libstub目錄中的代碼包含進來了。 現(xiàn)在,我們就找到了efi stub的入口函數。 這樣,當linux內核以 uefi application 的形式,被 uefi 直接啟動時,被執(zhí)行的第一行代碼就是這個方法。 或者說,在 uefi 平臺上,以 efi stub形式啟動內核時,開機后內核執(zhí)行的第一個方法就是該方法。

EFISTUB的評論 (共 條)

分享到微博請遵守國家法律
宜丰县| 沈阳市| 通河县| 寿光市| 绍兴市| 股票| 沁阳市| 加查县| 普陀区| 鄯善县| 新干县| 米泉市| 潮州市| 资溪县| 海原县| 灌南县| 鹤山市| 石狮市| 洪湖市| 彰武县| 双牌县| 达拉特旗| 汉寿县| 综艺| 田林县| 建湖县| 太和县| 沙湾县| 贡嘎县| 平乐县| 专栏| 称多县| 扶风县| 徐水县| 玉溪市| 莱芜市| 城口县| 清涧县| 陇南市| 长寿区| 丹寨县|