if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY))) return ret; // 设置页表项,把虚拟页映射到文件的页缓存中的物理页 ret |= finish_fault(vmf); unlock_page(vmf->page); if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY))) put_page(v...
SetPageReadahead(page); //设置预读标记 put_page(page); } blk_finish_plug(&plug); lru_add_drain(); //将lru cache中的页刷到lru链表中去 skip: return read_swap_cache_async(entry, gfp_mask, vma, addr); //从交换缓存中获取一个页 } struct page *read_swap_cache_async(swp_entry_t entr...
中断描述符表内可以存放256个描述符,分别对应256个中断 --- 处理中断page fault page_falut中断程序执行肯定要进入内核,首先就是把用户栈相关寄存器状态压栈,也被称为保护现场 //在linux...若共享操作不成功,那么只能从相应文件中读入所缺的数据页面到指定线性地址处
后面的put_page()函数即用于把指定页面映射//到某个进程地址空间中。当然对于内核使用本函数并不需要再使用put_page()进行映射,//因为内核代码和数据空间(16MB)已经对等地映射到物理地址空间。unsignedlongget_free_page(void) { register unsignedlong__res asm("ax"); __asm__("std ; repne ; scasb\n\t...
通过page[0]~page[n-1]中flags、compound_head、compound_dtor成员的特殊串联关系,把这N个page结构体联系在了一起。这产生了一个混乱,很多时候,我们真正想操作的,其实只是compound page的整体,比如get_page、put_page、lock_page、unlock_page等。于是这样的API里面,广泛地存在这样的compound_head操作: ...
This uses the fact that _pg_dir=0 *///页目录表从0地址开始是先决条件if(page<LOW_MEM||page>=HIGH_MEMORY)printk("Trying to put page %p at %p\n",page,address);//物理地址是主内存地址?否则发出警告if(mem_map[(page-LOW_MEM)>>12]!=1)printk("mem_map disagrees with %p at %p\n",pag...
在汇编代码阶段的head.S文件中,负责创建映射关系的函数是create_page_tables。create_page_tables函数负责identity mapping和kernel image mapping。 identity map:是指把idmap_text区域的物理地址映射到相等的虚拟地址上,这种映射完成后,其虚拟地址等于物理地址。idmap_text区域都是一些打开MMU相关的代码。
free_page_t put_new_page:释放page钩子函数。 unsigned long private:私有数据 enum migrate_mode mode:迁移模式 int reason:迁移原因。 migrate_mode migrate_mode迁移模式主要有以下几个: MIGRATE_ASYNC //异步迁移,过程中不会发生阻塞。 MIGRATE_SYNC_LIGHT //轻度同步迁移,允许大部分的阻塞操作,唯独不允许脏页...
这样的compound page,可以透过内核统一的gc机制进行管理,比如在refcount即将归0的时候,put_page(compound page)可以整体释放compound page。 这显然和前面描述的THP/HugeTLB的情况是一样的,也存在一个在部分和整体两种语义中纠结的问题。 由于多个page构成了一个整体,这些page之间会有关联,我们需要某种方法解决如下的问...
page frame 为了描述一个物理page,内核使用struct page结构来表示一个物理页。假设一个page的大小是4K的,内核会将整个物理内存分割成一个一个4K大小的物理页,而4K大小物理页的区域我们称为page frame page frame num(pfn) pfn是对每个page frame的编号。故物理地址和pfn的关系是: ...