typedef struct { pgdval_t pgd; } pgd_t; typedef struct pgprot {pgprotval_t pgprot; } pgprot_t; pgprot_t是一个unsigned long的数据类型,它表示与一个单独表项相关的保护标志,用来存储pte的保护位,一般用来与pte低12位进行比较和设置其值。 // linux-3.10.1/arch/x86/include/asm/pgtable_64_types...
进程的pgd_t数据见 task_struct -> mm_struct -> pgd_t * pgd; PTEs, PMDs和PGDs分别由pte_t, pmd_t 和pgd_t来描述。为了存储保护位,pgprot_t被定义,它拥有相关的flags并经常被存储在page table entry低位(lower bits),其具体的存储方式依赖于CPU架构。 前面我们讲了页表处理的大多数函数信息,在上面我们...
(1)使用remap_pfn_range一次建立所有页表。 int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn, unsigned long size, pgprot_t prot); /** * remap_pfn_range - remap kernel memory to userspace * @vma: user vma to map to:内核找到的虚拟地址区间 * @addr:...
*/unsigned long rb_subtree_gap;/* Second cache line starts here. 第二个缓存行从这里开始*/struct mm_struct*vm_mm;/* 我们所属的address space*/pgprot_t vm_page_prot;/* 此VMA的访问权限 */unsigned long vm_flags;/* Flags, see mm.h. *//* 对于具有地址空间(address apace)和后备存储(back...
只讨论32位系统情况,64位情况通过pgprot_t保护 pte_t,pmd_t,pud_t,pgd_t分别描述页表项,页中间目录项,页上级目录和页全局目录项的格式: 94 #ifdef CONFIG_64BIT_PHYS_ADDR 95 #ifdef CONFIG_CPU_MIPS32 96 typedef struct { unsigned long pte_low, pte_high; } pte_t; 97 #define pte_val(x) (...
pteval_t prot_pte;---PTE属性pteval_t prot_pte_s2;---定义CONFIG_ARM_LPAE才有效pmdval_t prot_l1;---PMD属性pmdval_t prot_sect;---Section类型映射unsignedintdomain;---定义ARM中不同的域}; arch\arm\mm\mmu.c:staticstructmem_typemem_types[] ={......
unsigned long size, pgprot_t prot); 1. 2. 3. 4. 当尝试将I/O内存映射到用户空间时,不需要使用 ioremap()。ioremap()用于内核目的映射(将I/O内存映射到内核地址空间),而 io_remap_pfn_range 用于用户空间目的。 只需将实际的物理I/O地址(通过PAGE_SHIFT向下移动以产生PFN)直接传递给io_remap_pfn_rang...
pgprot_t prot; int need_safe_pages = 0; swapper_pg_dir = alloc_bootmem_low_pages(PAGE_SIZE); memcpy(swapper_pg_dir, pg0, PAGE_SIZE); boot_cpu_data.pgd = swapper_pg_dir; prot = __pgprot(pgprot_val(PAGE_KERNEL)); pmd_init(need_safe_pages, _ktext, __pa(_ktext), __pa(_...
static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot) { phys_addr_t pfn = (phys_addr_t)page_nr << PAGE_SHIFT; pfn ^= protnone_mask(pgprot_val(pgprot)); pfn &= PTE_PFN_MASK; return __pte(pfn | check_pgprot(pgprot)); ...
int remap_page_range(vma_area_struct *vma, unsigned long from, unsigned long to, unsigned long size, pgprot_tprot); 1. 使用mmap最典型的例子是显示卡的驱动,将显存空间直接从内核映射到用户空间将可提供显存的读写效率。 (在内核驱动程序的初始化阶段,通过ioremap()将物理地址映射到内核虚拟空间;在驱动...