您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關linux中pfn是什么意思,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
在linux中,pfn全稱“page frame number”,是物理內存區域編號。“page frame”是針對物理內存而言的,把物理內存分成一個個的page size的區域,并且給每一個page編號,而這個編號就是PFN。
本教程操作環境:linux5.9.8系統、Dell G3電腦。
1、什么是page frame?
操作系統最重要的作用之一就是管理計算機系統中的各種資源,做為最重要的資源:內存,我們必須管理起來。在linux操作系統中,物理內存是按照page size來管理的,具體page size是多少是和硬件以及linux系統配置相關的,4k是最經典的設定。因此,對于物理內存,我們將其分成一個個按page size排列的page,每一個物理內存中的page size的內存區域我們稱之page frame。我們針對每一個物理的page frame建立一個struct page的數據結構來跟蹤每一個物理頁面的使用情況:是用于內核的正文段?還是用于進程的頁表?是用于各種file cache還是處于free狀態……
每一個page frame有一個一一對應的page數據結構,系統中定義了page_to_pfn和pfn_to_page的宏用來在page frame number和page數據結構之間進行轉換,具體如何轉換是和memory modle相關,我們會在第三章詳細描述linux kernel中的3種內存模型。
2、什么是PFN?
對于一個計算機系統,其整個物理地址空間應該是從0開始,到實際系統能支持的最大物理空間為止的一段地址空間。在ARM系統中,假設物理地址是32個bit,那么其物理地址空間就是4G,在ARM64系統中,如果支持的物理地址bit數目是48個,那么其物理地址空間就是256T。當然,實際上這么大的物理地址空間并不是都用于內存,有些也屬于I/O空間(當然,有些cpu arch有自己獨立的io address space)。因此,內存所占據的物理地址空間應該是一個有限的區間,不可能覆蓋整個物理地址空間。不過,現在由于內存越來越大,對于32位系統,4G的物理地址空間已經無法滿足內存的需求,因此會有high memory這個概念,后續會詳細描述。
PFN是page frame number的縮寫,所謂page frame,就是針對物理內存而言的,把物理內存分成一個個的page size的區域,并且給每一個page 編號,這個編號就是PFN。假設物理內存從0地址開始,那么PFN等于0的那個頁幀就是0地址(物理地址)開始的那個page。假設物理內存從x地址開始,那么第一個頁幀號碼就是(x>>PAGE_SHIFT)。
PFN的取值范圍是 0----(memory size >> 12)。
但是由于物理內存映射的關系,物理內存的0地址對應到到系統上并不是物理地址的0。 例如:s3c2440上,內存的地址是從0x30000000開始的。當連接ram后,ram的0地址在s3c2440看來,就是0x30000000. 所以在系統中 pfn的值 應該等于 (physical address - memory base address) >> 12 。
但是linux中,用的又都是虛擬地址,所以要先將 virtual address轉換成 physical address 才行。 所以在linux中有個宏定義 將內核線性空間的虛擬地址和pfn轉換:
#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) //__pa() 將虛擬地址轉化成物理地址 #define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT)
所以pfn在linux內核中應該對應的是頁幀號。可以通過簡單的轉換找到對應的物理地址。
每個物理上的頁,內核給與之分配了一個描述符來描述: page。 pfn可以和page進行轉換:
#define page_to_pfn __page_to_pfn #define pfn_to_page __pfn_to_page
所有的page結構存放在mem_map中,方便進行管理。
由于linux是將物理內存分成4K大小的頁來進行管理的。所以在軟件上也會設置MMU進行匹配對應。后面敘述。
linux將4G的虛擬空間分成了用戶空間和內核空間。用戶空間是0---3G,內核空間是3G---4G。 從內核空間可以訪問到用戶空間,但是從用戶空間必須通過系統調用來能訪問內核空間。
關于“linux中pfn是什么意思”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。