*参照元 [#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]