国产精品免费无遮挡无码永久视频-国产高潮视频在线观看-精品久久国产字幕高潮-国产精品99精品无码视亚

通俗易懂!高手帶你理解嵌入式Linux中高端內(nèi)存與低端內(nèi)存

發(fā)布時(shí)間:2018-11-3 10:08    發(fā)布者:xyd2018
高端內(nèi)存是Linux中一個(gè)重要的概念,初涉Linux時(shí)曾經(jīng)對(duì)這個(gè)概念非常迷惑。實(shí)際上這個(gè)概念比較簡單,理解這個(gè)概念,需要追溯一下Linux的內(nèi)存管理。

從前,CPU的地址總線只有32位,再早的就不再追溯了。32的地址總線無論是從邏輯上還是從物理上都只能描述4G的地址空間,在物理上理論上最多擁有4G內(nèi)存(除了IO地址空間,實(shí)際內(nèi)存容量小于4G),邏輯空間也只能描述4G的線性地址空間。為了合理的利用4G空間,Linux采用了3:1的策略,即內(nèi)核占用1G的線性地址空間,用戶占用3G的線性地址空間。所以用戶進(jìn)程的地址范圍從0~3G,內(nèi)核地址范圍從3G~4G,也就是說,內(nèi)核空間只能管理1G的內(nèi)存。

對(duì)于如此緊張的線性地址資源,內(nèi)核空間與用戶空間的肆意瓜分,導(dǎo)致了內(nèi)存管理上的問題:當(dāng)物理內(nèi)存大于1G時(shí),內(nèi)核線性地址空間小于實(shí)際的物理內(nèi)存容量,內(nèi)核如何實(shí)現(xiàn)對(duì)大于1G內(nèi)存的管理呢?說到這里,需要提一下內(nèi)核空間對(duì)內(nèi)存的管理方法。一方面為了提高內(nèi)核空間對(duì)內(nèi)存的管理效率;另一方面,為了簡化內(nèi)核空間對(duì)內(nèi)存的管理方法,內(nèi)核采用線性映射的方法實(shí)現(xiàn)對(duì)內(nèi)存的管理,從Linux實(shí)現(xiàn)的方法來看,物理地址與內(nèi)核的虛擬地址只差一個(gè)偏移量。所以,當(dāng)物理內(nèi)存大于1G時(shí),物理內(nèi)存無法全部映射到內(nèi)核線性地址空間,這就產(chǎn)生了上述問題。

從上述描述可以看出,地址空間大于1G的內(nèi)存區(qū)域稱之為高端內(nèi)存,同理,小于1G的內(nèi)存區(qū)域稱之為低端內(nèi)存。高端內(nèi)存的管理需要進(jìn)行非線性映射,為此,在內(nèi)核線性地址空間預(yù)留了128M的空間,位于線性地址空間的高端。如今,CPU的地址總線都擴(kuò)大到64位了,線性地址資源非常豐富,所以,可以給內(nèi)核空間預(yù)留足夠的線性地址資源,在最近一段時(shí)間內(nèi),內(nèi)核線性地址資源與物理內(nèi)存容量之間的矛盾將不再突出,高端內(nèi)存的概念也就在64位CPU上消失了。

原先一直都對(duì)Linux高端內(nèi)存的管理認(rèn)識(shí)模模糊糊的,可能主要是初次接觸linux kernel 是0.11版吧,當(dāng)初的內(nèi)存設(shè)計(jì)是16M,Linus對(duì)擁有32M的內(nèi)存都是覬覦萬分,1G內(nèi)存恐怕是天方夜譚了。16M內(nèi)存哪里還顧得上高端內(nèi)存,腦子就一直沒有這種概念。先我們還是來看看為什么要有高端內(nèi)存?

80386的線性尋址空間是4G,內(nèi)核空間從3G開始,如果全部采用"線性映射"(物理地址和邏輯地址只差一個(gè)常量 PAGE_OFFSET ),最多管理1G物理內(nèi)存,也就是1G的物理內(nèi)存挨著挨著對(duì)應(yīng)的是虛擬地址的3G到4G的位置。你想想如果多于1G的內(nèi)存,我們用什么線性地址來裝下這些多出的地址呢? 我朋友的機(jī)器有2G,據(jù)說玩游戲巨爽(AMD64300+).顯然如果線性映射我的朋友就會(huì)浪費(fèi)1G內(nèi)存.為了使內(nèi)核能夠訪問這些"高端內(nèi)存",內(nèi)核使用HighMem.做法是不將內(nèi)核1G的虛擬地址空間全部映射成物理內(nèi)存,而是預(yù)留一部分給高端內(nèi)存做臨時(shí)映射使用.

其實(shí)內(nèi)核不僅僅預(yù)留了highmem的地址空間,還給fixmap,vmalloc預(yù)留了虛存空間.實(shí)際上,系統(tǒng)初始化的時(shí)候預(yù)留128M虛存,896M用于"直接"映射物理內(nèi)存。下面我們先貼上一幅圖,摘自《understand linux kernel 》



畢竟意淫是很考大家的空間想象能力的,所以我們還是依照?qǐng)D片來看圖說話:

高端內(nèi)存映射有三種方式:

1、映射到“內(nèi)核動(dòng)態(tài)映射空間”
這種方式很簡單,因?yàn)橥ㄟ^ vmalloc() ,在"內(nèi)核動(dòng)態(tài)映射空間"(上圖的VMALLOC_START到VMALLOC_END)申請(qǐng)內(nèi)存的時(shí)候,就可能從高端內(nèi)存獲得頁面(參看 vmalloc 的實(shí)現(xiàn)),因此說高端內(nèi)存有可能映射到"內(nèi)核動(dòng)態(tài)映射空間" 中。

2、永久內(nèi)核映射
如果是通過 alloc_page() 獲得了高端內(nèi)存對(duì)應(yīng)的 page,如何給它找個(gè)線性空間?
內(nèi)核專門為此留出一塊線性空間,從 PKMAP_BASE 到 FIXADDR_START (上圖的倒數(shù)第二塊區(qū)域),用于映射高端內(nèi)存。在 2.4 內(nèi)核上,這個(gè)地址范圍是 4G-8M 到 4G-4M 之間。這個(gè)空間起叫“內(nèi)核永久映射空間”或者“永久內(nèi)核映射空間”。

這個(gè)空間和其它空間使用同樣的頁目錄表,對(duì)于內(nèi)核來說,就是 swapper_pg_dir,對(duì)普通進(jìn)程來說,通過 CR3 寄存器指向。

通常情況下,這個(gè)空間是 4M 大小,因此僅僅需要一個(gè)頁表即可,內(nèi)核通過來 pkmap_page_table 尋找這個(gè)頁表。通過 kmap(), 可以把一個(gè) page 映射到這個(gè)空間來。由于這個(gè)空間是 4M 大小,最多能同時(shí)映射 1024 個(gè) page。因此,對(duì)于不使用的的 page,及應(yīng)該時(shí)從這個(gè)空間釋放掉(也就是解除映射關(guān)系),通過 kunmap() ,可以把一個(gè) page 對(duì)應(yīng)的線性地址從這個(gè)空間釋放出來。

3、臨時(shí)映射
內(nèi)核在 FIXADDR_START 到 FIXADDR_TOP 之間保留了一些線性空間用于特殊需求。這個(gè)空間稱為“固定映射空間”
在這個(gè)空間中,有一部分用于高端內(nèi)存的臨時(shí)映射。

這塊空間具有如下特點(diǎn):
1、每個(gè) CPU 占用一塊空間
2、在每個(gè) CPU 占用的那塊空間中,又分為多個(gè)小空間,每個(gè)小空間大小是 1 個(gè) page,每個(gè)小空間用于一個(gè)目的,這些目的定義在 kmap_types.h 中的 km_type 中。

當(dāng)要進(jìn)行一次臨時(shí)映射的時(shí)候,需要指定映射的目的,根據(jù)映射目的,可以找到對(duì)應(yīng)的小空間,然后把這個(gè)空間的地址作為映射地址。這意味著一次臨時(shí)映射會(huì)導(dǎo)致以前的映射被覆蓋.通過 kmap_atomic() 可實(shí)現(xiàn)臨時(shí)映射。
想學(xué)習(xí)的你和我聯(lián)系預(yù)約就可以免費(fèi)聽課了。
以下課程可免費(fèi)試聽C語言電子PCBSTM32、Linux、FPGA、JAVA、安卓等。
宋工企鵝號(hào):3524-6590-88   Tel/WX:173--1795--1908


本文地址:http://m.4huy16.com/thread-549457-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 常見深度學(xué)習(xí)模型介紹及應(yīng)用培訓(xùn)教程
  • 技術(shù)熱潮席卷三城,2025 Microchip中國技術(shù)精英年會(huì)圓滿收官!
  • “芯”光璀璨,鵬城共賞——2025 Microchip中國技術(shù)精英年會(huì)深圳站回顧
  • 電動(dòng)兩輪車設(shè)計(jì)生態(tài)系統(tǒng)
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表