Linux記憶體線性地址空間布局解析

來源:互聯網
上載者:User

 

Linux記憶體線性地址空間大小為4GB,分為2個部分:使用者空間部分(通常是3G)和核心空間部分(通常是1G)。在此我們主要關注核心地址空間部分。

核心通過核心頁全域目錄來管理所有的實體記憶體,由於線性地址前3G空間為使用者使用,核心頁全域目錄前768項(剛好3G)除0、1兩項外全部為0,後256項(1G)用來管理所有的實體記憶體。核心頁全域目錄在編譯時間靜態地定義為swapper_pg_dir數組,該數組從實體記憶體地址0x101000處開始存放。

由圖可見,核心線性地址空間部分從PAGE_OFFSET(通常定義為3G)開始,為了將核心裝入記憶體,從PAGE_OFFSET開始8M線性地址用來映射核心所在的實體記憶體地址;接下來是mem_map數組,mem_map的起始線性地址與體繫結構相關,比如對於UMA結構,由於從PAGE_OFFSET開始16M線性地址空間對應的16M物理地址空間是DMA區,mem_map數組通常開始於PAGE_OFFSET+16M的線性地址;從PAGE_OFFSET開始到VMALLOC_START – VMALLOC_OFFSET的線性地址空間直接映射到實體記憶體空間(一一對應影射,物理地址<==>線性地址-PAGE_OFFSET),這段地區的大小和機器實際擁有的實體記憶體大小有關,這兒VMALLOC_OFFSET在X86上為8M,主要用來防止越界錯誤;在記憶體比較小的系統上,餘下的線性地址空間(還要再減去空白區即VMALLOC_OFFSET)被vmalloc()函數用來把不連續的物理地址空間映射到連續的線性地址空間上,在記憶體比較大的系統上,vmalloc()使用從VMALLOC_START到VMALLOC_END(也即PKMAP_BASE減去2頁的空白頁大小PAGE_SIZE)的線性地址空間,此時餘下的線性地址空間(還要再減去2頁的空白區即VMALLOC_OFFSET)又可以分成2部分:第一部分從PKMAP_BASE到FIXADDR_START用來由kmap()函數來建立永久映射高端記憶體;第二部分,從FIXADDR_START到FIXADDR_TOP,這是一個固定大小的臨時映射線性地址空間,(引用:Fixed virtual addresses are needed for subsystems that need to know the virtual address at compile time such as the APIC),在X86體繫結構上,FIXADDR_TOP被靜態定義為0xFFFFE000,此時這個固定大小空間結束於整個線性地址空間最後4K前面,該固定大小空間大小是在編譯時間計算出來並儲存在__FIXADDR_SIZE變數中。

正是由於vmalloc()使用區、kmap()使用區及固定大小區(kmap_atomic()使用區)的存在才使ZONE_NORMAL區大小受到限制,由於核心在運行時需要這些函數,因此線上性地址空間中至少要VMALLOC_RESERVE大小的空間。VMALLOC_RESERVE的大小與體繫結構相關,在X86上,VMALLOC_RESERVE定義為128M,這就是為什麼ZONE_NORMAL大小通常是16M到896M的原因。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.