亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 7007 | 回復(fù): 7
打印 上一主題 下一主題

[進程管理] 請問:mem_map數(shù)組是什么? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-10-26 17:27 |只看該作者 |倒序瀏覽
我看《linux內(nèi)核API完全參考手冊》時,
說到mem_map數(shù)組的起始地址為0xC1000000,
可是我用它的例子,得出的mem_map數(shù)組的起始
卻是0,請問mem_map數(shù)組是什么?
難道說它的起始地址一定是0xC1000000嗎?
為什么我的卻不是?

論壇徽章:
3
雙魚座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亞洲杯之澳大利亞
日期:2015-04-20 00:28:02
2 [報告]
發(fā)表于 2013-10-27 00:09 |只看該作者
回復(fù) 1# netdoger


    mem_map數(shù)組是page descriptor array. 也就是struct page類型變量的數(shù)組, 存儲著所有物理頁的描述符.

     這個數(shù)組和內(nèi)存節(jié)點有關(guān)。  如果你的內(nèi)存是單節(jié)點的, 可以通過NODE_DATA[0].node_mem_map來訪問第一個節(jié)點的mem_map數(shù)組.

論壇徽章:
0
3 [報告]
發(fā)表于 2013-10-27 08:58 |只看該作者
我看到書上說:
內(nèi)核用數(shù)據(jù)結(jié)構(gòu)page描述一個頁框的狀態(tài)信息,所有的頁描述符存放在全局mem_map數(shù)組中,其數(shù)組的下標為頁框號(pfn)。
因為每個描述符長度為32字節(jié),那么一個頁描述符怎樣與一個占據(jù)4k的頁框相聯(lián)系(映射)呢?有了mem_map數(shù)組,
這個問題就很簡單了。因為如果知道了page數(shù)據(jù)的地址pd,用pd去減去mem_map就得到了pd的頁框號pfn。

可是我對這個有疑問:
比如我的內(nèi)存是1M,那么1M的內(nèi)存可以分為1M/4k=256個頁面,也就是說mem_map的最大下標是255,
每個頁面需要32個字節(jié)的描述符,那么256個頁面需要32*256個字節(jié),也就是需要32*256/4k=2個頁面,
即前面8k的內(nèi)存是描述符,也就是存放mem_map的內(nèi)容,即mem_map的地址是0,那么從第三個頁面
可是存放數(shù)據(jù),那么第三個頁面的地址-mem_map的地址應(yīng)該是8*1024,這個怎么可能是mem_map
的下標呢?
請問我這樣理解有什么問題嗎

論壇徽章:
0
4 [報告]
發(fā)表于 2013-10-27 10:53 |只看該作者
為什么書上說mem_map的起始地址一定是0xC1000000,可是我得出卻是0?

論壇徽章:
3
雙魚座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亞洲杯之澳大利亞
日期:2015-04-20 00:28:02
5 [報告]
發(fā)表于 2013-10-27 14:03 |只看該作者
回復(fù) 3# netdoger

   這是單一節(jié)點且flat memory model時, 通過pfn查找相應(yīng)的page descriptor的函數(shù).
  
   struct page *mem_map;

  #define __pfn_to_page(pfn)      (mem_map + ((pfn) - ARCH_PFN_OFFSET))  // ARCH_PFN_OFFSET 如果沒有特別配置,一般為0.

  你指的第三個page frame的page desciptor, 是從mem_map指向的內(nèi)存移動了2*sizeof(struct page) 字節(jié) 不就等于  mem_map + 2。

   為什么書上說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ù)負責申請mem_map的內(nèi)存.
這里提到:
   #ifdef CONFIG_FLAT_NODE_MEM_MAP
           ...
         map = alloc_remap(pgdat->node_id,  size);
         if (!map)
              map = alloc_bootmem_node();              // 申請分配mem_map的內(nèi)存
         pgdat-> node_mem_map = map + (pgdat-> node_start_pfn - start);
#ifndef CONFIG_NEED_MULITPLE_NODES
          if (pgdat == NODE_DATA[0])){             //如果是第一個節(jié)點
                   mem_map = NODE_DATA[0]->node_mem_map;         
            .....
        }
    ...
#endif
#endif


從上面兩個函數(shù)來看,都使用了條件宏. 說明mem_map不僅和內(nèi)存模型有關(guān), 而且和內(nèi)存節(jié)點有關(guān).
因此, 在某些架構(gòu)中, mem_map不一定被賦值.

我個人覺得, 最好通過隱藏了底部細節(jié)的NODE_DATA(節(jié)點描述符數(shù)組)來獲得mem_map的起始地址:
NODE_DATA[0]->node_mem_map.  

另外你可以通過dmesg  | grep -e 'node_mem_map'來獲得 'mem_map'的地址.

論壇徽章:
0
6 [報告]
發(fā)表于 2013-10-27 16:43 |只看該作者
雖然我看得不是很明白,但是我還是要說:你牛!

論壇徽章:
0
7 [報告]
發(fā)表于 2013-10-27 16:46 |只看該作者
dmesg  | grep -e 'node_mem_map',我這樣不行,沒有。還能怎么樣看到'node_mem_map'這個地址?
可能我裝載模塊時,有執(zhí)行dmesg -c,把它清掉了

論壇徽章:
3
雙魚座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亞洲杯之澳大利亞
日期:2015-04-20 00:28:02
8 [報告]
發(fā)表于 2013-10-27 21:39 |只看該作者
回復(fù) 7# netdoger


    這個是在內(nèi)核啟動時, 打印的mem_map的地址.. 調(diào)用函數(shù)是free_area_init_node()。在系統(tǒng)啟動時間 不到1s時 打印.
   
    如果系統(tǒng)長時間運行, dmesg會丟失之前記錄的

     
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP