u64 id;structrb_noderb_node;/* keyed by ->id */structlist_headbdi_list;unsignedlongra_pages;/* max readahead in PAGE_SIZE units */unsignedlongio_pages;/* max allowed IO size */congested_fn *congested_fn;/* Function pointer if device is md/dm */void*congested_data;/* Pointer to ...
pgoff_t index是该页描述结构在地址空间radix树page_tree中的对象索引号即页号, 表示该页在vm_file中的偏移页数, 其类型pgoff_t被定义为unsigned long即一个机器字长. 代码语言:javascript 代码运行次数:0 运行 AI代码解释 /* * The type of an index into the pagecache. */ #define pgoff_t unsigned lon...
*/ static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, unsigned int flags) { struct vm_fault vmf = { .vma = vma, .address = address & PAGE_MASK, .flags = flags, .pgoff = linear_page_index(vma, address), .gfp_mask = __get_fault_gfp_mask(vma), ...
当引起缺页中断的虚拟内存地址 address 是在 TASK_SIZE_MAX 之上时,表示该缺页地址是属于内核空间的,内核的缺页处理程序 __do_page_fault 就要进入 do_kern_addr_fault 分支去处理内核空间的缺页中断。 当引起缺页中断的虚拟内存地址 address 是在 TASK_SIZE_MAX 之下时,表示该缺页地址是属于用户空间的,内核...
= mapping)) { unlock_page(page); put_page(page); goto retry_find; } VM_BUG_ON_PAGE(page_to_pgoff(page) != offset, page); // 页面缓存中有一个锁定的页面,检查它是否是最新的,如果不是则可能是出错 if (unlikely(!PageUptodate(page))) goto page_not_uptodate; // 流程到此,须放弃 mmap...
pgoff_t index; /* Our offset within mapping. 在映射的虚拟空间(vma_area)内的偏移; 一个文件可能只映射一部分,假设映射了1M的空间, index指的是在1M空间内的偏移,而不是在整个文件内的偏移。 */ void *freelist; /* sl[aou]b first free object */ ...
vma->vm_pgoff = pgoff; 如果是文件映射的话,内核还会额外做一项工作,就是将分配出来的这段虚拟内存区域 vma 与映射文件关联映射起来。 vma->vm_file = get_file(file); error = call_mmap(file, vma); 映射的核心就是将虚拟内存区域 vm_area_struct 相关的内存操作vma->vm_ops设置为文件系统的相关操作...
pgoff_t index:该字段是一个复用字段。当该页面被文件映射时,代表偏移量。为匿名映射时,保存的是页迁移类型migratetype(见set_pcppage_migratetype()函数)。 unsigned long private:私有数据 page_pool used by netstack 如果该页被用作DMA映射,dma_addr_t则代表的是映射的一个总线地址: ...
{ int error; // 获取映射文件 struct file *file = vmf->vma->vm_file; // 获取 page cache struct address_space *mapping = file->f_mapping; // 获取映射文件的 inode struct inode *inode = mapping->host; // 获取映射文件内容在文件中的偏移 pgoff_t offset = vmf->pgoff; // 从 page ...