- 論壇徽章:
- 0
|
由 page_to_pfn和pfn_to_page 的總結(jié)
2010-06-28 18:15
PFN => Page Frame Number 頁幀號
在內(nèi)核源代碼中 找出如下代碼。
#define PHYS_PFN_OFFSET (CONFIG_PHYS_OFFSET >> PAGE_SHIFT)
#define pfn_to_page(pfn) (mem_map + ((pfn) - PHYS_PFN_OFFSET))
#define page_to_pfn(page) ((unsigned long)((page) - mem_map) + PHYS_PFN_OFFSET)
這涉及到一個結(jié)構(gòu)體加減的問題。
不思考一會還真看不太清楚(基本功啊,汗)。
如下規(guī)則:
1:兩同類型結(jié)構(gòu)體相減,得到的是兩結(jié)地址之間可以有多少個對象。
一般情況是大地址減去一個小地址以得到兩同類型指針之間的對象個數(shù),但也可以小地址減大地址,只不過得出的一負數(shù)(這里小地址大地址是指同一數(shù)組中的前與后對象)。當然也可以不是一個數(shù)組中的兩人對象去相減,但這樣的結(jié)果我就是不知道是什么,我得出的結(jié)果始終是0。
2:結(jié)構(gòu)體加上一個常數(shù),得到的是相當于在當前結(jié)構(gòu)體為基地址的數(shù)組的第常數(shù)個對象的地址。
3:結(jié)構(gòu)體減去一個常數(shù),得到的是相當于在當前結(jié)構(gòu)體為參照數(shù)組中向前第常數(shù)個對象的地址。
4:兩個結(jié)構(gòu)指針相加,會提示[ error: invalid operands to binary + (have ‘struct X *’ and ‘struct X *’) ]這是無意義的操作,標準C不支持的操作。
#define page_to_pfn(page) ((unsigned long)((page) - mem_map) + PHYS_PFN_OFFSET)
根據(jù)給出頁地址求出對應的頁幀號。兩個結(jié)構(gòu)相減,得出的是丙都之間的對象個數(shù),加上起始幀號偏移,即給出頁地址的相對絕對頁號。
#define pfn_to_page(pfn) (mem_map + ((pfn) - PHYS_PFN_OFFSET))
根據(jù)給出的頁幀號計算出對應的頁幀號。頁基地址加上頁幀號是相對偏移的頁地址,減去一個偏移頁幀號即頁對象對應的地址。
我試試吧,剛查到的,C的 基本功啊,很少用這個功能 |
|