*参照元 [#c13af72a]
#backlinks

*説明 [#ydeb446e]
-パス: [[linux-4.4.1/include/asm-generic/memory_model.h]]

-FIXME: これは何?
--指定したページフレーム番号に対応するページを取得する。


**引数 [#t5771aa2]
-unsigned long pfn
--ページフレーム番号


**返り値 [#l8323b01]
-struct page *
--ページ
--[[linux-4.4.1/page]]


**参考 [#h66e3d11]

-逆変換
--[[linux-4.4.1/__page_to_pfn()]]


*実装 [#j8925877]

**CONFIG_FLATMEM 有効 [#c2d0ee4a]
-
--[[linux-4.4.1/CONFIG_FLATMEM]]

 #define __pfn_to_page(pfn)      (mem_map + ((pfn) - ARCH_PFN_OFFSET))
-mem_map はメモリの先頭ページを指すポインタである。
--Linux ではページの構造体が配列のように並んでいるので、ポインタにページ番号を足せば、ページ番号に対応する構造体を得ることができる。
--ページ構造体の配列を pages[] という名前で説明すれば、
--ページ構造体の配列を仮に pages[] という名前だとすると、mem_map との関連は下記のようなイメージである。
 mem_map       => pages[0]
 mem_map + 1   => pages[1]
                  pages[...]
 mem_map + pfn => pages[pfn]
--mem_map + 1 は、1ページ目、mem_map + pfn は pfn ページ目のページ構造体を指す。
--[[linux-4.4.1/mem_map(global)]]
--[[linux-4.4.1/ARCH_PFN_OFFSET]]


**CONFIG_DISCONTIGMEM 有効 [#jba5c2ec]
-
--[[linux-4.4.1/CONFIG_DISCONTIGMEM]]

 #define __pfn_to_page(pfn)                      \
 ({      unsigned long __pfn = (pfn);            \
         unsigned long __nid = arch_pfn_to_nid(__pfn);  \
         NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\
-
--[[linux-4.4.1/arch_pfn_to_nid()]]
--[[linux-4.4.1/NODE_DATA()]]
--[[linux-4.4.1/arch_local_page_offset()]]

 })


**CONFIG_SPARSEMEM_VMEMMAP 有効 [#q218691f]
-
--[[linux-4.4.1/CONFIG_SPARSEMEM_VMEMMAP]]

 /* memmap is virtually contiguous.  */
 #define __pfn_to_page(pfn)      (vmemmap + (pfn))
-
--[[linux-4.4.1/vmemmap(global)]]


**CONFIG_SPARSEMEM 有効 [#h220b4ba]
-
--[[linux-4.4.1/CONFIG_SPARSEMEM]]

 #define __pfn_to_page(pfn)                              \
 ({      unsigned long __pfn = (pfn);                    \
         struct mem_section *__sec = __pfn_to_section(__pfn);    \
-
--[[linux-4.4.1/mem_section]]
--[[linux-4.4.1/__pfn_to_section()]]

         __section_mem_map_addr(__sec) + __pfn;          \
-
--[[linux-4.4.1/__section_mem_map_addr()]]

 })


*コメント [#db5d3743]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS