IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux内核源码分析之slab(四) -> 正文阅读

[系统运维]linux内核源码分析之slab(四)

目录

概述

实验

解析??


概述

????????创建slab缓存,分配对象的实例,kmem_cache_create( )函数创建一个slab新缓存

struct kmem_cache * kmem_cache_create (const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void *))
  • name:缓存名称,proc文件系统(在/proc/slabinfo中)标识一个缓存。
  • size:缓存创建的对象的大小,它是以字节为单位。
  • align:每个对象的对齐方式。
  • flags:分配缓存时的选项;
  • ctor:一个可选的对象构造器,构造器是用户提供的回调函数。当从缓存中分配新对象时,可以通过构造器进行初始化。

实验

????????为studentA分配内存空间,先创建缓存cache,再分配obj。通过命令行查看slab对应的信息

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

static struct kmem_cache* slab_test;
struct student{
    int age;
    int score;
};
struct student* studentA;
static int num=0;

static void mystruct_constructor(void *addr)
{
    memset(addr, 0, sizeof(struct student));
    printk(KERN_DEBUG"alloc mem cache num=%d\n",num++);
}
int slab_test_create_kmem(void)
{
    int ret = -1;
    //alloc cache
    slab_test = kmem_cache_create("slab_test", sizeof(struct student), 0, 0, mystruct_constructor);
    if(slab_test != NULL){
        printk("slub_test create success!\n");
        ret=0;
    }
    //alloc obj
    studentA = kmem_cache_alloc(slab_test, GFP_KERNEL);
    if(studentA != NULL){
        printk("alloc object success!\n");
        ret = 0;
    }
    return ret;
}

static int __init slab_test_init(void)
{
    int ret;
    printk("slab_test kernel module init\n");
    ret = slab_test_create_kmem();
    return 0;
}

static void __exit slab_test_exit(void)
{
    printk("slab_test kernel module exit\n");
    kmem_cache_destroy(slab_test);
}

MODULE_LICENSE("GPL");
module_init(slab_test_init);
module_exit(slab_test_exit);

首先编译模块,执行命令insmod slab.ko插入模块,然后执行命令dmesg?

dmesg 查看日志信息


[67668.244654] slab_test kernel module init
[67668.244689] slub_test create success!
[67668.244691] alloc mem cache num=0
[67668.244692] alloc mem cache num=1
[67668.244692] alloc mem cache num=2

...
[67668.244917] alloc mem cache num=253
[67668.244918] alloc mem cache num=254
[67668.244918] alloc mem cache num=255
[67668.244919] alloc object success!

解析??

?????????回调函数?mystruct_constructor被调用256次 ,这是因为当从缓存中分配新对象时就要调用一次。在下面分析中可以看到分配的obj数量。

综述:

  1. slab从buddy分配一个order为0的内存(一页),把这一页命名为slab_test,
  2. 把这一页分成很多小的object的,使用的时候就从slab中获取一个object
  3. 用完归还给slab管理。?

此外还可以通过/sys/kernel/slab/slab_test 查看属性

root@ubuntu:/sys/kernel/slab/slab_test# ls
aliases      cpu_partial     free_calls     object_size      partial          remote_node_defrag_ratio  slabs_cpu_partial  trace
align        cpu_slabs       hwcache_align  objects_partial  poison           sanity_checks             slab_size          usersize
alloc_calls  ctor            min_partial    objs_per_slab    reclaim_account  shrink                    store_user         validate
cache_dma    destroy_by_rcu  objects        order            red_zone         slabs                     total_objects

root@ubuntu:/sys/kernel/slab/slab_test# cat object_size 
8
root@ubuntu:/sys/kernel/slab/slab_test# cat slab_size 
16
root@ubuntu:/sys/kernel/slab/slab_test# cat objs_per_slab 
256
root@ubuntu:/sys/kernel/slab/slab_test# cat order 
0

参考

深入理解Linux slab分配器 - 知乎

Linux内核API kmem_cache_create|极客笔记

https://course.0voice.com/v1/course/intro?courseId=2&agentId=0


  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 10:14:48  更:2022-05-14 10:16:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/28 9:23:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码