#define page_shift 12 //頁偏移#define page_size (_ac(1,ul) << page_shift) //
頁大小#define page_mask (~((1 << page_shift) - 1)) //
取頁
還有page_offset,核心中通常為3g。
這幾個巨集把無符號整數轉換成對應的型別
#define __pte(x) ((pte_t) )#define __pmd(x) ((pmd_t) )
#define __pgd(x) ((pgd_t) )
#define __pgprot(x) ((pgprot_t) )
根據x把它轉換成對應的無符號整數
#define pte_val(x) ((x).pte_low)#define pmd_val(x) ((x).pmd)
#define pgd_val(x) ((x).pgd)
#define pgprot_val(x) ((x).pgprot)
與下乙個頁框對齊
#define page_align(addr) (((addr)+page_size-1)&page_mask)
把核心空間的線性位址轉換為實體地址
#define __pa(x) ((unsigned long)(x)-page_offset)
把實體地址轉化為線性位址
#define __va(x) ((void *)((unsigned long)(x)+page_offset))
把pfn頁框號轉化為核心線性位址, 然後左移12位, 得到對應的核心線性位址
#define pfn_to_kaddr(pfn) __va((pfn) << page_shift)
根據頁框號得到對應的物理頁描述符
#define pfn_to_page(pfn) (mem_map + (pfn))
根據物理描述符得到對應的頁框號
#define page_to_pfn(page) ((unsigned long)((page) - mem_map))
根據核心線性位址得到其對應的物理頁描述符
#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> page_shift)
清除乙個頁表項並返回前乙個值
#define ptep_get_and_clear(xp) __pte(xchg(&(xp)->pte_low, 0))
判斷乙個頁表項是否指向同一頁並且訪問優先順序相同
#define pte_same(a, b) ((a).pte_low == (b).pte_low)
x是頁表項值, 通過pte_pfn得到其對應的物理頁框號, 最後通過pfn_to_page得到對應的物理頁描述符
#define pte_page(x) pfn_to_page(pte_pfn(x))
如果對應的表項值為0, 返回1
#define pte_none(x) (!(x).pte_low)
x是頁表項值, 右移12位後得到其對應的物理頁框號
#define pte_pfn(x) ((unsigned long)(((x).pte_low >> page_shift)))
根據頁框號和頁表項的屬性值合併成乙個頁表項值
#define pfn_pte(pfn, prot) __pte(((pfn) << page_shift) | pgprot_val(prot))
根據頁框號和頁表項的屬性值合併成乙個中間表項值
#define pfn_pmd(pfn, prot) __pmd(((pfn) << page_shift) | pgprot_val(prot))
向乙個表項中寫入指定的值
#define set_pte(pteptr, pteval) (*(pteptr) = pteval)#define set_pte_atomic(pteptr, pteval) set_pte(pteptr,pteval)
#define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval)
#define set_pgd(pgdptr, pgdval) (*(pgdptr) = pgdval)
根據線性位址得到高10位值, 也就是在目錄表中的索引
#define pgd_index(address) (((address) >> pgdir_shift) & (ptrs_per_pgd-1))
根據mm和線性位址address得到目錄項值
#define pgd_offset(mm, address) ((mm)->pgd+pgd_index(address))
根據線性位址address提取在頁表中的索引
#define pte_index(address) \(((address) >> page_shift) & (ptrs_per_pte - 1))
根據頁描述符和屬性得到乙個頁表項值
#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
與記憶體管理相關的幾個巨集
這幾個巨集把無符號整數轉換成對應的型別 define pte x pte t define pmd x pmd t define pgd x pgd t define pgprot x pgprot t 根據x把它轉換成對應的無符號整數 define pte val x x pte low defi...
與記憶體管理相關的幾個巨集
這幾個巨集把無符號整數轉換成對應的型別 define pte x pte t define pmd x pmd t define pgd x pgd t define pgprot x pgprot t 根據x把它轉換成對應的無符號整數 define pte val x x pte low defi...
與記憶體管理相關的幾個巨集
from 這幾個巨集把無符號整數轉換成對應的型別 define pte x pte t define pmd x pmd t define pgd x pgd t define pgprot x pgprot t 根據x把它轉換成對應的無符號整數 define pte val x x pte low...