_count: 页的引用计数器。 值为-1,则页空间 大于-1则说明页框被分配给了一个或多个进程,或用于存放内核数据结构 page_count 函数返回_count + 1的值,为使用该页的使用者数量 内存管理区 linux 2.6.11 将内存划分为3个内存管理区域 ZONE_DMA 包含低于16MB的内存页框 ZONE_NORMAL 包含高于16MB且...
// 本质上是个双层 for 循环staticinlineunsignedlongmap_new_virtual(structpage *page){unsignedlongvaddr;intcount; start: count = LAST_PKMAP;// 至少一轮至少循环 LAST_PKMAP 次/* Find an empty entry */for(;;) {// 从上次查询的地方开始查询 last_pkmap_nr = (last_pkmap_nr + 1) & LAST_P...
union {#ifdefined(CONFIG_HAVE_CMPXCHG_DOUBLE) && \defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE)/*Used for cmpxchg_double in slub*/unsignedlongcounters;#else/** Keep _count separate from slub cmpxchg_double data. * As the rest of the double word is protected by * slab_lock but _count is not...
PagesCount=VirtualMemoryPageSizePagesCount=VirtualMemoryPageSize 因为目前的虚拟页大小为 4096 字节,所以虚拟地址末尾的 12 位可以表示虚拟页中的地址,如果虚拟页的大小降到了 512 字节,那么原本的四层页表结构或者五层页表结构会变成五层或者六层,这不仅会增加内存访问的额外开销,还会增加每个进程中页表项占用的内存大...
内核代码不应当直接检査该域,而是调用page_count()函数进行检査,该函数唯一的参数就是page结构。当页空闲时,尽管该结构内部的_count值是负的,但是对page_count()函数而言,返回0表示页空闲,返回一个正整数表示页在使用。一个页可以由页缓存使用(这时,mapping域指向和这个页关联的addresss_space对象),或者作为私有...
// 减去内存块所占用的内存页数// 把更大的内存块分裂为申请大小的内存块page=expand(zone,page,index,order,curr_order,area);spin_unlock_irqrestore(&zone->lock,flags);set_page_count(page,1);if(BAD_RANGE(zone,page))BUG();DEBUG_ADD_PAGEreturnpage;}// 如果在当前空闲链表中没有空闲的内存块, ...
* protected by managed_page_count_lock at runtime. Idealy only * adjust_managed_page_count() should be used instead of directly * touching zone->managed_pages and totalram_pages. */unsigned long managed_pages;unsigned long spanned_pages;/* 总页数,包含空洞 */unsigned long present_pages;/*...
页(page)是内核的内存管理基本单位。(linux/mm_types.h) struct page{unsigned long flags;// 页标志符struct address_space*mapping;// 该页所在地址空间描述符结构指针atomic_t _mapcount;// 页映射计数...}_struct_page_alignment; flags:页标志包含是不是脏的,是否被锁定等等,每一位单独表示一种状态,...
// 减去内存块所占用的内存页数// 把更大的内存块分裂为申请大小的内存块page=expand(zone,page,index,order,curr_order,area);spin_unlock_irqrestore(&zone->lock,flags);set_page_count(page,1);if(BAD_RANGE(zone,page))BUG();DEBUG_ADD_PAGEreturnpage;}// 如果在当前空闲链表中没有空闲的内存块, ...
引用计数,表示内核中引用该page的次数, 如果要操作该page, 引用计数会+1, 操作完成-1. 当该值为0时, 表示没有引用该page的位置,所以该page可以被解除映射,这往往在内存回收时是有用的 _mapcount 被页表映射的次数,也就是说该page同时被多少个进程共享。初始值为-1,如果只被一个进程的页表映射了,该值为0...