Kobject是linux设备驱动模型的基础,也是设备模型中抽象的一部分。如果想了解设备驱动模型就需要明白Kobject的构成或原理。...linux内核为了兼容各种形形色色的设备,就需要对各种设备的共性进行抽象,抽象出一个基类,其余的设备只需要继承此基类就可以了。...#include #include #include #include #include ...#include #include #include #include
鉴于性能的考虑,系统软件的实现(例如linux kernel)并没有采用面向对象的语言(如C++、Java)。但这丝毫没有影响到用小c找对象。 简单来说,一个对象包含数据以及对这些数据的操作。...kobject是Linux设备驱动模型的核心部分,它的作用是简单点说就是嵌入到设备和驱动相关的结构体之中。既可以将这些设备和驱动组织成树形结构,又可以让用户通过sysfs直接控制驱动和设备。...不管这个理论对不对,我们先看看kobject的家乡——include/linux/kobject.h,kobject在这里定义: struct kobject { const char *name...* Wang Sen (C) * 2012.3.23 */ #include #include #include #include #include #include <linux/
#include #include #include #include #include #include #include static struct kobject kobj;...[ 129.452907] c7 kobject: kobject_test_exit!...kobject_put kobject_release kobject_cleanup /* * kobject_cleanup - free kobject resources...static void kobject_test_exit(void) { printk(KERN_EMERG "kobject: kobject_test_exit!
我们知道,在Unix/Linux系统中“一切皆文件”,socket也被认为是一种文件,socket被表示成文件描述符。 但socket的行为并不很像文件。...我们便有机会在熟悉的Linux系统实现憧憬中的socket文件机制了。 “一切皆文件”之Linux Linux贯彻一切皆文件的程度要远远超过传统Unix。.../sysudp.ko #include #include #include #include #include static struct kobject *udp_kobject, *srv; static char ctrl, cctrl, data...= kobject_create_and_add("kobject_udp", NULL); if(!
通过上一节Linux设备驱动字符设备(一)了解了Linux设备驱动的分类,设备号的构成,设备号的申请以及设备号的释放。 在Linux内核中使用struct cdev结构来代码字符设备。... -------------------------------------------------- struct cdev { struct kobject...struct kobject kobj 内核的内嵌对象,是Linux设备驱动模型的重要成员。...该部分在后面Linux字符设备框架一节会详细分析,目前只要明白主要流程即可。 字符设备的注销 当驱动程序需要从系统卸载的时候,就需要使用cdev_del释放字符设备占用的内存。.... */ void cdev_del(struct cdev *p) { cdev_unmap(p->dev, p->count); kobject_put(&p->kobj); }
1.基本的LKM的编写 下面是一个最基本的LKM的实现,接下来我会对这个例子进行讲解 /*lkm.c*/ #include #include <linux/...这个问题也很好解决,在初始化函数中添加一行代码即可解决问题: kobject_del(&THIS_MODULE->mkobj.kobj); THIS_MODULE在include/linux/module.h...{ struct kobject kobj; struct module *mod; }; 其中kobj是一个struct kobject结构体,而kobject是组成设备模型的基本结构...sysfs与kobject层次紧密相连,它将kobject层次关系表现出来,使得用户空间可以看见这些层次关系。...我们通过kobject_del()函数删除我们当前模块的kobject就可以起到在/sys/module中隐藏lkm的作用。
前言 当多个kobject属于同一类的时候,为了方便管理,就引入了Kset。Kset可以认为是一组kobject的集合,是kobject的容器。 比如/sys/bus下就属于同一类kobject。...coresight cpu event_source hid i2c iio mdio_bus mmc platform scsi sdio serio spi usb virtio workqueue 数据结构 linux...当其中的kobject对象的状态发生变化需要通知用户空间的时候,就需要调用uevent_ops中的函数。...(&k->kobj); //将kset->kobject对象添加到sys下,此过程和添加kobject操作一样。...static struct module_kobject * __init locate_module_kobject(const char *name) { struct module_kobject
[导读] Linux设备林林总总,嵌入式开发一个绕不开的话题就是设备驱动开发,在做具体设备驱动开发之前,有必要对Linux设驱动模型有一个相对清晰的认识,将会帮助驱动开发,明白具体驱动接口操作符相应都做些什么...注:代码分析基于linux-5.4.31 为啥要驱动模型 随着系统结构演化越来越复杂,Linux内核对设备描述衍生出一般性的抽象描述,形成一个分层体系结构,从而引入了设备驱动模型。.../include/linux/Kobject.h中定义了隐藏在后台的类似于基类的数据结构: kset:可以认为是kobject的顶层容器类。...每个kset内部都包含了自己的kobject. kobject:在 sysfs 中出现的每个对象都对应一个 kobject, 它和内核交互来创建它的可见表述,每一个 kobject 对应 文件系统 /sys...比如所有的网络接口都位于/sys/class/net下 struct subsys_private *p描述类链表 kobject/kset kobject类似于面向对象中的内核基类,内核利用它将各个对象连接起来组成分层的机构体系
Linux系统对uevent机制的具体实现是建立在设备模型的基础上的,通过kobject_uevent函数实现。 在前面的kset小节中提到了注册一个kset的接口,可以在这里习复下。...kobject_uevent(&k->kobj, KOBJ_ADD); return 0; } 可以看到这里调用了kobject_uevent接口,发送一个action为: KOBJ_ADD的事件。...而kobject和kset的主要区别就是,将一个kset注册到系统的时候,就需要将此事件通过kobject_uevent发送到用户空间,而kobject如果是单独的,没有依赖kset,则无法通过uevent...with success or the * corresponding error when it fails. */ int kobject_uevent(struct kobject *kobj...struct kobject *kobj, enum kobject_action action, char *envp_ext[]) { struct kobj_uevent_env
Udev是一个针对Linux内核2.6的可提供自动创建的设备节点和命名的解决方法的一个文件系统;其实与/etc/目录下的fstab文件类似 二、Udev如何获取内核这些模块的变化信息?...新的Linux内核使用udev代替了hotplug作为热拔插管理,虽然有udevd管理热拔插,但有时候我们还是需要在应用程序中检测热拔插事件以便快速地处理,比如在读写SD卡的时候拔下SD卡,那么需要立即检测出该情况..., 1, NULL, NULL, THIS_MODULE); 当有事件发生的时候,调用 kobject_uevent()函数,实际上最终是调用 netlink_broadcast_filtered(uevent_sock...types.h> 7 //该头文件需要放在netlink.h前面防止编译出现__kernel_sa_family未定义 8 #include 9 #include <linux...接着就绑定该文件描述符到sockadd_nl,注意该结构体nl_groups是接收掩码,取~0是将接收所有来自内核的消息,我们接收热拔插只需要NETLINK_KOBJECT_UEVENT即可。
前言 Linux将所有的设备统一抽象为struct device结构, 同时将所有的驱动统一抽象为struct device_driver结构。...数据结构 Linux将所有的设备统一抽象为struct device结构。...定义在 struct device { struct device *parent; struct device_private *p; struct kobject...put_device(parent); } 设备属性 linux中使用device_attribute结构体表示一个设备的属性 struct device_attribute { struct attribute...struct sysfs_ops dev_sysfs_ops = { .show = dev_attr_show, .store = dev_attr_store, }; 设备类型 在include/linux
第一种: 1、添加关键头文件: #include #include #include #include... #include #include 2、在已经存在驱动文件中搜索”DEVICE_ATTR”关键字,.../of_gpio.h> #include #include #include #include #include 2、定义全局变量和定义打开和关闭的接口并组织属性数组: // add zhaojr gpio63 for close or speaker...pa enable struct kobject *spk_pa_kobj = NULL; unsigned int gpio63_spk_pa_gpio; //for speaker pa ic enable
第二个层次是为什么要用copy_from_user而不是直接memcpy 为什么要拷贝 拷贝这个事情是必须的,这个事情甚至都跟Linux都没有什么关系。...比如Linux有个kobject结构体,kobject结构体里面有个name指针: struct kobject { const char *name; struct list_head...*sd; /* sysfs directory entry */ struct kref kref; ... }; 但我们设置一个设备的名字的时候,其实就是设置device的kobject...name,比如: dev_set_name(&chan->dev->device, "dma%dchan%d", device->dev_id, chan->chan_id); 但是Linux...所以你看内核真实的代码,是给kobject的name重新申请一份内存,然后把dev_set_name()传给它的name拷贝进来: int kobject_set_name_vargs(struct kobject
如果vold.fstab解析无误,VolueManager将创建DirectVolume,若vold.fstab解析不存在或者打开失败,Vold将会读取Linux内核中的参数,此时如果参数中存在SDCARD...而Volume类中的相关操作最终通过调用Linux函数完成。 五、Vold用户态 1....发送消息给用户空间 3.1 发送消息流程图 3.2 kobject_uevent_env /** * kobject_uevent_env - send an uevent with environmental... with success or the * corresponding error when it fails. */ int kobject_uevent_env(struct kobject... the * corresponding error when it fails. */ int kobject_uevent(struct kobject *kobj, enum kobject_action
Android供电系统框架 power supply(以下简称psy)是Linux中从供电驱动抽象出来的子系统,是Linux电源管理的重要组成部分。...power supply子系统简介 概述 psy子系统的基础是建立在设备驱动模型之上的,主要运用了其中的class、device、kobject、sysfs、uevent相关知识,也是驱动设备模型的一个具体应用...相关结构体 psy相关的定义在/include/linux/power_supply.h。...跟踪这一调用流程可以在驱动中实现的get_property函数增加调用栈打印: 可以看到,在kobject_uevent_env函数中调用对应kset的uevent,会去遍历每一个属性节点(dev_uevent...值得注意的是,使用uevent-netlink机制传递的字符串并不会包含psy属性节点的kobject_uevent_env键值对状态。
前言 在linux设备驱动模型中,总线可以看作是linux设备模型的核心,系统中的其他设备以及驱动都是以总线为核心围绕。不过驱动程序员在系统中创建一条总线的机会并不多。...为此linux设备驱动模型都将围绕"总线--设备--驱动"来展开,因为符合linux设备驱动模型的设备与驱动都是必须挂载在一个总线上的,无论是实际存在的或者虚拟的。...static int bus_uevent_filter(struct kset *kset, struct kobject *kobj) { struct kobj_type *ktype = get_ktype...*virtual_device_parent(struct device *dev) { static struct kobject *virtual_dir = NULL; if (!...virtual_dir) virtual_dir = kobject_create_and_add("virtual", &devices_kset->kobj); return
power supply(以下简称psy)是Linux中从供电驱动抽象出来的子系统,是Linux电源管理的重要组成部分。...概述 psy子系统的基础是建立在设备驱动模型之上的,主要运用了其中的class、device、kobject、sysfs、uevent相关知识,也是驱动设备模型的一个具体应用。...相关结构体 psy相关的定义在/include/linux/power_supply.h。 ?...机制),其中广播的字符串保存在sk_buff->data中,这一字符串以“action_string@devpath”进行拼接,其中action为kobject_action,而devpath则为该psy...值得注意的是,使用uevent-netlink机制传递的字符串并不会包含psy属性节点的kobject_uevent_env键值对状态。
以下代码源于linux3.1.9。 platform_driver_register( ) 是内核中非常著名的函数 。...kobject_uevent(&priv->kobj, KOBJ_ADD); //发送uevent消息 return 0; 。。。...dev->driver = drv; if (driver_sysfs_add(dev)) { //在sysfs中添加设备的Kobject目录和熟悉文件
实际项目过程中应用层需要操作内核中GPIO, 除了应用层直接通过export方式操作,具体操作方法[Linux驱动炼成记] 02-用户空间控制GPIO, 还可以通过sysfs设备节点方式操作...sysfs 始终与 kobject 的底层结构紧密相关。请阅读Documentation/kobject.txt 文档以获得更多关于 kobject 接口的信息。
领取专属 10元无门槛券
手把手带您无忧上云