configfs mkdir和rmdir流程

mkdir and rmdir用途

	在configfs中,动态添加或删除某一功能时,可以通过mkdir和rmdir实现

调用流程

	当在config目录执行mkdir xxx时,configfs会调ct_group_ops->make_group(group, name),参数group为configfs_subsystem中的su_group, name为mkdir 的第一个参数。
	我们需要返回一个struct config_group类型的指针。

数据结构设计

struct test_info {
	struct config_group group;
	int attr1,
	char attr2[8];
};

这里之所以将struct config_group结构体的实体包在一个结构中,而不是使用指针是为了方便通过group成员拿到test_info的内存地址

mkdir实现

static struct config_group *testfs_make(struct config_group *group, const char *name)
{
	struct test_info *ti;
	ti = kzalloc(sizeof(*ti), GFP_KERNEL);
	if (!ti)
		return ERR_PTR(-ENOMEM);

	return &ti->group;
}
	添加以上代码便可在test目录中使用mkdir命令了。但是还有一个问题,这里分配了内存,
	但是没有地方释放掉,对于只添加功能,不删除功能好像并没有什么影响。考虑到功能的完整性
	还是需要添加的实现。

rmdir实现

	rmdir的实现,相较于mkdir就没有那简单了。
	通过mkdir创建出来的文件夹,它就是一个子元素,rmdir的操作就是操作这个子元素,所以要实现
	rmdir的操作,相当于就是给子元素添加相关的描述。
/*
	test_root_release函数中,使用了一个API to_config_group这个API的作用是通过
	item拿到group成员的指针,因为这里的item指针实际是struct config_group结构体
	中的su_item实体成员,to_config_group()也是一个container_of的封装函数
	返回group的指针后,再通过container_of就能拿到在test_make中分配的内存指针。
*/
static void test_root_release(struct config_item *item)
{
	struct test_info *ti = container_of(to_config_group(item), struct test_info, group);
	kfree(ti);
}
static struct config_item_operations test_root_ops = {
	.release = &test_root_release,
};

static struct configfs_attribute *test_root_attrs[] = {
	NULL,
};
static struct config_item_type test_root_type = {
	.ct_item_ops = &test_root_ops,
	.ct_attrs = test_root_attrs,
	.ct_owner = THIS_MODULE,
};
	添加上以上代码后,再在kzalloc后调用config_group_init_type_name。便实现了rmdir的支持。
	config_group_init_type_name(&ti->group, name, &test_root_type);

调用流程

	当从用户态调用rmdir之后,首先被调用的是drop_item(testfs_drop函数),在此函数中,我们
	并不能直接通过item参数拿到test_info的指针,并kfree掉,这里不能不是不能通过item拿到
	test_info的指针,而是不能直接kfree掉,因为在上一层的数据结构中还保存有相关的引用。
	这里应该调用config_item_put(item),调用这个函数后,configfs会去掉相关的引用,并调用
	item的release函数(test_root_release函数)这时才能kfree掉在make中分配的内存
在嵌入式Linux下,设备树(device tree)用来描述硬件平台的各种资源,Linux内核在启动过程中,会解析设备树,获取各种硬件资源来初始化硬件。设备树的overlay功能是指可以在系统运行期间动态修改设备树。一般情况下,如上图所示,设备树经过DTC编译器编译为二进制的hello.dtb文件,加载到内存,随Linux内核一起启动后,一般就无法更改了。如果我们想修改设备树,需要修改hello.dts文件文件,重新编译成二进制文件:hello.dtb,然后重新启动内核,重新解析。有了设备树的overlay功能,省去了设备树的重新编译和内核重启,我们可以直接编写一个设备树插件:overlay.dts,编译成overlay.dtbo后,直接给设备树“打补丁”,在运行期间就可以动态添加节点、修改节点...设备树的overlay功能,在很多场合都会用得到,会让我们的开发更加方便:外界插拔设备,无法在设备树中预先描述:耳机树莓派 + FPGA开发板基于I2C的温度传感器管脚的重新配置:PIN multiplexing修改bootcmd、分区...设备树的overlay功能,目前还没有加入到内核mainline(linux-5.10.x),但目前有些开发板和配套的BSP已经支持了,支持在系统运行期间动态修改设备树文件。如果你手头的开发板或内核平台还没有支持device tree overlay,可以学习本期课程,学习内核中设备树overlay的实现原理,如何给内核打补丁,使内核支持设备树的overlay功能。有了本期课程的学习基础,明白了设备树overlay的实现原理和运行机制,你就可以尝试在自己的开发板平台上实现这个功能了。本期课程的主要内容如下:在开发板上如何实现设备树的overlay功能Configfs文件系统的配置与挂载Configfs编程接口如何编写设备树 overlay插件设备树 overlay的编译和运行设备树overlay运行机制分析本期课程适合哪些人学习:嵌入式驱动工程师嵌入式BSP工程师嵌入式软件工程师想从事嵌入式开发的同学全网首家讲解设备树overlay的视频教程。   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值