总线类型 【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 *);
相关文章
|
16天前
|
存储 编译器 程序员
为什么不应该使用"volatile"类型的类 【ChatGPT】
为什么不应该使用"volatile"类型的类 【ChatGPT】
|
16天前
|
Linux API 虚拟化
PCI总线子系统 【ChatGPT】
PCI总线子系统 【ChatGPT】
|
16天前
|
缓存 安全 Linux
访问与总线无关的设备 【ChatGPT】
访问与总线无关的设备 【ChatGPT】
|
16天前
|
安全 编译器 测试技术
锁类型及其规则 【ChatGPT】
锁类型及其规则 【ChatGPT】
|
1月前
|
人工智能 自然语言处理 搜索推荐
chatgpt这么火,现在AI搜索引擎有哪些呢?
国外AI搜索引擎包括ChatGPT,擅长自然语言处理与内容生成;Google Bard,提供智能个性化搜索体验;Microsoft Bing集成GPT模型增强智能检索;Perplexity AI以简洁答案及文献引用著称;Neeva强调隐私保护与无广告服务。国内方面,天工AI支持多种功能如知识问答与代码编程;腾讯元宝基于混元模型助力内容创造与学习;360AI搜索以精准全面的信息搜索见长;秘塔AI专注提升写作质量和效率;开搜AI搜索提供个性化智能搜索服务。以上引擎均利用先进AI技术提升用户体验。更多详情参阅[AI搜索合集](zhangfeidezhu.com/?page_id=651)。
76 8
chatgpt这么火,现在AI搜索引擎有哪些呢?
|
29天前
|
机器学习/深度学习 人工智能 自然语言处理
HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题
HuggingGPT是一个框架,它使用大型语言模型(如ChatGPT)作为控制器来管理和协调Hugging Face上的AI模型,以语言作为通用接口解决多模态和领域的复杂AI任务。
27 0
HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题
|
20天前
|
机器学习/深度学习 人工智能 算法
为什么ChatGPT等AI大模型都是基于Python开发?
为什么ChatGPT等AI大模型都是基于Python开发?
|
1月前
|
人工智能 自然语言处理 Linux
免费ChatGPT4o灵办AI可体验浏览器插件
灵办AI就是您所需的最佳助手!我们为您带来了一款多功能AI工具,ChatGPT4o不仅能为您提供精准翻译,还能满足您的对话需求、智能续写、AI搜索、文档阅读、代码生成与修正等多种需求。灵办 AI,真正让工作和学习变得轻松高效!一款多功能智能助手,旨在提升工作和学习效率。它提供实时翻译、对话问答、搜索、写作和网页阅读等服务,支持多种浏览器和操作系统,帮助用户随时获取信息,打破语言障碍,优化内容创作和信息处理。
|
1月前
|
Web App开发 人工智能 安全
Gemini vs ChatGPT:谷歌最新的AI和ChatGPT相比,谁更强?
Gemini vs ChatGPT:谷歌最新的AI和ChatGPT相比,谁更强?
|
1月前
|
人工智能 安全 机器人
ChatGPT 1岁:创新、争议和AI产生突破的一年
ChatGPT 1岁:创新、争议和AI产生突破的一年