先来看一下哪些页不能不回收,首先内核中的页绝大多数都不能别回收,linux除了它的核心代码之外还有module模块,当module被加载之后除了可以被卸载,只能使用部分export的api之外,它得到的待遇和core中的代码是相同的,总之对于加载成功的module是完全信任的。而内核空间是所有进程公用的,内核中使用的页通常是伴随整个系统运...
模块在加载时,内核会调用module_alloc()来申请足够的内存来存放模块内容。module_alloc有2处定义: kernel/module.c: 定义一个弱符号module_alloc(),若arch下没有定义强符号,就使用它,实际基本没什么用 void*__weakmodule_alloc(unsignedlongsize){returnvmalloc_exec(size);} ...
int migratetype, unsigned int alloc_flags) { struct page *page; /* 删除部分 CMA相关的 */ retry: /* *上面分配失败,那么就调用__rmqueue_fallback尝试从 其他类型的链表分配(MIGRATE_MOVABLE例外): *(1)若指定的迁移类型是MIGRATE_MOVABLE,先调用 __rmqueue_smallest 直接快速在MIGRATE_CMA类型列表...
layout_sections(mod, hdr, sechdrs, secstrings);//节的从新布局,合并所有带有SHF_ALLOC标记的节,并计算每个节的大小和偏移量,包括计算初始化代码和核心代码的空间大小ptr = module_alloc(mod->core_size);//为模块代码分配动态内存… memset(ptr,0, mod->core_size); mod->module_core =ptr; ptr= modul...
比如在VMware guest上有一个常见问题,就是VMWare ESX宿主机会通过guest上的Balloon driver(vmware_balloon module)占用guest的内存,有时占用得太多会导致guest无内存可用,这时去检查guest的/proc/meminfo只看见MemFree很少、但看不出内存的去向,原因就是Balloon driver通过alloc_pages分配内存,没有在/proc/meminfo中留下...
使用vmalloc 函数的一个例子函数是create_module()系统调用,它利用 vmalloc()函数来获取被创建模块需要的内存空间。 内存分配是一项要求严格的任务,无论什么时候,都应该对返回值进行检测。 在驱动编程中可以使用copy_from_user()对内存进行使用。下面举一个使用vmalloc函数的示例: ...
#include<linux/module.h> #include<linux/kdev_t.h> #include<linux/fs.h> #include<linux/cdev.h> staticintmajor =237; staticintminor =0; staticdev_tdevno; staticstructcdevcdev; staticinthello_open(struct inode *inode, struct file *filep) ...
int alloc_chrdev_region(dev_t *dev ,unsigned baseminor,unsigned count,const char *name);//用于设备号未知 void unregister_chrdev_region(dev_t from,unsigned count);//卸载 file_operations结构体 struct file_operation{ struct module *owner;//拥有该模块的指针,一般为this module ...
owner = THIS_MODULE, }, }; static struct platform_device *regulator_pdev; static int my_regulator_test_init(void) { int ret; regulator_pdev = platform_device_alloc("my_regulator", -1); if (!regulator_pdev) { pr_err("Failed to allocate dummy regulator device\n"); return -1; }...
unsigned long node_start_pfn;// 起始物理页号unsigned long node_present_pages;// 物理页总数(不包括空洞)unsigned long node_spanned_pages;// 物理页总数(包括空洞)int node_id;// 节点标识符wait_queue_head_t kswapd_wait;wait_queue_head_t pfmemalloc_wait;struct task_struct*kswapd;/* Protected...