1 Star 0 Fork 1

solo-king/linuxKernelBaseUsage

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
alloc_memory_test.c 10.18 KB
一键复制 编辑 原始数据 按行查看 历史
flagstaffChen 提交于 3年前 . Add alloc_memory_test
#define pr_fmt(fmt) "allocMemoryTest:"fmt
#include <linux/module.h>
#include <linux/list.h>
#include <linux/slab.h>
#include <uapi/asm-generic/errno-base.h>
#include <asm/page-def.h>
#include <linux/mm.h>
#include <linux/vmalloc.h>
/*
board:/ # insmod /data/alloc_memory_test.ko
[11829.469158] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005eb58]flagstaff_obj_0
[11829.469172] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e2c0]flagstaff_obj_1
[11829.469180] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005eec8]flagstaff_obj_2
[11829.469185] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e210]flagstaff_obj_3
[11829.469190] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005eb00]flagstaff_obj_4
[11829.469195] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e160]flagstaff_obj_5
[11829.469201] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005edc0]flagstaff_obj_6
[11829.469207] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005ed10]flagstaff_obj_7
[11829.469213] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005ef78]flagstaff_obj_8
[11829.469219] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e790]flagstaff_obj_9
[11829.469224] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e528]flagstaff_obj_10
[11829.469231] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005ef20]flagstaff_obj_11
[11829.469238] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005ed68]flagstaff_obj_12
[11829.469244] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e7e8]flagstaff_obj_13
[11829.469250] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e948]flagstaff_obj_14
[11829.469255] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e108]flagstaff_obj_15
[11829.469261] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e0b0]flagstaff_obj_16
[11829.469266] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e840]flagstaff_obj_17
[11829.469271] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e478]flagstaff_obj_18
[11829.469277] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e1b8]flagstaff_obj_19
[11829.469282] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e000]flagstaff_obj_20
[11829.469288] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005ecb8]flagstaff_obj_21
[11829.469293] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e898]flagstaff_obj_22
[11829.469298] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005ee18]flagstaff_obj_23
[11829.469304] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005ec08]flagstaff_obj_24
[11829.469310] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e580]flagstaff_obj_25
[11829.469315] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e318]flagstaff_obj_26
[11829.469321] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e3c8]flagstaff_obj_27
[11829.469326] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e688]flagstaff_obj_28
[11829.469331] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005ebb0]flagstaff_obj_29
[11829.469336] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e9f8]flagstaff_obj_30
[11829.469342] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005ee70]flagstaff_obj_31
[11829.469350] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e9a0]flagstaff_obj_32
[11829.469358] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e6e0]flagstaff_obj_33
[11829.469365] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e5d8]flagstaff_obj_34
[11829.469369] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e268]flagstaff_obj_35
[11829.469375] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e630]flagstaff_obj_36
[11829.469381] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e058]flagstaff_obj_37
[11829.469386] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e420]flagstaff_obj_38
[11829.469391] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005eaa8]flagstaff_obj_39
[11829.469397] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e370]flagstaff_obj_40
[11829.469403] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e8f0]flagstaff_obj_41
[11829.469408] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e4d0]flagstaff_obj_42
[11829.469414] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005ec60]flagstaff_obj_43
[11829.469419] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005ea50]flagstaff_obj_44
[11829.469424] allocMemoryTest:flagstaff_kmem_alloc,100:The new flagstaff_mem is [0xffffff890005e738]flagstaff_obj_45
[11829.469431] allocMemoryTest:alloc_memory_test_drv_init,145:show_list:[0xffffff882dc48a80]flagstaffmem create by kmalloc
[11829.469436] allocMemoryTest:alloc_memory_test_drv_init,145:show_list:[0xffffff890005eb58]flagstaff_obj_0
[11829.469443] allocMemoryTest:alloc_memory_test_drv_init,163:This is a free mem from page which size is 4092, [PAGE_SIZE]4096.
[11829.469480] allocMemoryTest:alloc_memory_test_drv_init,173:[vfm->desc]This memory is from vmalloc.
board:/ # rmmod alloc_memory_test
[11832.689375] allocMemoryTest:alloc_memory_test_drv_exit,206:free:flagstaff_obj_0
*/
#define ALLOC_MEMORY_TEST_INFO_SHOW
#ifdef ALLOC_MEMORY_TEST_INFO_SHOW
#define ALLOC_MEMORY_TEST_INFO(fmt,...) \
do{\
pr_info( "%s,%d:"fmt"\n",__func__,__LINE__,##__VA_ARGS__);\
}while(0)
#else
#define ALLOC_MEMORY_TEST_INFO(fmt,...)
#endif
struct flagstaff_mem {
char desc[60];
struct list_head list;
};
static struct kmem_cache *kc;
static LIST_HEAD(flagstaff_mem_head);
struct my_page {
u8 mem[PAGE_SIZE - sizeof(int)];
int size;
};
static struct my_page *mp;
static struct flagstaff_mem *vfm = NULL;
static void flagstaff_kmem_alloc(void *data) {
static int alloc_count = 0;
struct flagstaff_mem *fmem = data;
if(IS_ERR_OR_NULL(fmem)) {
pr_err("flagstaff_kmem_alloc alloc new flagstaff_mem in failed.\n");
return;
}
sprintf(fmem->desc, "flagstaff_obj_%d", alloc_count++);
ALLOC_MEMORY_TEST_INFO("The new flagstaff_mem is [0x%llx]%s", (u64)fmem, fmem->desc);
}
static int __init alloc_memory_test_drv_init()
{
int count = 0;
struct page *tmp_page = NULL;
/*
1.kmalloc family
*/
struct flagstaff_mem *my_mem = kmalloc(sizeof(struct flagstaff_mem), GFP_KERNEL);
if(IS_ERR_OR_NULL(my_mem)) {
pr_err("alloc my_mem in failed.\n");
return -ENOMEM;
}
sprintf(my_mem->desc, "flagstaffmem create by kmalloc");
list_add_tail(&my_mem->list, &flagstaff_mem_head);
/*
2.kmem_cache_xxx
Note:
Slab will allocate the number of your struct more than your need.Like the following.
You only call kmem_cache_alloc once but constructor is called more than once to allocate
more your struct.This feature is why we name it to cache.
*/
kc = kmem_cache_create("flagstaff_mem",
sizeof(struct flagstaff_mem),
0,
SLAB_PANIC,
flagstaff_kmem_alloc);
if(IS_ERR_OR_NULL(kc)) {
pr_err("create cache infailed.\n");
return -ENOMEM;
}
#define FLAGSTAFF_MEM_COUNT_MAX 1
for(count = 0 ; count < FLAGSTAFF_MEM_COUNT_MAX; ++count) {
my_mem = kmem_cache_alloc(kc, GFP_KERNEL);
if(!IS_ERR_OR_NULL(my_mem)) {
list_add_tail(&my_mem->list, &flagstaff_mem_head);
}
}
list_for_each_entry(my_mem, &flagstaff_mem_head, list)
ALLOC_MEMORY_TEST_INFO("show_list:[0x%llx]%s", my_mem, my_mem->desc);
/*
3. gain memory by page
*/
tmp_page = alloc_page(GFP_KERNEL);
if(IS_ERR_OR_NULL(tmp_page)) {
pr_err("get one page failed.\n");
return -ENOMEM;
}
mp = page_address(tmp_page);
if(IS_ERR_OR_NULL(mp)) {
pr_err("get page address in failed.\n");
return -ENOMEM;
}
mp->size = PAGE_SIZE - sizeof(int);
sprintf(mp->mem, "This is a free mem from page which size is %d, [PAGE_SIZE]%d.", mp->size, PAGE_SIZE);
ALLOC_MEMORY_TEST_INFO("%s", mp->mem);
/*
4.get memory from vmalloc
*/
vfm = vmalloc(sizeof(struct flagstaff_mem));
if(IS_ERR_OR_NULL(vfm)) {
pr_err("get memory from vmalloc infailed.\n");
return -ENOMEM;
}
sprintf(vfm->desc, "This memory is from vmalloc.", vfm);
ALLOC_MEMORY_TEST_INFO("[vfm->desc]%s", vfm->desc);
return 0;
}
static void __exit alloc_memory_test_drv_exit()
{
struct flagstaff_mem *my_mem = NULL;
struct flagstaff_mem *my_mem_tmp = NULL;
/*
1.free the memory allocated by kmalloc
*/
my_mem = list_first_entry(&flagstaff_mem_head, struct flagstaff_mem, list);
if(IS_ERR_OR_NULL(my_mem)){
pr_err("my_mem is null\n");
}
list_del(&my_mem->list);
kfree(my_mem);
/*
2.free the memory allocated by kmem_cache_xx
*/
if(IS_ERR_OR_NULL(kc)){
pr_err("my_mem is null\n");
return;
}
list_for_each_entry_safe(my_mem, my_mem_tmp, &flagstaff_mem_head, list) {
if(IS_ERR_OR_NULL(my_mem)) {
pr_err("my_mem is null\n");
continue;
}
ALLOC_MEMORY_TEST_INFO("free:%s", my_mem->desc);
list_del(&my_mem->list);
kmem_cache_free(kc, my_mem);
}
kmem_cache_destroy(kc);
kc = NULL;
/*
3.free the memory from alloc_page
*/
if(!IS_ERR_OR_NULL(mp)){
free_page((unsigned long)mp);
mp = NULL;
}
/*
4.free the memory from vmalloc
*/
if(!IS_ERR_OR_NULL(vfm)){
vfree(vfm);
}
}
module_init(alloc_memory_test_drv_init);
module_exit(alloc_memory_test_drv_exit);
MODULE_AUTHOR("flagstaff Chen<flagstaff.chen@fake.com>");
MODULE_DESCRIPTION("test the API of allocting memory from kernel.");
MODULE_LICENSE("GPL v2");
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/solo-king/linux-kernel-base-usage.git
git@gitee.com:solo-king/linux-kernel-base-usage.git
solo-king
linux-kernel-base-usage
linuxKernelBaseUsage
master

搜索帮助