www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > Linux閱碼場(chǎng)
[導(dǎo)讀]作者簡(jiǎn)介于浩進(jìn),linux內(nèi)核愛(ài)好者,現(xiàn)就職于北京靈汐科技有限公司,任職BSP工程師,主要負(fù)責(zé)IP驗(yàn)證、多媒體驅(qū)動(dòng)開(kāi)發(fā)及一些bringup等工作。文章大綱1.背景介紹2.環(huán)境說(shuō)明2.1?硬件環(huán)境2.2Kernel?版本2.3kernel?相關(guān)配置介紹3.fixmap?機(jī)制介紹3....

作者簡(jiǎn)介

于浩進(jìn),linux內(nèi)核愛(ài)好者,現(xiàn)就職于北京靈汐科技有限公司,任職BSP工程師,主要負(fù)責(zé)IP驗(yàn)證、多媒體驅(qū)動(dòng)開(kāi)發(fā)及一些bring up等工作。


文章大綱

1.背景介紹

2.環(huán)境說(shuō)明


2.1?硬件環(huán)境


2.2 Kernel?版本


2.3 kernel?相關(guān)配置介紹

3.fixmap?機(jī)制介紹


3.1?虛擬空間拓?fù)?br>

3.1.1 VA=39bit?下?kernel?虛擬地址空間拓?fù)?br>3.1.2 FIXMAP?地址空間拓?fù)?br>3.1.3 FIXMAP?初始化

3.2 fixmap?在?early ioremap?應(yīng)用介紹

3.2.1 early_ioremap_setup()
3.2.2?__early_ioremap()


3.3 fixmap?在?early console?應(yīng)用介紹


3.4 fixmap?在?device-tree?應(yīng)用介紹

3.4.1?映射過(guò)程分析

3.5 fixmap?在?paging_init?中頁(yè)表切換介紹

3.5.1 paging_init?函數(shù)簡(jiǎn)單分析
3.5.2 paging_init?中的?fixmap

4.小結(jié)

5.參考文章


01

背景介紹

Fixmap機(jī)制是kernel在啟動(dòng)過(guò)程中(start_kernel)臨時(shí)的映射機(jī)制,目的是在真正頁(yè)表建立之前用于完成對(duì)io設(shè)備的訪問(wèn)、device-tree的解析以及paging_init中的頁(yè)表切換等。本文將對(duì)該機(jī)制做一個(gè)深入的分析。


02

環(huán)境說(shuō)明

2.1硬件環(huán)境

SOC芯片,CPU8cortex-A53,其DDR物理地址為0x800000000,device-tree存放的物理地址為0x843000000

2.2kernel版本4.19.83版本。

2.3kernel相關(guān)配置介紹
  • 相關(guān)Config配置

  • 相關(guān)宏配置

????????以下宏的值,只給出結(jié)果了:


03

虛擬空間拓?fù)??

3.1虛擬空間拓?fù)?/strong>3.1.1 VA=39bitkernel虛擬地址空間拓?fù)?/span>

1詳細(xì)展示了VA=39bitkernel虛擬地址空間拓?fù)?,里面展示?/span>FIXMAP區(qū)域在整個(gè)虛擬地址空間所處的位置。


3.1.2 FIXMAP地址空間拓?fù)?/span>

Kernel對(duì)Fixmap區(qū)域做了進(jìn)一步的劃分,各區(qū)間是在enum fixed_addresses 枚舉類(lèi)型定義的(/arch/arm64/include/asm/fixmap.h)。


其各個(gè)區(qū)間的virtual address通過(guò)fix_to_virt(const unsigned int idx)函數(shù)獲得,其定義是在/include/asm-generic/fixmap.h里面,這個(gè)函數(shù)后面會(huì)用到。


下圖2詳細(xì)展示了各個(gè)區(qū)間的base address

Fix_to_virt的定義如下:


3.1.3 FIXMAP初始化

Bm_pte、bm_pmd、Bm_pte為三個(gè)全局?jǐn)?shù)組,用于暫存pud、pmd

pte的頁(yè)表。


early_fixmap_init()函數(shù)完成了fixmap映射的基礎(chǔ)框架,如下圖3所示,bm_pte數(shù)組并沒(méi)有填值,因?yàn)楫?dāng)前還不知道哪些物理地址需要映射,等需要映射時(shí)候再去填寫(xiě)bm_pteentry。

?

經(jīng)過(guò)分析代碼,整理了fixmap各段虛擬地址與bm_pmd entry的關(guān)系,如下圖4所示:

需要說(shuō)明的是FIX_PGD~FIX_FDTbm_pmd是屬于同一個(gè)entry,即可以用bm_ptepte映射。


FIX_FDT~FIX_HOLE不屬于該entry,即不可以用bm_ptepte映射,也為后面device-tree的映射做了一個(gè)鋪墊。


3.2fixmap在early ioremap應(yīng)用介紹3.2.1 early_ioremap_setup()

該函數(shù)的比較簡(jiǎn)單,主要是依靠__fix_to_virt()slot_virt[i]填入虛擬地址,其布局如下圖5所示。

slot[i]fix_map區(qū)域已經(jīng)規(guī)劃好的虛擬地址范圍,任何I/O地址空間都可以向這7個(gè)slot空間做映射。


其中:slot_virt[i] = __fix_to_virt(FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*i),__fix_to_virt()在之前已經(jīng)介紹過(guò)。Slot_virt每個(gè)區(qū)間size256K。


3.2.2?__early_ioremap()

有三個(gè)數(shù)組需要說(shuō)明:

slot_virt[slot]BTMAP區(qū)域各個(gè)區(qū)間虛擬地址;

prev_map[slot]__early_ioremap()映射后的虛擬地址;

prev_size[slot]__early_ioremap()要映射的size;


映射流程如下圖6所示:

Figure 6 early ioremap映射流程圖


圖7展示了early ioremap頁(yè)表轉(zhuǎn)換過(guò)程,還是比較簡(jiǎn)單的。


3.3fixmap在early console應(yīng)用介紹
Early console的映射與early ioremap的映射類(lèi)似,通過(guò)__fix_to_vit(FIX_EARLYCON_MEM_BASE)獲取虛擬地址,物理地址為UARTSOC的實(shí)際分配的地址(該物理地址來(lái)自于command lineearlycon=XXX),然后通過(guò)向bm_pte寫(xiě)入頁(yè)表,即可以完成映射。


8是函數(shù)調(diào)用關(guān)系。圖9是頁(yè)表的建立和轉(zhuǎn)換過(guò)程。


3.4?fixmap在device-tree應(yīng)用介紹
3.4.1 射過(guò)程分析

Device-tree的映射和early-consoleearly-ioremap的映射原理有所不同,主要區(qū)別在于FIX_FDT空間對(duì)應(yīng)的虛擬地址的pmd entryFIXADDR_START對(duì)應(yīng)的pmd entry是不同的。


通過(guò)分析kernel代碼可知對(duì)于device-tree的映射需要建立一個(gè)2Mblock entry即可,即在bm_pmd建立一個(gè)block entry。


如下圖10所示,只需要找到pmdp,寫(xiě)入block entry的頁(yè)表項(xiàng)即可。


那問(wèn)題來(lái)了,pmdp的虛擬地址我們是知道的,對(duì)應(yīng)的bm_pmdentry的物理地址也能知道,但是兩者之間的頁(yè)表還未建立。


因此在用pmdp指針向bm_pmd寫(xiě)入block entry之前,必須要先建立pmdp的頁(yè)表,這個(gè)頁(yè)表建立過(guò)程就與early console的頁(yè)表建立過(guò)程相同了。見(jiàn)下圖11所示。

設(shè)備樹(shù)頁(yè)表的建立會(huì)調(diào)用到init_pmd()建立block entry,也就是下圖122對(duì)應(yīng)的代碼,圈1的代碼就是對(duì)應(yīng)上圖11pmdp建立頁(yè)表的過(guò)程。


在寫(xiě)入block entry之后,pmdp也就無(wú)用了,圈3代碼把剛才的pmdp的頁(yè)表清除了,即把bm_pte對(duì)應(yīng)的表項(xiàng)清除了。

最后再簡(jiǎn)單展示一下fixmap為設(shè)備樹(shù)建立頁(yè)表的函數(shù)調(diào)用關(guān)系,如下圖13所示。

3.5fixmap在paging_init中頁(yè)表切換介紹3.5.1 paging_init函數(shù)簡(jiǎn)單分析

下圖14paging_init的代碼分析。

  • ?1代碼通過(guò)memblock分配器分配了一個(gè)物理頁(yè)面,該頁(yè)面暫存后面代碼建立的頁(yè)表;


  • 2代碼是通過(guò)fixmp機(jī)制把這個(gè)物理頁(yè)面映射為虛擬地址;


  • 3代碼把kernel的鏡像的一些代碼段、數(shù)據(jù)做等做映射,在圖1有說(shuō)明;


  • 4代碼把memblock.memory類(lèi)型的region區(qū)域做線性映射,比如設(shè)備樹(shù)的memory節(jié)點(diǎn)的內(nèi)存,會(huì)在此做線性映射,但是會(huì)排除代碼段和只讀數(shù)據(jù)段,具體細(xì)節(jié),還請(qǐng)看源碼;


  • 5~7代碼將暫存頁(yè)表內(nèi)容拷貝到swapper_pg_dir,同時(shí)切換ttbr寄存器,此后CPU發(fā)出的虛擬地址就可以通過(guò)這套新建的頁(yè)表進(jìn)行虛實(shí)轉(zhuǎn)換了;


  • 8清除pgdp的映射;


  • 9代碼釋放剛才申請(qǐng)的物理頁(yè);


3.5.2 paging_init中的fixmap

上圖 圈6代碼是把臨時(shí)頁(yè)表拷貝到swapper_pg_dir,臨時(shí)頁(yè)表的物理頁(yè)是memblock分配器獲得的物理地址。


由于mmu已經(jīng)開(kāi)啟,memcpy無(wú)法使用物理地址,所以必須要先用fixmap機(jī)制做該物理頁(yè)面的映射,得到其虛擬地址,即pgd_set_fixmap(addr),其定義如下:


其是借助于fixmp的“FIX_PGD”區(qū)域做的映射,頁(yè)表映射及轉(zhuǎn)換過(guò)程如下圖15所示。


04

小結(jié)

  • 在進(jìn)入start_kernel之前,head.S的“__primary_switch”已經(jīng)開(kāi)啟mmu了,使能mmu之后CPU發(fā)出的ldr、str指令都為虛擬地址了,因此必須要提前建立好頁(yè)表,mmu才能把虛擬地址轉(zhuǎn)為物理地址,以訪問(wèn)真正的物理內(nèi)存;


  • Fixmap用于在” earlyconsole”、” device-tree的解析”、” earlyioremap”、” paging_init的頁(yè)表切換”等過(guò)程建立臨時(shí)頁(yè)表。


  • Fixmap機(jī)制實(shí)際就是為mmu做了相關(guān)的虛擬和物理地址的映射;


  • Bm_pmd、bm_pte是兩個(gè)全局?jǐn)?shù)組,用于存放pmd、pte的頁(yè)表項(xiàng);



05

參考文獻(xiàn)

https://www.cnblogs.com/LoyenWang/p/11483948.html

https://www.cnblogs.com/LoyenWang/p/11440957.html

https://www.cnblogs.com/pengdonglin137/p/9157639.html

armv8_arm.pdf,從ARM官網(wǎng)下載即可。


歡迎賜稿“Linux閱碼場(chǎng)”,投稿請(qǐng)掃碼微信聯(lián)系“小月”,稿費(fèi)300-500RMB(已經(jīng)以任何形式,如公眾號(hào)、博客、網(wǎng)站發(fā)表過(guò)的文章,請(qǐng)勿投稿):




掃描識(shí)別二維碼關(guān)注"Linux閱碼場(chǎng)"? ? ?

如果您覺(jué)得不錯(cuò),請(qǐng)轉(zhuǎn)發(fā)轉(zhuǎn)發(fā)轉(zhuǎn)發(fā)!

或者隨手點(diǎn)個(gè)“在看”吧~

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