色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

操作系統的內存布局介紹

嵌入式與Linux那些事 ? 來源:嵌入式與Linux那些事 ? 2024-08-07 15:47 ? 次閱讀

來源:嵌入式Linux那些事公眾號

ARM32位系統的內存布局圖

32位操作系統的內存布局很經典,很多書籍都是以32位系統為例子去講解的。32位的系統可訪問的地址空間為4GB,用戶空間為1GB ~ 3GB,內核空間為3GB ~ 4GB。

cfa9a19c-3847-11ef-a4c8-92fbcf53809c.png

為什么要劃分為用戶空間和內核空間呢?

一般處理器會把運行模式分為好幾個,比如x86分為rang0 ~ rang3級別。ARMv7架構中,又分為好幾個模式,比如svc模式是給內核用的,usr模式是給用戶態使用的。

當一個進程執行系統調用時,會陷入到內核態中,這個時候運行模式就從usr模式轉換為svc模式,這就是我們常說的內核態。處于內核態的進程是可以訪問內核空間的。所以就根據CPU的運行模式劃分了兩個空間。

我們先看下1GB的內核空間是怎么劃分的,32位的系統中,通常配置的物理內存通常是大于1GB的,所以物理內存會劃分為兩部分,低端內存稱為線性映射區,高端內存稱為高端映射區。那這個分界線是怎么計算的呢,在ARM32中,分界線為760M。低端內存會做一比一映射到3GB ~ 3GB+760M。

這里講的線性映射就是直接把物理內存的地址映射到線性映射區中,假設物理內存的DDR起始地址是0,映射的時候就有一個偏移量,這個偏移量就是0XC0000000,page offset。線性映射的地址我們就可以很方便的完成虛擬地址到物理地址的轉換,只需要加減一個offset就可以。

高端內存的映射就沒有線性映射那么簡單了,使用高端內存時需要完成動態映射。

我們先看下1GB的內核空間剩下都做什么使用了。

vmalloc區域:分配的內存在虛擬地址是連續的,物理頁面可以是離散的。vmalloc大概占用了200M物理內存。

fixmap:Fix map中的fix指的是固定的意思,那么固定什么東西呢?其實就是虛擬地址是固定的,也就是說,有些虛擬地址在編譯(compile-time)的時候就固定下來了,而這些虛擬地址對應的物理地址不是固定的,是在kernel啟動過程中被確定的。

vector:vector區域用于映射CPU vector page,大小一頁4KB,從0xffff0000 - 0xffff1000。

接下來看下3GB用戶空間的劃分方式,一個進程要運行起來,必然要有自己的代碼段和數據段,這部分在加載的時候就會被映射到虛擬地址。

堆空間:從進程的開始到1GB的這部分我們稱為堆空間,這部分主要是給malloc使用的。

mmap空間:1GB到3GB這部分是給mmap空間使用的,mmap可以用來映射文件也可以映射匿名頁面。通常用戶態分配大段內存的時候,Linux通常會使用mmap來完成分配。

從進程的角度看內存布局

readelf 查看程序段

接下來,我們通過一個C語言程序學習下內存布局,這個例子很簡單,用malloc函數分配了內存內存,然后使用memset將該區域清零。

使用gcc編譯為elf后,可以使用readelf 查看該程序包含那些段。

#include
#include
#include

#defineSIZE(100*1024)
voidmain()
{
char*buf=malloc(SIZE);
memset(buf,0x58,SIZE);
while(1)
sleep(10000);
}
gcc-staticmemory_process.c-omemory_process.elf
cfc3d8c8-3847-11ef-a4c8-92fbcf53809c.pngcff1b478-3847-11ef-a4c8-92fbcf53809c.png

我們知道,通常Linux中流行的可執行文件的格式就是elf。使用gcc編譯的elf就是我們講的elf文件,目標文件除了包含了編譯后的機器指令代碼,還包含其他鏈接信息,比如符號表,調試信息,字符串等,通常這些信息會根據不同的屬性存放在不同的段(section)中,這里我們只關注常見的段 。

.init:程序初始化的代碼段。

.text:代碼段,程序編譯完后的機器指令。

.data:初始化過的全局的靜態變量,還有一些局部的靜態變量。

.rodata:只讀變量,字符串,常量等。

.bss:未初始化的全局變量以及初始化為零的變量。

readelf 查看程序頭

使用-l參數讀下程序頭(program header),它是用來描述OS是如何被映射到進程的虛擬地址空間的。

d00ef592-3847-11ef-a4c8-92fbcf53809c.png

之前我們看到的30個段,在這里分成了7個族,并且顯示每個族都包含那些段,這里我們只關注叫load的族,其他族主要是在程序裝載的時候起到輔助作用。

第一個族里面包含init,text段,他的執行權限是只讀,可執行的(RE)。起始地址0x0000000000400000,大小是0x00000000000b5986。

另外一個族主要包含data和bss段,他的執行權限是可讀寫(RW)。起始地址0x00000000006b6120,大小是0x00000000000051b8。

進程映射的過程

d032465a-3847-11ef-a4c8-92fbcf53809c.png

地址:本段在虛擬內存中的地址范圍;對應vm_area_struct中的vm_start和vm_end。

權限:本段的權限; r-讀,w-寫,x-執行, p-私有;對應vm_flags。

偏移地址:即本段映射地址在文件中的偏移;對于有名映射指本段映射地址在文件中的偏移,對應vm_pgoff;對于匿名映射為vm_area_struct->vm_start。

主設備號與次設備號:所映射的文件所屬設備的設備號,對應vm_file->f_dentry->d_inode->i_sb->s_dev。匿名映射為0。其中fd為主設備號,00為次設備號。

文件索引節點號:對應vm_file->f_dentry->d_inode->i_ino,與ls –i顯示的內容相符。匿名映射為0。

映射的文件名:對有名映射而言,是映射的文件名,對匿名映射來說,是此段內存在進程中的作用。[stack]表示本段內存作為棧來使用,[heap]作為堆來使用,其他情況則為無。

smaps 可以查看更多的內容

