Linux Arch 符号 1 mem

arch_efi_call_virt
arch_efi_call_virt_setup
arch_efi_call_virt_teardown
efi_create_mapping
efi_set_mapping_permissions
KEXEC_DESTINATION_MEMORY_LIMIT
ELF_EXEC_PAGESIZE
KEXEC_CONTROL_PAGE_SIZE
ARCH_SLAB_MINALIGN
ARCH_HAS_SETUP_ADDITIONAL_PAGES
arch_setup_additional_pages
	vdso 相关
free_initmem
mem_init
copy_user_page
	#define copy_user_page(vto, vfrom, vaddr, topg) memcpy((vto), (vfrom), PAGE_SIZE)
memmove
memset
memcpy
// Hugetlb definitions.
HPAGE_SHIFT
HPAGE_SIZE
HUGETLB_PAGE_ORDER

ARCH_PFN_OFFSET
__early_set_fixmap
__set_fixmap
fixed_addresses
FIXADDR_START
FIXADDR_TOP
NR_FIX_BTMAPS
VMALLOC_END
VMALLOC_START
FIX_BTMAP_BEGIN
FIX_BTMAPS_SLOTS
FIXMAP_PAGE_IO
FIX_EARLYCON_MEM_BASE

switch_mm
__swp_entry
__swp_entry_to_pte
__swp_offset
__swp_type
TASK_UNMAPPED_BASE

VM_DATA_DEFAULT_FLAGS
ZERO_PAGE
	#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))

// arch/xxx/include/asm/memory.h
__pa
	#define __pa(x)     __virt_to_phys((unsigned long)(x))
__va
	#define __va(x)     ((void *)__pa_to_va_nodebug((phys_addr_t)(x)))


page_to_phys
	#define page_to_phys(page)  (pfn_to_phys(page_to_pfn(page)))
__pa_symbol
	#define __pa_symbol(x)  __phys_addr_symbol(RELOC_HIDE((unsigned long)(x), 0))

virt_addr_valid
virt_to_pfn
	#define virt_to_pfn(vaddr)  (phys_to_pfn(__pa(vaddr)))
virt_to_page
	#define virt_to_page(vaddr) (pfn_to_page(virt_to_pfn(vaddr)))


va <-> pa <-> pfn <-> page
 | <---------->|	
 
SECTION_SIZE_BITS
	#define SECTION_SIZE_BITS 28

// page 属性
// pgtable.h/pgtable-prot.h/pgtable.h
PAGE_KERNEL
PAGE_KERNEL_EXEC
PAGE_SHARED

// page 偏移 
// memory.h /page.h
PAGE_OFFSET
	arm32 :#define PAGE_OFFSET     UL(CONFIG_PAGE_OFFSET)
	arm64 :#define PAGE_OFFSET     (_PAGE_OFFSET(VA_BITS)) // #define VA_BITS         (CONFIG_ARM64_VA_BITS)
	rv64  :#define PAGE_OFFSET     kernel_map.page_offset 
// page 大小
// page.h pgtable-prot.h /page.h
PAGE_SHIFT
PAGE_SIZE
PAGE_MASK
PGDIR_MASK
PGDIR_SHIFT
PGDIR_SIZE

PMD_MASK
PMD_SHIFT
PMD_SIZE

---

PTRS_PER_PGD
PTRS_PER_PMD
PTRS_PER_PTE

// 等价于 pte_t 类 , 用来组 pte 的 值
__pgprot
pgprot_t
pgprot_val
pgtable_t

pgprot_t pgprot_val(type) __pgprot(uint) 
	页表项标志位 与 无符号 之间的转换
pte_t pte_val(type) __pte(uint)
	页表项 		与 无符号 之间的转换
  • VMA 的分解

对于一个五级页表寻址来说,VMA可以分解为如下
|PGDIR_SHIFT|P4D_SHIFT|PUD_SHIFT|PMD_SHIFT|PTE_SHIFT(PAGE_SHIFT)|OFFSET_IN_PAGE|
四级:
|PGDIR_SHIFT|PUD_SHIFT|PMD_SHIFT|PTE_SHIFT(PAGE_SHIFT)|OFFSET_IN_PAGE|
三级:
|PGDIR_SHIFT|PMD_SHIFT|PTE_SHIFT(PAGE_SHIFT)|OFFSET_IN_PAGE|
二级:
|PGDIR_SHIFT|PTE_SHIFT(PAGE_SHIFT)|OFFSET_IN_PAGE|
一级:
|PGDIR_SHIFT|OFFSET_IN_PAGE|

