阅读背景:

《内核kernel:内存分配模块编写》

来源:互联网 

一、模块编写

#include <linux/module.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/vmalloc.h>

static int mem = 64;

#define MB (1024*1024)

static int __init my_init(void)
{
	char *kbuf;
	unsigned long order;
	unsigned long size;
	char *vm_buff;

	/* try __get_free_pages__ */
	for (size = PAGE_SIZE, order = 0; order < MAX_ORDER;
			order++, size *= 2) {
		pr_info(" order=%2lu, pages=%5lu, size=%8lu ", order,
			size / PAGE_SIZE, size);
		kbuf = (char *)__get_free_pages(GFP_ATOMIC, order);
		if (!kbuf) {
			pr_err("... __get_free_pages failed\n");
			break;
		}
		pr_info("... __get_free_pages OK\n");
		free_pages((unsigned long)kbuf, order);
	}

	/* try kmalloc */
	for (size = PAGE_SIZE, order = 0; order < MAX_ORDER;
			order++, size *= 2) {
		pr_info(" order=%2lu, pages=%5lu, size=%8lu ", order,
			size / PAGE_SIZE, size);
		kbuf = kmalloc((size_t) size, GFP_ATOMIC);
		if (!kbuf) {
			pr_err("... kmalloc failed\n");
			break;
		}
		pr_info("... kmalloc OK\n");
		kfree(kbuf);
	}

	/* try vmalloc */
	for (size = 4 * MB; size <= mem * MB; size += 4 * MB) {
		pr_info(" pages=%6lu, size=%8lu ", size / PAGE_SIZE, size / MB);
		vm_buff = vmalloc(size);
		if (!vm_buff) {
			pr_err("... vmalloc failed\n");
			break;
		}
		pr_info("... vmalloc OK\n");
		vfree(vm_buff);
	}

	return 0;
}

static void __exit my_exit(void)
{
	pr_info("Module exit\n");
}

module_init(my_init);
module_exit(my_exit);

MODULE_AUTHOR("HarkerYX");
MODULE_LICENSE("GPL v2");
#include <linux/module.h>
#include <linux



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: