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

歡迎訪問 生活随笔!

生活随笔

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

linux

linux内核head.S文件分析

發布時間:2025/3/15 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核head.S文件分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1:內核運行的物理地址與虛擬地址

????(1)KERNEL_RAM_VADDR(VADDR就是virtual address),這個宏定義了內核運行時的虛擬地址。值為0xC0008000

????(2)KERNEL_RAM_PADDR(PADDR就是physical address),這個宏定義內核運行時的物?? 理地址。值為0x30008000

????(3)總結:內核運行的物理地址是0x30008000,對應的虛擬地址是0xC0008000。而物理地址為什么是30008000是因為在移植uboot的時候為了得到連續的512M的內存,將內存地址的開頭設置為30000000

?

2:內核的真正入口

????(1)內核的真正入口就是ENTRY(stext)處

????(2)前面的__HEAD定義了后面的代碼屬于段名為.head.text的段

?

3:內核運行的硬件條件

????(1) 內核的起始部分代碼是被解壓代碼調用的。回憶之前講zImage的時候,uboot啟動內核后實際調用運行的是zImage前面的那段未經壓縮的解壓代碼,解壓代碼運行時先將zImage后段的內核解壓開,然后再去調用運行真正的內核入口。

????(2) 內核啟動不是無條件的,而是有一定的先決條件,這個條件由啟動內核的bootloader(我們這里就是uboot)來構建保證。

????(3) ARM體系中,函數調用時實際是通過寄存器傳參的(函數調用時傳參有兩種設計:一種是寄存器傳參,另一種是棧內存傳參)。所以uboot中最后theKernel (0, machid, bd->bi_boot_params);執行內核時,運行時實際把0放入r0中,machid放入到了r1中,bd->bi_boot_params放入到了r2中。ARM的這種處理技巧剛好滿足了kernel啟動的條件和要求。

????(4) kernel啟動時MMU是關閉的,因此硬件上需要的是物理地址。但是內核是一個整體(zImage)只能被連接到一個地址(不能分散加載),這個連接地址肯定是虛擬地址。因此內核運行時前段head.S中尚未開啟MMU之前的這段代碼就很難受。所以這段代碼必須是位置無關碼,而且其中涉及到操作硬件寄存器等時必須使用物理地址。

?

4:內核啟動的匯編階段

__lookup_processor_type

????(1) 我們從cp15協處理器的c0寄存器中讀取出硬件的CPU ID號,然后調用這個函數來進行合法性檢驗。如果合法則繼續啟動,如果不合法則停止啟動,轉向__error_p啟動失敗。

????(2) 該函數檢驗cpu id的合法性方法是:內核會維護一個本內核支持的CPU ID號碼的數組,然后該函數所做的就是將從硬件中讀取的cpu id號碼和數組中存儲的各個id號碼依次對比,如果沒有一個相等則不合法,如果有一個相等的則合法。

????(3) 內核啟動時設計這個校驗,也是為了內核啟動的安全性著想。?????????????????????????????????????

?__lookup_machine_type

????該函數的設計理念和思路和上面校驗cpu id的函數一樣的。不同之處是本函數校驗的是機器碼。

__vet_atags

????(1) 該函數的設計理念和思路和上面2個一樣,不同之處是用來校驗uboot給內核的傳參ATAGS格式是否正確。這里說的傳參指的是uboot通過tag給內核傳的參數(主要是板子的內存分布memtag、uboot的bootargs)

????(2) 內核認為如果uboot給我的傳參格式不正確,那么我就不啟動。

????(3) uboot給內核傳參的部分如果不對,是會導致內核不啟動的。譬如uboot的bootargs設置不正確內核可能就會不啟動。

__create_page_tables

????(1) 顧名思義,這個函數用來建立頁表。

????(2) linux內核本身被連接在虛擬地址處,因此kernel希望盡快建立頁表并且啟動MMU進入虛擬地址工作狀態。但是kernel本身工作起來后頁表體系是非常復雜的,建立起來也不是那么容易的。kernel想了一個好辦法

????(3) kernel建立頁表其實分為2步。第一步,kernel先建立了一個段式頁表(和uboot中之前建立的頁表一樣,頁表以1MB為單位來區分的),這里的函數就是建立段式頁表的。段式頁表本身比較好建立(段式頁表1MB一個映射,4GB空間需要4096個頁表項,每個頁表項4字節,因此一共需要16KB內存來做頁表),壞處是比較粗不能精細管理內存;第二步,再去建立一個細頁表(4kb為單位的細頁表),然后啟用新的細頁表廢除第一步建立的段式映射頁表。

????(4) 內核啟動的早期建立段式頁表,并在內核啟動前期使用;內核啟動后期就會再次建立細頁表并啟用。等內核工作起來之后就只有細頁表了。

__switch_data

????(1) 建立了段式頁表后進入了__switch_data部分,這東西是個函數指針數組。

????(2) 分析得知下一步要執行__mmap_switched函數

????(3) 復制數據段、清除bss段(目的是構建C語言運行環境)

????(4) 保存起來cpu id號、機器碼、tag傳參的首地址。

????(5) b start_kernel跳轉到C語言運行階段。

?

總結:匯編階段其實也沒干啥,主要原因是uboot干了大部分活。匯編階段主要就是校驗啟動合法性、建立段式映射的頁表并開啟MMU以方便使用內存、跳入C階段。

總結

以上是生活随笔為你收集整理的linux内核head.S文件分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91文字幕巨乱亚洲香蕉 | av片毛片| 国产a级精品 | 成人美女毛片 | 久久久免费精品 | 713电影免费播放国语 | 爽爽免费视频 | 国产亚洲精品久久久 | 日本草草影院 | 中文字幕欧美在线 | 69天堂| 小视频黄色 | 性欧美丰满熟妇xxxx性仙踪林 | 好吊操视频这里只有精品 | 玖玖久久 | 亚洲91在线 | 伊人色网 | 国产伦精品一区二区三区88av | 国产成年视频 | 国产在线高清视频 | 国产熟妇乱xxxxx大屁股网 | 亚洲欧美国产一区二区三区 | 国产精品一区免费观看 | 亚洲午夜精品一区二区三区 | 妇女一级片 | 久久久久久久久久久国产精品 | xxx黄色片| 国产精品久久久久久久免费 | 99热这里只有精品3 成年人黄色网址 | 日产精品久久久 | 在线观看免费高清 | av网站免费在线看 | 日韩高清影院 | 人人爱人人射 | 亚洲av无码专区国产乱码不卡 | 午夜伦理影院 | 日韩电影观看 | 美女啪啪动态图 | 国产毛片久久久久久国产毛片 | 成品短视频泡芙 | 91香蕉久久 | wwwxxx日本人 | 色婷婷av一区二区三区软件 | 久久噜噜色综合一区二区 | 嫩草懂你 | 天天添| 8x8ⅹ成人永久免费视频 | 欧洲在线一区 | 亚洲欧洲国产综合 | 亚洲精品天堂在线 | 一级欧美一级日韩 | 免费av在线播放 | 日本韩国在线 | 91在线免费视频 | 欧美用舌头去添高潮 | 少妇高潮一区二区三区四区 | 天天插插 | 日韩欧美一区二区三区久久婷婷 | 一级片在线免费播放 | 国产在线观看免费av | 激情文学88 | 久久久不卡国产精品一区二区 | 久久免费视频6 | 欧美性大战久久久久久 | 免费三级网站 | 日韩va亚洲va欧美va久久 | 国产精品久久久久久人妻精品动漫 | 99国产精品久久久久久久久久久 | 少妇一级淫片免费视频 | 青青国产在线视频 | 中文字幕2018| 国产精品成人久久久久久久 | 亚洲精品亚洲人成人网 | 成人aⅴ视频 | 激情网络 | 国产玖玖 | 99国产精品久久 | 中文字幕精品一区二区三区视频 | 欧美日韩精品区别 | 中文字幕在线免费看线人 | 国产伦精品一区二区三区视频1 | 蜜桃成熟时李丽珍在线观看 | 亚洲国产网 | 丁香久久婷婷 | 伊人久久五月天 | 激情www| 奇米影视一区 | 91成人天堂久久成人 | 1024亚洲 | 超碰66 | 亚洲天堂一区在线 | 免费的毛片视频 | 亚洲av毛片一区二二区三三区 | 无码人妻一区二区三区av | 久艹伊人| 99999视频| 看一级黄色片 | 四虎免费影视 | 好吊一区二区三区视频 |