总线类型 【ChatGPT】

简介: 总线类型 【ChatGPT】

总线类型

定义

请参阅结构体bus_type的内核文档。

int bus_register(struct bus_type * bus);

声明

内核中的每个总线类型(如PCI、USB等)应该声明一个此类型的静态对象。它们必须初始化name字段,并可以选择初始化match回调函数:

struct bus_type pci_bus_type = {
       .name = "pci",
       .match        = pci_bus_match,
};

该结构体应该在头文件中向驱动程序导出:

extern struct bus_type pci_bus_type;

注册

当总线驱动程序初始化时,它调用bus_register函数。这将初始化总线对象中的其余字段,并将其插入到全局总线类型列表中。一旦总线对象被注册,其中的字段就可以被总线驱动程序使用。

回调函数

match(): 将驱动程序附加到设备

设备ID结构的格式和比较它们的语义在本质上是特定于总线的。驱动程序通常在特定于总线的驱动程序结构中声明支持的设备的设备ID数组。

match回调函数的目的是让总线有机会通过比较驱动程序支持的设备ID与特定设备的设备ID来确定特定驱动程序是否支持特定设备,而不会牺牲总线特定的功能或类型安全性。

当驱动程序与总线注册时,总线的设备列表将被迭代,并且对于每个没有与之关联驱动程序的设备,将调用match回调函数。

设备和驱动程序列表

设备和驱动程序列表旨在替代许多总线保留的本地列表。它们分别是struct devices和struct device_drivers的列表。总线驱动程序可以自由地使用这些列表,但可能需要转换为特定于总线的类型。

LDM核心提供了用于遍历每个列表的辅助函数:

int bus_for_each_dev(struct bus_type * bus, struct device * start,
void * data,
int (*fn)(struct device *, void *));
int bus_for_each_drv(struct bus_type * bus, struct device_driver * start,
void * data, int (*fn)(struct device_driver *, void *));

这些辅助函数遍历相应的列表,并为列表中的每个设备或驱动程序调用回调函数。所有列表访问都通过获取总线的锁(当前为读取锁)进行同步。在调用回调函数之前,列表中每个对象的引用计数都会增加;在获取下一个对象之后,引用计数会减少。在调用回调函数时,不会持有锁。

sysfs

有一个名为“bus”的顶级目录。

每个总线在总线目录中都有一个目录,以及两个默认目录:

