*参照元 [#e168cb7d] #backlinks *説明 [#def4a777] -パス: 複数あり --WANT_PAGE_VIRTUAL 有効: [[linux-4.4.1/include/linux/mm.h]] --WANT_PAGE_VIRTUAL 無効、CONFIG_HIGHMEM 無効: [[linux-4.4.1/include/linux/mm.h]] --WANT_PAGE_VIRTUAL 無効、CONFIG_HIGHMEM 有効: [[linux-4.4.1/mm/highmem.c]] -FIXME: これは何? --説明 -WANT_PAGE_VIRTUAL はアーキテクチャ依存の値で、定義されているのは下記 3つのみ。 --arc --m68k --sparc -HASHED_PAGE_VIRTUAL は CONFIG_HIGHMEM 有効、WANT_PAGE_VIRTUAL 無効のときに有効 -要するに、下記の 3パターンがあるってことです。 --WANT_PAGE_VIRTUAL 有効 --WANT_PAGE_VIRTUAL 無効、CONFIG_HIGHMEM 無効 --WANT_PAGE_VIRTUAL 無効、CONFIG_HIGHMEM 有効 **引数 [#x389acd0] -const struct page *page -- --[[linux-4.4.1/page]] **返り値 [#ib3b1951] -void * -- **参考 [#sc75c2fd] *実装 [#w5daec85] **WANT_PAGE_VIRTUAL 有効: include/linux/mm.h [#j7bfc510] -特殊ケース。CONFIG_HIGHMEM は無視されて、下記の実装が選択される。 #if defined(WANT_PAGE_VIRTUAL) static inline void *page_address(const struct page *page) { return page->virtual; } ... **WANT_PAGE_VIRTUAL 無効、CONFIG_HIGHMEM 無効: include/linux/mm.h [#l9ce5881] #if !defined(HASHED_PAGE_VIRTUAL) && !defined(WANT_PAGE_VIRTUAL) #define page_address(page) lowmem_page_address(page) ... - --[[linux-4.4.1/lowmem_page_address()]] **WANT_PAGE_VIRTUAL 無効、CONFIG_HIGHMEM 有効: mm/highmem.c [#q95dd008] /** * page_address - get the mapped virtual address of a page * @page: &struct page to get the virtual address of * * Returns the page's virtual address. */ void *page_address(const struct page *page) { unsigned long flags; void *ret; struct page_address_slot *pas; - --[[linux-4.4.1/page_address_slot()]] if (!PageHighMem(page)) return lowmem_page_address(page); - --[[linux-4.4.1/PageHighMem()]] --[[linux-4.4.1/lowmem_page_address()]] pas = page_slot(page); ret = NULL; spin_lock_irqsave(&pas->lock, flags); - --[[linux-4.4.1/page_slot()]] --[[linux-4.4.1/spin_lock_irqsave()]] if (!list_empty(&pas->lh)) { - --[[linux-4.4.1/list_empty()]] struct page_address_map *pam; - --[[linux-4.4.1/page_address_map]] list_for_each_entry(pam, &pas->lh, list) { if (pam->page == page) { ret = pam->virtual; goto done; } } - --[[linux-4.4.1/list_for_each_entry()]] } done: spin_unlock_irqrestore(&pas->lock, flags); return ret; - --[[linux-4.4.1/spin_unlock_irqrestore()]] } EXPORT_SYMBOL(page_address); - --[[linux-4.4.1/EXPORT_SYMBOL()]] *コメント [#r72c3d1b]