国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

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

發布時間:2018-11-3 10:08    發布者:xyd2018
高端內存是Linux中一個重要的概念,初涉Linux時曾經對這個概念非常迷惑。實際上這個概念比較簡單,理解這個概念,需要追溯一下Linux的內存管理。

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

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

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

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

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

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



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

高端內存映射有三種方式:

1、映射到“內核動態映射空間”
這種方式很簡單,因為通過 vmalloc() ,在"內核動態映射空間"(上圖的VMALLOC_START到VMALLOC_END)申請內存的時候,就可能從高端內存獲得頁面(參看 vmalloc 的實現),因此說高端內存有可能映射到"內核動態映射空間" 中。

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

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

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

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

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

當要進行一次臨時映射的時候,需要指定映射的目的,根據映射目的,可以找到對應的小空間,然后把這個空間的地址作為映射地址。這意味著一次臨時映射會導致以前的映射被覆蓋.通過 kmap_atomic() 可實現臨時映射。
想學習的你和我聯系預約就可以免費聽課了。
以下課程可免費試聽C語言、電子PCBSTM32、Linux、FPGA、JAVA、安卓等。
宋工企鵝號:3524-6590-88   Tel/WX:173--1795--1908


本文地址:http://m.qingdxww.cn/thread-549457-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线毛片 | 欧美香蕉在线 | 日韩在线伦理片免费观看 | 欧美一区二区三区在线播放 | 亚洲另类网 | 日本中文字幕一区二区三区不卡 | 四库国产精品成人 | 国产成人精品久久二区二区 | 青青国产精品视频 | 国产手机视频 | 羞羞网站在线播放 | www.夜夜骑 | 中文字幕在线精品视频入口一区 | 人成午夜视频 | 狠狠色丁香婷婷综合尤物 | 欧美亚洲国产成人高清在线 | 国产第一自拍 | 九九九九热精品免费视频 | 久久99精品麻豆国产 | 欧美日韩精品在线播放 | 国产精品观看 | 天堂网在线.www天堂在线视频 | 五月四房婷婷 | 四虎永久免费最新在线 | 亚洲高清自拍 | 欧美乱人伦中文在线观看不卡 | 成人久久免费视频 | 国产精品手机视频 | 视频在线色 | 黄页网站在线看 | 色婷婷一区二区三区四区成人网 | 年轻的馊子hd中文播放 | 久久精品国产精品亚洲婷婷 | 国产精品免费网站 | 精品国产高清露脸在线观看 | 婷婷丁香在线观看 | 国产精品综合网 | 亚洲国产日韩欧美在线vip1区 | 国产一级理论免费版 | 日韩在线高清 | 91精品福利麻豆专区 |