/sys/bus/pci/
|-- devices
`-- drivers

在总线注册的驱动程序在总线的驱动程序目录中获得一个目录:

/sys/bus/pci/
|-- devices
`-- drivers
    |-- Intel ICH
    |-- Intel ICH Joystick
    |-- agpgart
    `-- e100

在该类型总线上发现的每个设备都会在总线的设备目录中得到一个符号链接,指向物理层次结构中设备的目录:

/sys/bus/pci/
|-- devices
|   |-- 00:00.0 -> ../../../root/pci0/00:00.0
|   |-- 00:01.0 -> ../../../root/pci0/00:01.0
|   `-- 00:02.0 -> ../../../root/pci0/00:02.0
`-- drivers

导出属性

struct bus_attribute {
struct attribute        attr;
ssize_t (*show)(const struct bus_type *, char * buf);
ssize_t (*store)(const struct bus_type *, const char * buf, size_t count);
};

总线驱动程序可以使用BUS_ATTR_RW宏导出属性,该宏的工作方式类似于DEVICE_ATTR_RW宏用于设备。例如,像这样的定义:

static BUS_ATTR_RW(debug);
SCSS 复制 全屏

等同于声明:

static bus_attribute bus_attr_debug;
MIPSASM 复制 全屏

然后可以使用以下方式将属性添加到总线的sysfs目录中或从中删除:

int bus_create_file(struct bus_type *, struct bus_attribute *);
void bus_remove_file(struct bus_type *, struct bus_attribute *);
相关文章
|
5月前
|
存储 编译器 程序员
为什么不应该使用"volatile"类型的类 【ChatGPT】
为什么不应该使用"volatile"类型的类 【ChatGPT】
|
5月前
|
Linux API 虚拟化
PCI总线子系统 【ChatGPT】
PCI总线子系统 【ChatGPT】
|
5月前
|
缓存 安全 Linux
访问与总线无关的设备 【ChatGPT】
访问与总线无关的设备 【ChatGPT】
|
5月前
|
安全 编译器 测试技术
锁类型及其规则 【ChatGPT】
锁类型及其规则 【ChatGPT】
|
1月前
|
机器学习/深度学习 人工智能 搜索推荐
哈佛推出全新类ChatGPT癌症诊断AI,登上Nature!准确率高达96%
哈佛大学研究团队开发的新型AI模型CHIEF,在《自然》期刊发表,癌症诊断准确率达96%。CHIEF基于深度学习,能自动识别、分类癌症并预测生存期,具高准确性、多任务能力和泛化性。它结合病理图像与基因组学等数据,显著提升诊断效率和个性化治疗水平,有望改善医疗资源不平等。但数据隐私和临床效果验证仍是挑战。论文见:https://www.nature.com/articles/s41586-024-07894-z
169 101
|
6天前
|
存储 人工智能 API
ChatGPT-on-WeChat:Star32.4k, DeepSeek加持!这款开源神器秒变AI助手,聊天体验直接起飞!
嗨,大家好,我是小华同学。今天为大家介绍一款结合DeepSeek引擎的开源项目——ChatGPT-on-WeChat,由开发者zhayujie打造。它将微信变成智能AI助手,支持文本、图片、语音对话,具备定时提醒、天气查询等扩展功能,完全开源且易于定制。项目地址:https://github.com/zhayujie/chatgpt-on-wechat。关注我们,获取更多优质开源项目和高效学习方法。
111 11
|
7天前
|
人工智能 自然语言处理 算法
DeepSeek vs ChatGPT:AI对决中的赢家是……人类吗?
DeepSeek VS ChatGPT:DeepSeek以开源黑马姿态崛起,凭借低成本、高性能的「DeepSeek-V3」和专为深度推理设计的「DeepSeek-R1」,成为中小开发者的首选。而ChatGPT则较贵。 然而,AI依赖也带来隐忧,长期使用可能导致记忆衰退和“脑雾”现象。为此,推荐Neuriva解决方案,专注力提升30%,记忆留存率提升2.1倍,助力人类在AI时代保持脑力巅峰。 DeepSeek赢在技术普惠,ChatGPT胜于生态构建,人类的关键在于平衡AI与脑力健康,实现“双核驱动”突破极限!
152 7
|
2月前
|
人工智能 搜索推荐 iOS开发
OpenAI推出适用于iPhone的ChatGPT,与Apple实现具有里程碑意义的AI整合
OpenAI推出适用于iPhone的ChatGPT,与Apple实现具有里程碑意义的AI整合
|
6月前
|
人工智能 自然语言处理 搜索推荐
chatgpt这么火,现在AI搜索引擎有哪些呢?
国外AI搜索引擎包括ChatGPT,擅长自然语言处理与内容生成;Google Bard,提供智能个性化搜索体验;Microsoft Bing集成GPT模型增强智能检索;Perplexity AI以简洁答案及文献引用著称;Neeva强调隐私保护与无广告服务。国内方面,天工AI支持多种功能如知识问答与代码编程;腾讯元宝基于混元模型助力内容创造与学习;360AI搜索以精准全面的信息搜索见长;秘塔AI专注提升写作质量和效率;开搜AI搜索提供个性化智能搜索服务。以上引擎均利用先进AI技术提升用户体验。更多详情参阅[AI搜索合集](zhangfeidezhu.com/?page_id=651)。
184 8
chatgpt这么火,现在AI搜索引擎有哪些呢?
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题
HuggingGPT是一个框架,它使用大型语言模型(如ChatGPT)作为控制器来管理和协调Hugging Face上的AI模型,以语言作为通用接口解决多模态和领域的复杂AI任务。
120 0
HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题