記憶體相關的巨集

2022-07-17 11:21:10 字數 3000 閱讀 2407

#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...