?examplecat/proc/5823/smaps
00400000-004b6000r-xp0000000008:012319863/home/zhongyi/code/example/memory_process.elf
Size:728kB
KernelPageSize:4kB
MMUPageSize:4kB
Rss:640kB
Pss:640kB
Shared_Clean:0kB
Shared_Dirty:0kB
Private_Clean:640kB
Private_Dirty:0kB
Referenced:640kB
Anonymous:0kB
LazyFree:0kB
AnonHugePages:0kB
ShmemPmdMapped:0kB
FilePmdMapped:0kB
Shared_Hugetlb:0kB
Private_Hugetlb:0kB
Swap:0kB
SwapPss:0kB
Locked:0kB
THPeligible:0
VmFlags:rdexmrmwmedwsd
006b6000-006bc000rw-p000b600008:012319863/home/zhongyi/code/example/memory_process.elf
Size:24kB
KernelPageSize:4kB
MMUPageSize:4kB
Rss:24kB
Pss:24kB
Shared_Clean:0kB
Shared_Dirty:0kB
Private_Clean:8kB
Private_Dirty:16kB
Referenced:24kB
Anonymous:16kB
LazyFree:0kB
AnonHugePages:0kB
ShmemPmdMapped:0kB
FilePmdMapped:0kB
Shared_Hugetlb:0kB
Private_Hugetlb:0kB
Swap:0kB
SwapPss:0kB
Locked:0kB
THPeligible:0
VmFlags:rdwrmrmwmedwacsd
006bc000-006bd000rw-p0000000000:000
Size:4kB
KernelPageSize:4kB
MMUPageSize:4kB
Rss:4kB
Pss:4kB
Shared_Clean:0kB
Shared_Dirty:0kB
Private_Clean:0kB
Private_Dirty:4kB
Referenced:4kB
Anonymous:4kB
LazyFree:0kB
AnonHugePages:0kB
ShmemPmdMapped:0kB
FilePmdMapped:0kB
Shared_Hugetlb:0kB
Private_Hugetlb:0kB
Swap:0kB
SwapPss:0kB
Locked:0kB
THPeligible:0
VmFlags:rdwrmrmwmeacsd
010cc000-010ef000rw-p0000000000:000[heap]
Size:140kB
KernelPageSize:4kB
MMUPageSize:4kB
Rss:108kB
Pss:108kB
Shared_Clean:0kB
Shared_Dirty:0kB
Private_Clean:0kB
Private_Dirty:108kB
Referenced:108kB
Anonymous:108kB
LazyFree:0kB
AnonHugePages:0kB
ShmemPmdMapped:0kB
FilePmdMapped:0kB
Shared_Hugetlb:0kB
Private_Hugetlb:0kB
Swap:0kB
SwapPss:0kB
Locked:0kB
THPeligible:0
VmFlags:rdwrmrmwmeacsd
7ffd5e0db000-7ffd5e0fc000rw-p0000000000:000[stack]
Size:132kB
KernelPageSize:4kB
MMUPageSize:4kB
Rss:16kB
Pss:16kB
Shared_Clean:0kB
Shared_Dirty:0kB
Private_Clean:0kB
Private_Dirty:16kB
Referenced:16kB
Anonymous:16kB
LazyFree:0kB
AnonHugePages:0kB
ShmemPmdMapped:0kB
FilePmdMapped:0kB
Shared_Hugetlb:0kB
Private_Hugetlb:0kB
Swap:0kB
SwapPss:0kB
Locked:0kB
THPeligible:0
VmFlags:rdwrmrmwmegdac
7ffd5e100000-7ffd5e103000r--p0000000000:000[vvar]
Size:12kB
KernelPageSize:4kB
MMUPageSize:4kB
Rss:0kB
Pss:0kB
Shared_Clean:0kB
Shared_Dirty:0kB
Private_Clean:0kB
Private_Dirty:0kB
Referenced:0kB
Anonymous:0kB
LazyFree:0kB
AnonHugePages:0kB
ShmemPmdMapped:0kB
FilePmdMapped:0kB
Shared_Hugetlb:0kB
Private_Hugetlb:0kB
Swap:0kB
SwapPss:0kB
Locked:0kB
THPeligible:0
VmFlags:rdmrpfiodeddsd
7ffd5e103000-7ffd5e105000r-xp0000000000:000[vdso]
Size:8kB
KernelPageSize:4kB
MMUPageSize:4kB
Rss:4kB
Pss:0kB
Shared_Clean:4kB
Shared_Dirty:0kB
Private_Clean:0kB
Private_Dirty:0kB
Referenced:4kB
Anonymous:0kB
LazyFree:0kB
AnonHugePages:0kB
ShmemPmdMapped:0kB
FilePmdMapped:0kB
Shared_Hugetlb:0kB
Private_Hugetlb:0kB
Swap:0kB
SwapPss:0kB
Locked:0kB
THPeligible:0
VmFlags:rdexmrmwmedesd
ffffffffff600000-ffffffffff601000--xp0000000000:000[vsyscall]
Size:4kB
KernelPageSize:4kB
MMUPageSize:4kB
Rss:0kB
Pss:0kB
Shared_Clean:0kB
Shared_Dirty:0kB
Private_Clean:0kB
Private_Dirty:0kB
Referenced:0kB
Anonymous:0kB
LazyFree:0kB
AnonHugePages:0kB
ShmemPmdMapped:0kB
FilePmdMapped:0kB
Shared_Hugetlb:0kB
Private_Hugetlb:0kB
Swap:0kB
SwapPss:0kB
Locked:0kB
THPeligible:0
VmFlags:ex

堆里面,匿名頁面分配了108個物理內存,但我們的測試程序只分配了100k物理內存,這里匿名頁面比分配的要大,這是因為進程在裝載的時候也要消耗一些匿名頁面。

010cc000-010ef000rw-p0000000000:000[heap]
Size:140kB
KernelPageSize:4kB
MMUPageSize:4kB
Rss:108kB
Pss:108kB
Shared_Clean:0kB
Shared_Dirty:0kB
Private_Clean:0kB
Private_Dirty:108kB
Referenced:108kB
Anonymous:108kB
LazyFree:0kB
AnonHugePages:0kB
ShmemPmdMapped:0kB
FilePmdMapped:0kB
Shared_Hugetlb:0kB
Private_Hugetlb:0kB
Swap:0kB
SwapPss:0kB
Locked:0kB
THPeligible:0
VmFlags:rdwrmrmwmeacsd

根據以上信息,可以繪制出測試程序內存的布局圖。

d0527704-3847-11ef-a4c8-92fbcf53809c.png

