ask*_*skb 3 memory-management linux-kernel
我编写了一个简单的内核模块,它使用slab层分配对象.该模块使用内核API(kmem_cache_{create,alloc,free}).我在3.15.4-200上工作的内核版本.
虽然,我的代码按预期工作没有任何问题,但我无法看到kmem_cache_create()在我使用时创建的新对象/ slab"my_cache" grep /proc/slabinfo.创建的对象是一个简单的对象列表,可以从列表中插入或删除.
注意:我的模块工作正常,没有问题.我可以查看板坯,创造下/sys/kernel/slab/my_cache,而不是在/proc/slabinfo或vmstat -m或slabtop
mycache = kmem_cache_create("my_cache",
sizeof(struct mystruct),
0, SLAB_HWCACHE_ALIGN, NULL);
if (mycache == NULL)
return -ENOMEM;
Run Code Online (Sandbox Code Playgroud)
`
$ sudo cat /sys/kernel/slab/my_cache/objects
49108 N0=49108
$ sudo cat /sys/kernel/slab/my_cache/object_size
64
$ sudo cat /sys/kernel/slab/my_cache/order
0
$ sudo cat /sys/kernel/slab/my_cache/aliases
12
$ sudo cat /sys/kernel/slab/my_cache/cache_dma
0
$ sudo cat /sys/kernel/slab/my_cache/slab_size
64
$ sudo cat /sys/kernel/slab/my_cache/trace
0
$ sudo cat /sys/kernel/slab/my_cache/validate
$ sudo cat /sys/kernel/slab/my_cache/total_objects
49920 N0=49920
Run Code Online (Sandbox Code Playgroud)
`
小智 8
kmem_cache_create通常会尝试将此缓存与其他缓存合并.因此,例如,如果它找到具有相同属性的相同大小的另一个缓存(slab将被中毒等),它将只使用此缓存而不是创建新缓存.
如果你真的想确保它肯定会为你创建一个新的缓存(=出现在slabinfo中),你总是可以将一个有效的构造函数传递给kmem_cache_create.像这样的东西:
static void mystruct_constructor(void *addr)
{
memset(addr, 0, sizeof(struct mystruct));
}
mycache = kmem_cache_create("my_cache",
sizeof(struct mystruct),
0, 0, mystruct_constructor);
Run Code Online (Sandbox Code Playgroud)
通常为此缓存中的每个对象分配调用构造函数.
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |