當前位置:首頁 » 操作系統 » linux內存分布

linux內存分布

發布時間: 2025-01-10 00:55:58

① Linux的內核空間和用戶空間是如何劃分的(以32位系統為例)

通常32位Linux內核地址空間劃分0~3G為用戶空間,3~4G為內核空間。地址分配如下圖所示

直接映射區:線性空間中從3G開始最大896M的區間,為直接內存映射區,該區域的線性地址和物理地址存在線性轉換關系:線性地址=3G+物理地址。

動態內存映射區:該區域由內核函數vmalloc來分配,特點是:線性空間連續,但是對應的物理空間不一定連續。vmalloc分配的線性地址所對應的物理頁可能處於低端內存,也可能處於高端內存。

永久內存映射區:該區域可訪問高端內存。訪問方法是使用alloc_page(_GFP_HIGHMEM)分配高端內存頁或者使用kmap函數將分配到的高端內存映射到該區域。

固定映射區:該區域和4G的頂端只有4k的隔離帶,其每個地址項都服務於特定的用途,如ACPI_BASE等。

② Linux裡面什麼線性內存

Linux內存線性地址空間格局解析
實用平台:i386
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_SIZE開始16M線形地址空間對應的16M物理地址空間是DMA區,mem_map數組等閑開始於PAGE_SIZE+16M的線形地址;從PAGE_SIZE開始到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變數中。真空斷路器o:p>
正是由於vmalloc()利用區、kmap()利用區及安寧大小區的存在才使ZONE_NORMAL區大小受到局限,由於內核在運行時必需這些函數,因而在線形地址空間中起碼要VMALLOC_RESERVE大小的空間。VMALLOC_RESERVE的大小與系統構造相干,在x86上,VMALLOC_RESERVE定義為128M,這即便為什麼我們看到ZONE_NORMAL大小等閑是16M到896M的起因。

③ 超詳細|Linux 如何進行內存分配

Linux操作系統中的虛擬內存管理分為內核空間和用戶空間兩大部分。在32位和64位系統中,地址空間范圍不同,每個進程擁有獨立的虛擬內存,內核地址關聯相同物理內存,便於進程切換至內核態訪問。用戶空間內存分布,以32位系統為例,從低到高分為6種不同的內存段。

申請內存空間通常有兩種方式:malloc和mmap。使用malloc時,系統可能調用brk或mmap函數。當分配小型內存(小於或等於128kb),malloc會通過brk函數移動堆頂指針獲取新空間;分配大型內存(大於128kb)時,mmap通過私有匿名映射在文件映射區分配內存。

malloc分配的是虛擬內存,未被訪問的虛擬內存不會映射到物理內存,不佔用物理內存資源。訪問已分配虛擬地址空間時,操作系統通過查找頁表建立虛擬內存與物理內存映射關系。缺頁中斷發生在虛擬內存不在主存時,系統將文件映射為分頁交換文件。

分配內存後使用free釋放內存,malloc通過brk系統調用在堆空間預分配內存,內存釋放緩存在內存池,下次申請時直接取用,減少了系統調用和缺頁中斷次數,降低CPU消耗。相反,使用mmap分配內存每次釋放時歸還給操作系統,頻繁使用mmap分配內存會導致CPU消耗較大,且增加運行態切換和缺頁中斷次數。

通過brk分配內存時,連續申請並釋放大塊內存後,堆內可能產生不可用的碎片,導致內存泄露。隨著頻繁的malloc和free操作,尤其是對小塊內存的使用,系統內將累積越來越多不可用的碎片,引發「內存泄露」問題,這種現象在使用valgrind時無法檢測。因此,malloc默認分配大塊內存(128KB)時使用mmap分配空間,以優化內存管理。

④ Linux進程內存管理

對於包含MMU的處理器而言,Linux系統提供了復雜的存儲管理系統,使得進程所能訪問的內存達到4GB。在Linux系統中,進程的4GB內存空間被分為兩個部分——用戶空間與內核空間。用戶空間的地址一般分布為0~3GB(即PAGE_OFFSET,在Ox86中它等於OxC0000000),這樣,剩下的3~4GB為內核空間,用戶進程通常只能訪問用戶空間的虛擬地址,不能訪問內核空間的虛擬地址。用戶進程只有通過系統調用(代表用戶進程在內核態執行)等方式才可以訪問到內核空間。
每個進程的用戶空間都是完全獨立、互不相乾的,用戶進程各自有不同的頁表。而內核空間是由內核負責映射,它並不會跟著進程改變,是固定的。內核空間的虛擬地址到物理地址映射是被所有進程共享的,內核的虛擬空間獨立於其他程序。
Linux中1GB的內核地址空間又被劃分為物理內存映射區、虛擬內存分配區、高端頁面映射區、專用頁面映射區和系統保留映射區這幾個區域。
對於x86系統而言,一般情況下,物理內存映射區最大長度為896MB,系統的物理內存被順序映射在內核空間的這個區域中。當系統物理內存大於896MB時,超過物理內存映射區的那部分內存稱為高端內存(而未超過物理內存映射區的內存通常被稱為常規內存),內核在存取高端內存時必須將它們映射到高端頁面映射區。Linux保留內核空間最頂部FIXADDR_TOP~4GB的區域作為保留區。
當系統物理內存超過4GB時,必須使用CPU的擴展分頁(PAE)模式所提供的64位頁目錄項才能存取到4GB以上的物理內存,這需要CPU的支持。加入了PAE功能的Intel Pentium Pro及以後的CPU允許內存最大可配置到64GB,它們具備36位物理地址空間定址能力。
由此可見,對於32位的x86而言,在3~4GB之間的內核空間中,從低地址到高地址依次為:物理內存映射區→隔離帶→vmalloc虛擬內存分配器區→隔離帶→高端內存映射區→專用頁面映射區→保留區。

熱點內容
安卓手機怎麼切兩個屏 發布:2025-01-10 10:33:51 瀏覽:680
python上傳圖片 發布:2025-01-10 10:30:54 瀏覽:202
培訓班編程 發布:2025-01-10 10:27:56 瀏覽:751
plc沒有編譯什麼意思 發布:2025-01-10 10:17:20 瀏覽:840
jdk源碼學習 發布:2025-01-10 10:07:15 瀏覽:7
lumion怎麼更改緩存文件的路徑 發布:2025-01-10 09:57:19 瀏覽:396
網吧收費主機怎麼查伺服器ip 發布:2025-01-10 09:52:16 瀏覽:745
如何測量出電腦配置 發布:2025-01-10 09:29:40 瀏覽:520
氟壓縮機型號 發布:2025-01-10 09:25:07 瀏覽:117
溢價演算法 發布:2025-01-10 09:23:04 瀏覽:199