设备模型数据结构简述

设备驱动主要由 :总线、设备驱动、设备 三部分构成;

设备驱动模型主要由 :Kset、Kobject、Ktype 三部分组成;
Kset 是同类型Kobject对象的集合,可以说是一个容器
Kobject 是总线 驱动 设备的是那种对象的一个基类,实现公共接口
Ktype 记录了Kobject的一些属性。

《总线、设备驱动、设备》 与 《Kset、Kobject、Ktype》之间的联系:
设备驱动的 《总线、设备驱动、设备》在内核中主要是以树状的形式存在的,

由各个节点组成;《Kset、Kobject、Ktype》就负责组成树状的模型,充当各个节点,组成驱动的框架,将《总线、设备驱动、设备》连接起来;

      《总线、设备驱动、设备》 是设备驱动的上层表现形式,《Kset、Kobject、Ktype》 是设备驱动的底层表现形式。



总线结构体简述
 struct bus_type {
const char *name;
struct bus_attribute *bus_attrs; /* 总线的属性 */
struct driver_attribute *drv_attrs; /* 驱动属性*/
struct device_attribute*dev_attrs; //设备属性 
....
const struct dev_pm_ops *pm;//电源管理
struct subsys_private *p;  //总线私有数据
}


总线结构体私有资源 简述
    struct subsys_private {
    struct kset subsys;
    struct kset *devices_kset;  /* 使用kset构建关联的devices链表头 */
    struct kset *drivers_kset;  /* 使用kset构建关联的drivers链表头 */
    struct klist klist_devices;   /* 通过循环可访问devices_kset的链表 */
    struct klist klist_drivers;  /* 通过循环可访问drivers_kset的链表 */
.....
};


设备驱动 结构体简述
struct device_driver {
const char *name;  驱动程序的名字
struct bus_type*bus; 驱动程序所在总线
struct module *owner;
const char *mod_name; /* used for built-in modules */
bool suppress_bind_attrs;/* disables bind/unbind via sysfs */
enum probe_type probe_type;
const struct of_device_id*of_match_table;
const struct acpi_device_id*acpi_match_table;
int (*probe) (struct device *dev);
int (*remove) (struct device *dev);
void (*shutdown) (struct device *dev);
int (*suspend) (struct device *dev, pm_message_t state);
int (*resume) (struct device *dev);
const struct attribute_group **groups;
const struct dev_pm_ops *pm;
struct driver_private *p;  驱动私有资源
};


设备驱动私有资源 简述
struct driver_private {
    struct kobject kobj;
struct klist klist_devices;
struct klist_node knode_bus;
struct module_kobject *mkobj;
struct device_driver *driver;
};

//设备结构体 简述
struct device {
const char *name 设备名称
struct bus_type *bus  设备所在总线
struct kobject kobj;
struct device_private*p;
...
struct device_node *of_node; 关联设备树节点 设备树中的节点描述
等等
}


//kset 是相同类型的 kobject 的集合 (Kset本身也是一个kobject 所以它在sysfs里同样表现为一个目录)
struct kset {
    struct list_head list;//用来链接该目录下的所有kobject对象
    spinlock_t list_lock; //在访问链表时加锁
    struct kobject kobj;  //同一个kset集合中内嵌的kobject,代表的是当前链表第一个 kobj 节点;
    const struct kset_uevent_ops *uevent_ops;//对发往用户空间的uevent的处理,如热拔插
};


//Kobject 是总线 驱动 设备对象的一个基类,实现公共接口
struct kobject {
const char *name;          指向对象名称的指针
struct list_headentry;      双向链表指针,用于将同一个kset集合中的kobject
                                           链接到一起,方便访问; 用来指向平行关系中
                                          的下一个kobject结构体对象

struct kobject*parent;    kobject对应的父kobject节点,在sys系统中表现为上一级目录
 
struct kset *kset;          kobject集合 用来指向父类对象的kset
struct kobj_type *ktype;     kobject 类型   指向一个kobj_type对象
struct kernfs_node*sd;     sysfs文件系统目录
struct kref kref;            初始化引用计数
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
struct delayed_workrelease;
#endif
unsigned int state_initialized:1; 初始化标志位
unsigned int state_in_sysfs:1;    是否在 sys 创建对应目录标志位


unsigned int state_add_uevent_sent:1;  添加设备的uevent事件是否发送标志;
                                                                       添加设备时会向用户空间发送 uevent事件
   请求新增设备
  
unsigned int state_remove_uevent_sent:1; 删除设备的uevent 事件是否发送标志;
                                                                             删除设备时会向用户空间发送uevent事件
                                                                             请求卸载设备;
unsigned int uevent_suppress:1;
};

//Ktype 记录了Kobject的一些属性
struct kobj_type {  
    void (*release)(struct kobject *kobj);//用于释放kobject占用的资源  
    const struct sysfs_ops *sysfs_ops;/*Kobject 属性操作集合*/  
    struct attribute **default_attrs; /*Kobject 默认属性数组*/  
    const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);  
    const void *(*namespace)(struct kobject *kobj);  
}; 





























### 数据模型的基本概念 数据模型是用来描述、组织和操作数据库中数据的一种理论框架。它定义了如何表示数据以及它们之间的关系,同时也规定了对这些数据的操作方式[^1]。 #### 真实性和易理解性 数据模型需具备真实性,即能够较为真实地模拟现实世界的实体及其相互作用;同时还需要具有良好的可读性和易于被人类理解的特点,以便开发者和最终用户都能轻松掌握其结构和功能[^1]。 #### 易实现性 为了便于在计算机环境中实际运用,数据模型还应该考虑其实现难度,确保可以在现有硬件条件下有效执行并支持高效的查询性能[^1]。 --- ### 数据模型的主要分类 依据不同的抽象层次,数据模型通常分为三种类型: #### 1. **概念模型** - 这是从用户视角出发构建的数据模型,主要用于帮助人们理解和沟通复杂的系统需求。 - E-R 图是最常见的形式之一,其中包含了对象(Entity)、属性(Attribute)以及两者间的关联(Relationship)。这种图形化的表达使得复杂的关系更加直观明了[^2]。 #### 2. **逻辑模型** - 面向具体的数据库管理系统(DBMS),提供了更接近机器层面的设计方案。 - 主要包括但不限于网状模型(Network Model)、层次模型(Hierarchical Model)、关系模型(Relational Model) 和面向对象模型(Object-Oriented Model)。 #### 3. **物理模型** - 描述的是最低级别的细节,涉及到了存储介质上的具体布局情况,比如索引机制或者文件组织方式等。 - 物理模型对于优化访问路径至关重要,直接影响着整个系统的运行效率。 --- ### 数据模型的应用场景 数据模型广泛应用于各个行业领域之中,下面列举几个典型例子说明其重要价值所在: - **商业智能(Business Intelligence, BI):** 利用强大的数据分析工具配合精心设计好的维度表与事实表架构,企业可以获得前所未有的洞察力来指导决策制定过程[^5]。 - **人工智能(AI)/机器学习(ML):** 当训练大型神经网络时,合理规划特征空间有助于加速收敛速度并且改善泛化效果; 同样,在线服务平台也需要依赖先进的推荐算法完成个性化服务推送任务[^4]. - **科学计算:** 复杂仿真项目往往涉及到海量多源异构型态的信息集合,只有借助标准化统一表述才能顺利完成跨学科协作研究工作[^3]. --- ```python # 示例代码展示了一个简单的ER图转SQL语句的过程 def create_table_sql(entities): sql_statements = [] for entity in entities: table_name = entity['name'] columns = ', '.join([f"{attr} {entity[attr]}" for attr in entity if attr != 'name']) primary_key = f", PRIMARY KEY ({', '.join(entity.get('primary_keys', []))})" if 'primary_keys' in entity else "" sql = f"CREATE TABLE {table_name}({columns}{primary_key});" sql_statements.append(sql) return "\n".join(sql_statements) entities_example = [ {"name": "Customer", "id": "INT AUTO_INCREMENT", "name": "VARCHAR(100)", "email": "VARCHAR(100)", "primary_keys": ["id"]}, {"name": "Order", "order_id": "INT AUTO_INCREMENT", "customer_id": "INT", "amount": "DECIMAL(8,2)", "date_ordered": "DATE", "primary_keys": ["order_id"]} ] print(create_table_sql(entities_example)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值