測試程序進程的elf這里只列出了常用的段。代碼段的VMA屬于page cache映射,這里把init段,text段,rodata段分為一個族,因為他們具有相同的權限,在進程加載的時候,會映射到代碼段的VMA中。

數據段的VMA屬于匿名映射,bss,data段具有相同的權限,在OS加載時,會映射到數據段的VMA中。

從數據段開始的地方就屬于堆空間,我們在程序中用malloc分配了100K空間,這100K大小,也是在堆空間有對應的位置存在。

另外就是棧的VMA,進程有屬于自己的VMA的棧。

以上就介紹了進程的ELF如何和進程的地址空間映射起來的。

64位系統的布局圖

64位系統可以訪問的空間就變得很大了。不過是ARM還是X86,實際的物理地址都不會用到64根地址線,通常是使用了48根地址線。而且,劃分的用戶空間和內核空間都是非常大的。

d0803b58-3847-11ef-a4c8-92fbcf53809c.png

大家可以看這張圖,把空間分為了三部分,一部分是內核空間,一部分是非規范區域(大家都不使用的),最后是用戶空間。

用戶空間:0x0000_0000_0000_0000到0x0000_ffff_ffff_ffff,一共有256TB。

非規范區域

內核空間:0xffff_0000_0000_0000到0xffff_ffff_ffff_ffff。一共有256TB。

內核空間又做了如下細分:

vmalloc區域:vmalloc函數使用的虛擬地址空間,kernel image也在vmalloc區域,內核鏡像的起始地址 = KIMAGE_ADDR + TEXT_OFFSET, TEXT_OFFSET是內存中的內核鏡像相對內存起始位置的偏移。

vmemmap區域:內存的物理地址如果不連續的話,就會存在內存空洞(稀疏內存),vmemmap就用來存放稀疏內存的page結構體的數據的虛擬地址空間。

PCI I/O區域:pci設備的I/O地址空間

Modules區域:內核模塊使用的虛擬地址空間

normal memory線性映射區:范圍是【0xffff_8000_0000_0000, 0xffff_ffff_ffff_ffff】, 一共有128TB, 但這里代碼對應的是memblock_start_of_DRAM()和memblock_end_of_DRAM()函數。memory根據實際物理內存大小做了限制,所以memroy顯示了實際能夠訪問的內存區。

MLM(__phys_to_virt(memblock_start_of_DRAM()),(unsignedlong)high_memory))
high_memory=__va(memblock_end_of_DRAM()-1)+1;

最終是通過dts或acpi中配置的memory節點確定的。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19259

    瀏覽量

    229652
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9084

    瀏覽量

    367384
  • 操作系統
    +關注

    關注

    37

    文章

    6801

    瀏覽量

    123283
  • 內存管理
    +關注

    關注

    0

    文章

    168

    瀏覽量

    14134

原文標題:【內存管理】內存布局介紹