---
PAGE_SHIFT 一般为12 , 即 OFFSET_IN_PAGE 为 [11:0]
每一个 XXX_SHIFT 对应 一个 XXX_MASK XXX_SHIFT XXX_SIZE
  • 页表
5级页表寻址,对应 要存在 5种页表 和 一个物理页面,但是对应一个特定的虚拟地址,我们只关心 5个页表(每种一个) 和 一个物理页面
4级页表寻址,对应 要存在 4种页表 和 一个物理页面
...
1级页表寻址,1对应 要存在 1种页表 和 一个物理页面

// 对应5级页表寻址, 我们只关心 5个页表(每种一个) 和 一个物理页面
每个页表都有一些要素
	1. 名称(PGDT,P4DT,PUDT,PMDT,PT) // 该种页表有几个 TODO
	2. 基址
	3. 有多少个表项
	4. 一个表项(除了arm32-without-lpae为4字节,其他都是8字节)如何编码 
究其根本来说,只存在两种事物(地址和值)

  • 1 表示定义且为公共外部符号,2表示定义且不为公共外部符号
前后缀前后缀字符串类别pgdp4dpudpmdpte
suffix_t变量12211
suffix_alloc22222
prefix__xxx_free_tlb211
prefixset_改1(初始化)21122
suffix_populate改12111
suffix_populate_kernel改11
suffixp_establish改11
suffix_clear改2(清0)21111
prefixset_xxx_at改3(只初始pte)211
suffix_mkclean改4(改属性)221
suffix_mkdirty改4221
suffix_mkhuge改4211
suffix_mkinvalid改41
suffix_mkold改4221
suffix_mkspecial改421
suffix_mkwrite改4221
suffix_mkyoung改4221
suffix_val查1(查值)12211
suffix_none查2(查属性)21111
suffix_write查22211
suffix_present查221111
suffix_bad查22111
suffix_dirty查2211
suffix_leaf查22221
suffix_modify查221
suffix_special查21
suffix_trans_huge查21
suffix_wrprotect查2221
suffix_young查2211
prefix__xxx_to_swp_entry查221
suffix_page_vaddr查31
suffix_pgtable查3212
suffix_page查321111
suffix_pfn查322211
prefixmk_组111
prefix__组112111
prefixpfn_组122211
suffix_ERRORshow12212
---3
pgd_page(pgd_t) 获取pgd_t项关联的页描述符 ———— pud使用的页
pmd_page(pmd_t) 获取pmd_t项关联的页描述符 ———— pte使用的页
pte_pfn(pte_t) 获取pte_t项关联的页号,pmd、pud都有此函数
pgd_page_vaddr(pgd_t) 返回关联页的内核虚地址,pud、pmd都有此函数
pgd_pgtable 等同于 pgd_page_vaddr
---1
__pte(uint) 					将无符号值构造一个页表项
mk_pte(struct page*,pgprot_t) 	将页描述符对应的页号和页表权限标志作为参数创建一个pte值
pfn_pte(phy, prot)				使用 prot ( _PAGE_RW 等) 页权限将 phy 构造为一个 pte 项。



// arm64 和 rv64共有的部分
p4d_bad
p4d_clear
p4d_none
p4d_page
p4d_pgtable
p4d_populate
p4d_present
set_p4d

// arm32/arm64/rv64 共有的部分
mk_pmd
mk_pte
pfn_pmd
pfn_pte
__pgd
pgd_alloc
pgd_ERROR
pgd_t
pgd_val
__pmd
pmd_bad
pmd_clear
pmd_dirty
pmd_ERROR
__pmd_free_tlb
pmd_leaf
pmd_mkhuge
pmd_mkinvalid
pmd_none
pmd_page
pmd_page_vaddr
pmdp_establish
pmd_pfn
pmd_populate
pmd_populate_kernel
pmd_present
pmd_t
pmd_trans_huge
pmd_val
pmd_write
pmd_young
__pte
pte_clear
pte_dirty
__pte_free_tlb
pte_mkclean
pte_mkdirty
pte_mkhuge
pte_mkold
pte_mkspecial
pte_mkwrite
pte_mkyoung
pte_modify
pte_none
pte_page
pte_pfn
pte_present
pte_special
pte_t
__pte_to_swp_entry
pte_val
pte_write
pte_wrprotect
pte_young
pud_bad
pud_clear
pud_none
pud_page
pud_pgtable
pud_populate
pud_present
set_pmd_at
set_pte_at
set_pud


./${ARCH}/mm/pageattr.c      
set_memory_nx
set_memory_ro
set_memory_rw
set_memory_x


mark_rodata_ro
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值