DPDK(二) 準備知識1 hugepage

2022-08-20 04:48:09 字數 2153 閱讀 5764

邏輯位址的選擇符就對應上面講的cs暫存器,偏移量對應ip暫存器。32位作業系統嫌32的暫存器能表達的資訊太少,不用上面講的直接得出線性位址。而是再做一次轉換,先把段基址存到一塊記憶體,每個段基址佔8位元組(64位),當然這8位元組裡面還含有其他描述資訊,描述符會把index欄位*8得到某個段的描述符的位址,然後跑到那個位址取出裡邊的段基址再加上ip暫存器的偏移量就得到線性位址了。

總結:段式管理可以解決短位暫存器訪問大記憶體的問題。但是如果這樣20位的cpu系統只能支援最大的記憶體為64kb,這樣當然不可取。下面再介紹分頁管理機制。

2、頁式管理機制(linux下核心開發管理記憶體的方式)

頁目錄、頁表:頁式管理的兩個線性表,用來查詢存線性位址的頁

頁框:對應真正的實體地址,以4kb為邊界。

乙個32位的線性位址會被分成3個部分,10位頁目錄,10位頁表,12位頁偏移。理解為記憶體中儲存的一張張的擁有1024個表項的二維表,頁目錄每一項存放的是某個頁表的位址,而頁表中每一項存放的是某個頁的位址。可以想象為c語言中指標。

舉個例子:

線性位址是 0x00401001 ,表示為二進位制是 0000000001 0000000001 000000000001 ,對應上面三個名詞,那麼頁目錄值、頁表值和頁內偏移值都是1,也就說要想找到真正的實體地址,首先應該到頁目錄(擁有1024個頁目錄項)的第一項中定址,這個項中存的是頁表的位址,假如是1000,cpu就會跑到1000的實體地址(注意,真的是實體地址)上找到某個頁表,這個頁表又擁有1024項的頁表項。然後拿到第二個10位位址(還是1),也就說到第乙個頁表上的第一項,到這裡,其實就已經能找到物理記憶體塊了。想一下,每個頁表項代表4kb,每個頁表又1024個頁表項,而頁目錄項總共有1024個頁目錄項(=1024張頁表),所以能表示的總大小正好是4kb*1024*1024=4gb。要定位到具體的位元組就用到最後的12位了,再加上12位的偏移值即可。

3、dpdk 使用大頁

上面介紹的頁式管理機制,引入tlb概念**換後備緩衝器 translation lookaside buffer),tlb中儲存著邏輯位址前20位(頁目錄、頁表)和頁號(實體地址)的對應關係,如果匹配到邏輯位址就可以迅速的找到頁號,通過頁號與邏輯位址的後12位的偏移組合得到最終的實體地址。

所以,如果乙個程式使用了2mb的記憶體,那麼需要512個頁表表項(512*4kb=2048kb=2mb)才能保證不會出現tlb不命中的情況。由於tlb資源是有限的,隨著記憶體使用的增加,勢必增加tlb不命中的情況。自然會想到,如果頁框的值為2m,只需要乙個tlb。由於dpdk效能的要求和記憶體的大量使用,自然引入大頁的概念。

linux作業系統採用了基於hugetlbfs 的2mb或者1gb的大頁面的支援。修改核心引數即可預留大頁。

非numa系統中,預留1024個大小為2m的大頁

echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kb/nr_hugepages

numa系統中,兩個node的系統中,預留1024個2m的大頁

echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kb/nr_hugepages

echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kb/nr_hugepages

大頁預留了,下面講到使用的問題。dpdk使用hugetlbfs來使用大頁。首先,它需要把大頁mount到某個路徑 比如 /mnt/huge。

mkdir /mnt/huge

mount -t hugetlbfs nodev /mnt/huge

可以開機時自動掛載:

nodev /mnt/huge hugetlbfs defaults 0 0

接下來,dpdk執行的時候,會使用mmap()系統呼叫把大頁對映到使用者態的虛擬位址空間(在堆和棧之間),然後就可以正常使用了。

ptr=mmap(null, len , prot_read|prot_write, map_shared , fd , 0);第乙個引數為對映的起始位址,填null表示由核心分配起始位址。如果填寫指定的位址,該指定的位址需要在ld鏈結的時候預留好。ld詳細資訊為 ld -verbose

4、dpdk記憶體管理分析

DPDK(二) 準備知識2 cgroup

原文 一 簡介 linux cgroup全稱linux control group,是linux核心的乙個功能,用來限制,控制與分離乙個程序組群的資源 如cpu 記憶體 磁碟輸入輸出等 主要提供了如下功能 resource limitation 限制資源使用,比如記憶體使用上限以及檔案系統的快取限制...

組合語言的準備知識(1)

組合語言和cpu以及記憶體,埠等硬體知識是連在一起的.這也是為什麼組合語言沒有通用性的原因.下面簡單講講基本知識 針對intel x86及其相容機 x86組合語言的指令,其操作物件是cpu上的暫存器,系統記憶體,或者立即數.有些指令表面上沒有運算元,或者看上去缺少運算元,其實該指令有內定的操作物件,...

1 python計算機準備知識

三 乙個程式的執行與三大核心硬體的關係 四 作業系統 計算機就是 電腦 讓電腦能夠模仿人的行為和思想,為人類服務,通過計算機語言,讓電腦可以幫助人去工作。2.1 控制器 2.2 運算器 2.3 儲存器i o裝置 2.4 輸入裝置input 如 鍵盤 滑鼠 2.5 輸出裝置output 如 顯示器 印...