文章出處:【微信號:嵌入式與Linux那些事,微信公眾號:嵌入式與Linux那些事】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Symbian和WinCE操作系統內存管理技術研究

    、Samsung等公司共同所有。Symbian操作系統的前身是EPOC,這是一個多任務的 32位軟實時操作系統。Symbian在設計之初就是專門針對高度內存受限的系統的,因此其在
    的頭像 發表于 09-05 12:21 ?3204次閱讀
    Symbian和WinCE<b class='flag-5'>操作系統</b>的<b class='flag-5'>內存</b>管理技術研究

    進程的內存布局(1)#操作系統

    操作系統
    學習硬聲知識
    發布于 :2023年06月01日 12:17:31

    進程的內存布局(2)#操作系統

    操作系統
    學習硬聲知識
    發布于 :2023年06月01日 12:18:12

    什么是嵌入式操作系統內存管理技術?

    1 概 述內存管理是操作系統的中心任務之一。內存管理模塊通常是操作系統內核的一部分,其主要任務是為操作系統內核和各執行程序組織
    發表于 07-30 07:19

    操作系統對于內存的管理

    操作系統如何有效的管理內存便顯得尤為重要。本文講述操作系統對于內存的管理的過去和現在,以及一些頁替換的算法的介紹
    發表于 08-07 06:53

    介紹ThreadX操作系統

    第3章 ThreadX操作系統介紹本章節介紹 ThreadX 操作系統,讓大家對 ThreadX 有一個整體的了解。目錄第3章 ThreadX操作系
    發表于 08-24 07:13

    ThreadX操作系統介紹

    第3章 ThreadX操作系統介紹本章節介紹 ThreadX 操作系統,讓大家對 ThreadX 有一個整體的了解。目錄第3章 ThreadX操作系
    發表于 08-24 07:37

    內存的基本概念以及操作系統內存管理算法

    本文主要介紹內存的基本概念以及操作系統內存管理算法。內存的基本概念內存是計算機
    發表于 01-27 06:08

    嵌入式操作系統內存管理技術的分析與比較

    嵌入式操作系統內存管理技術的分析與比較  1 概 述   內存管理是操作系統的中心任務之一。內存管理模塊通常是
    發表于 01-14 11:30 ?743次閱讀
    嵌入式<b class='flag-5'>操作系統</b><b class='flag-5'>內存</b>管理技術的分析與比較

    Windows XP操作系統內存條優化指南

    Windows XP操作系統內存條優化指南 雖然Windows XP是一個很出色的操作系統,但它對內存的要求是在是驚人,即使是128兆內存
    發表于 01-11 11:45 ?725次閱讀

    嵌入式操作系統FreeRTOS內存如何管理和堆

    嵌入式操作系統FreeRTOS內存管理和堆
    的頭像 發表于 01-10 15:17 ?4693次閱讀
    嵌入式<b class='flag-5'>操作系統</b>FreeRTOS<b class='flag-5'>內存</b>如何管理和堆

    Linux操作系統知識講解:走進內存

    Linux操作系統知識講解:走進內存
    的頭像 發表于 08-28 10:30 ?2352次閱讀
    Linux<b class='flag-5'>操作系統</b>知識講解:走進<b class='flag-5'>內存</b>

    內存的基本概念以及操作系統內存管理算法

    本文主要介紹內存的基本概念以及操作系統內存管理算法。
    的頭像 發表于 08-18 15:52 ?1695次閱讀

    虛擬內存操作系統(Linux)中的實現

    我們都知道一個進程是與其他進程共享CPU和內存資源的。正因如此,操作系統需要有一套完善的內存管理機制才能防止進程之間內存泄漏的問題。
    的頭像 發表于 02-22 09:55 ?890次閱讀

    什么是內存 操作系統內存介紹

    什么是內存 我們想準備運行程序進程需要經過那幾個步驟,這里猜測一下。 首先要去申請內存操作系統根據現在剩余的地毯空間與你地毯的規模劃分一塊相應大小的內存給你,接著你就可以愉快的運行程
    的頭像 發表于 10-09 16:23 ?907次閱讀
    什么是<b class='flag-5'>內存</b> <b class='flag-5'>操作系統</b><b class='flag-5'>內存</b><b class='flag-5'>介紹</b>
    主站蜘蛛池模板: 美娇妻的性奴史1一4| 一区二区三区内射美女毛片| 纯h超级大尺度小黄文| 欧美最猛性XXX孕妇| 99视频网站| 欧美牲交A欧美牲交| 把她带到密室调教性奴| 日韩欧美精品有码在线播放免费 | 日本超A大片在线观看| 顶级少妇AAAAABBBBB片| 涩涩视频下载| 国产精品久久久久久精品...| 天天干夜夜叭| 国产免费午夜| 亚洲免费无码av线观看| 久久99影院| 2017日日干| 欧美精品一区二区在线电影| 超碰caopro熟女m超碰分类| 日日摸夜夜添夜夜爽出水| 国产精品视频yy9099| 亚洲国产精品无码AV久久久| 久久99亚洲AV无码四区碰碰| 91久久偷偷看嫩草影院无费| 奇米色偷偷| 国产精品成人影院在线观看| 性吧 校园春色| 久久99国产精品自在自在| 91情国产l精品国产亚洲区| 琪琪电影午夜理论片77网| 国产传媒18精品A片在线观看| 亚洲 自拍 偷拍 另类综合图区| 精品久久久久久久久免费影院| 2021国产精品视频一区| 青青草国拍2018| 国产毛片视频网站| 原神美女被超污app| 欧美性色xo影院69| 国产精品一久久香蕉国产线看| 野花香在线观看免费观看大全动漫 | 亚洲 成人网|