亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
請(qǐng)問(wèn):mem_map數(shù)組是什么?
[打印本頁(yè)]
作者:
netdoger
時(shí)間:
2013-10-26 17:27
標(biāo)題:
請(qǐng)問(wèn):mem_map數(shù)組是什么?
我看《linux內(nèi)核API完全參考手冊(cè)》時(shí),
說(shuō)到mem_map數(shù)組的起始地址為0xC1000000,
可是我用它的例子,得出的mem_map數(shù)組的起始
卻是0,請(qǐng)問(wèn)mem_map數(shù)組是什么?
難道說(shuō)它的起始地址一定是0xC1000000嗎?
為什么我的卻不是?
作者:
kiongf
時(shí)間:
2013-10-27 00:09
回復(fù)
1#
netdoger
mem_map數(shù)組是page descriptor array. 也就是struct page類型變量的數(shù)組, 存儲(chǔ)著所有物理頁(yè)的描述符.
這個(gè)數(shù)組和內(nèi)存節(jié)點(diǎn)有關(guān)。 如果你的內(nèi)存是單節(jié)點(diǎn)的, 可以通過(guò)NODE_DATA[0].node_mem_map來(lái)訪問(wèn)第一個(gè)節(jié)點(diǎn)的mem_map數(shù)組.
作者:
netdoger
時(shí)間:
2013-10-27 08:58
我看到書(shū)上說(shuō):
內(nèi)核用數(shù)據(jù)結(jié)構(gòu)page描述一個(gè)頁(yè)框的狀態(tài)信息,所有的頁(yè)描述符存放在全局mem_map數(shù)組中,其數(shù)組的下標(biāo)為頁(yè)框號(hào)(pfn)。
因?yàn)槊總(gè)描述符長(zhǎng)度為32字節(jié),那么一個(gè)頁(yè)描述符怎樣與一個(gè)占據(jù)4k的頁(yè)框相聯(lián)系(映射)呢?有了mem_map數(shù)組,
這個(gè)問(wèn)題就很簡(jiǎn)單了。因?yàn)槿绻懒藀age數(shù)據(jù)的地址pd,用pd去減去mem_map就得到了pd的頁(yè)框號(hào)pfn。
可是我對(duì)這個(gè)有疑問(wèn):
比如我的內(nèi)存是1M,那么1M的內(nèi)存可以分為1M/4k=256個(gè)頁(yè)面,也就是說(shuō)mem_map的最大下標(biāo)是255,
每個(gè)頁(yè)面需要32個(gè)字節(jié)的描述符,那么256個(gè)頁(yè)面需要32*256個(gè)字節(jié),也就是需要32*256/4k=2個(gè)頁(yè)面,
即前面8k的內(nèi)存是描述符,也就是存放mem_map的內(nèi)容,即mem_map的地址是0,那么從第三個(gè)頁(yè)面
可是存放數(shù)據(jù),那么第三個(gè)頁(yè)面的地址-mem_map的地址應(yīng)該是8*1024,這個(gè)怎么可能是mem_map
的下標(biāo)呢?
請(qǐng)問(wèn)我這樣理解有什么問(wèn)題嗎
作者:
netdoger
時(shí)間:
2013-10-27 10:53
為什么書(shū)上說(shuō)mem_map的起始地址一定是0xC1000000,可是我得出卻是0?
作者:
kiongf
時(shí)間:
2013-10-27 14:03
回復(fù)
3#
netdoger
這是單一節(jié)點(diǎn)且flat memory model時(shí), 通過(guò)pfn查找相應(yīng)的page descriptor的函數(shù).
struct page *mem_map;
#define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET)) // ARCH_PFN_OFFSET 如果沒(méi)有特別配置,一般為0.
你指的第三個(gè)page frame的page desciptor, 是從mem_map指向的內(nèi)存移動(dòng)了2*sizeof(struct page) 字節(jié) 不就等于 mem_map + 2。
為什么書(shū)上說(shuō)mem_map的起始地址一定是0xC1000000,可是我得出卻是0?
mm/memory.c中
#ifndef CONFIG_NEED_MULTIPL_NODES /*UMA*/
unsigned long max_mapnr;
struct page *mem_map;
...
#endif
mm/page_alloc.c中
alloc_node_mem_map()函數(shù)負(fù)責(zé)申請(qǐng)mem_map的內(nèi)存.
這里提到:
#ifdef CONFIG_FLAT_NODE_MEM_MAP
...
map = alloc_remap(pgdat->node_id, size);
if (!map)
map = alloc_bootmem_node(); // 申請(qǐng)分配mem_map的內(nèi)存
pgdat-> node_mem_map = map + (pgdat-> node_start_pfn - start);
#ifndef CONFIG_NEED_MULITPLE_NODES
if (pgdat == NODE_DATA[0])){ //如果是第一個(gè)節(jié)點(diǎn)
mem_map = NODE_DATA[0]->node_mem_map;
.....
}
...
#endif
#endif
從上面兩個(gè)函數(shù)來(lái)看,都使用了條件宏. 說(shuō)明mem_map不僅和內(nèi)存模型有關(guān), 而且和內(nèi)存節(jié)點(diǎn)有關(guān).
因此, 在某些架構(gòu)中, mem_map不一定被賦值.
我個(gè)人覺(jué)得, 最好通過(guò)隱藏了底部細(xì)節(jié)的NODE_DATA(節(jié)點(diǎn)描述符數(shù)組)來(lái)獲得mem_map的起始地址:
NODE_DATA[0]->node_mem_map.
另外你可以通過(guò)dmesg | grep -e 'node_mem_map'來(lái)獲得 'mem_map'的地址.
作者:
netdoger
時(shí)間:
2013-10-27 16:43
雖然我看得不是很明白,但是我還是要說(shuō):你牛!
作者:
netdoger
時(shí)間:
2013-10-27 16:46
dmesg | grep -e 'node_mem_map',我這樣不行,沒(méi)有。還能怎么樣看到'node_mem_map'這個(gè)地址?
可能我裝載模塊時(shí),有執(zhí)行dmesg -c,把它清掉了
作者:
kiongf
時(shí)間:
2013-10-27 21:39
回復(fù)
7#
netdoger
這個(gè)是在內(nèi)核啟動(dòng)時(shí), 打印的mem_map的地址.. 調(diào)用函數(shù)是free_area_init_node()。在系統(tǒng)啟動(dòng)時(shí)間 不到1s時(shí) 打印.
如果系統(tǒng)長(zhǎng)時(shí)間運(yùn)行, dmesg會(huì)丟失之前記錄的
作者:
qq1109444129
時(shí)間:
2017-05-15 10:55
我最近也納悶,而且我編譯出來(lái)的程序,會(huì)顯示W(wǎng)ARNING: "mem_map" [/root/文檔/alloc_pages1/alloc_pages.ko] undefined!
模塊也加載不進(jìn)去,書(shū)上的這個(gè)例程我也完全加載不進(jìn)去。。
不知道你搞明白了沒(méi),
歡迎光臨 Chinaunix (http://72891.cn/)
Powered by Discuz! X3.2