inux下bus,device,driver三者关系

Linux下Bus, Device, Driver关系解析
本文详细阐述了Linux环境下Bus、Device与Driver之间的关系及其交互过程,包括它们的定义、注册流程及如何建立联系等内容。

linux下bus,device,driver三者关系

                            

  1.bus:

  总线作为主机和外设的连接通道,有些总线是比较规范的,形成了很多协议。如PCI,USB,1394,IIC等。任何设备都可以选择合适的总线连接到主机。当然主机也可能就是CPU本身。内存也是通过BUS连接到主机的,可内存使用的总线不是外设总线,因此和内存使用相同类型的总线的设备,谈及BUS比较含糊。

  一块网卡在嵌入式开发中,直接通过内存总线接入到CPU。我们在写网卡驱动时,要给该BUS定义就麻烦了。

  2.driver:

  驱动程序是在CPU运行时,提供操作的软件接口。所有的设备必须有与之配套驱动程序才能正常工作。一个驱动程序可以驱动多个类似或者完全不同的设备。

  3.device:

  设备就是连接在总线上的物理实体。设备是有功能之分的。具有相同功能的设备被归到一个类(CLASS中)。如音频设备(和声音相关的都算),输入设备(鼠标,键盘,游戏杆等)。。。。

  从宏观考虑,任何设备必须要连接到主机才能发挥其作用。一个鼠标离开了电脑主机就不再是鼠标了。提到了连接就必然出现总线BUS。任何设备要正常运行必须有软件支持,所有的设备必须有DRIVER。设备的目的就是完成功能,根据功能的分类,该设备必然属于某个CLASS。

  1.三者的定义在 include/linux/device.h里。

  2.总线中的那两条链表是怎么形成:

  这要求每次出现一个设备就要向总线汇报,或者说注册,每次出现一个驱动,也要向总线汇报,或者说注册。比如系统初始化的时候,会扫描连接了哪些设备,并为每一个设备建立起一个struct device的变量,每一次有一个驱动程序,就要准备一个struct device_driver结构的变量。把这些变量统统加入相应的链表,device 插入devices 链表,driver插入drivers链表。这样通过总线就能找到每一个设备,每一个驱动.然而,假如计算机里只有设备却没有对应的驱动,那么设备无法工作。反过来,倘若只有驱动却没有设备,驱动也起不了任何作用。

  3.总线上的两条链表已经有了,链表里的device和driver又是如何联系

  每一个要用的device在计算机启动之前就已经插好了,插放在它应该在的位置上,然后计算机启动,然后操作系统开始初始化,总线开始扫描设备,每找到一个设备,就为其申请一个struct device结构,并且挂入总线中的devices链表中来;

  然后每一个驱动程序开始初始化,开始注册其struct device_driver结构,然后它去总线的devices链表中去寻找(遍历),去寻找每一个还没有绑定driver的设备,即struct device中的struct device_driver指针仍为空的设备,然后它会去观察这种设备的特征,看是否是他所支持的设备,如果是,那么调用一个叫做 device_bind_driver的函数。换句话说,把struct device中的struct device_driver driver指向这个driver,而struct device_driver driver把struct device加入他的那张struct klist klist_devices链表中来。就这样,bus、device和driver,这三者之间或者说他们中的两两之间,就给联系上了

  4.热插拔:

  device可以在计算机启动以后在插入或者拔出计算机了。因此,很难再说是先有 device还是先有driver了。因为都有可能。device可以在任何时刻出现,而driver 也可以在任何时刻被加载,所以,出现的情况就是,每当一个struct device诞生,它就会去bus的drivers链表中寻找自己的另一半,反之,每当一个一个struct device_driver诞生,它就去bus的devices链表中寻找它的那些设备。如果找到了合适的,那么ok,和之前那种情况一下,调用 device_bind_driver绑定好.


Linux系统下使用MySQL,可按以下步骤进行: ### 安装MySQL 1. **下载安装文件**:可从 http://www.mysql.com/downloads/mysql/ (选择Linux - Generic去下载)获取安装文件,如安装MySQL需要 MySQL - server - 5.1.48 - 1.glibc23.i386.rpm 和 MySQL - client - 5.1.48 - 1.glibc23.i386.rpm 这两个文件;也可以下载完毕后上传到Linux服务器 [^1][^3]。 2. **解压文件**:进入 `/usr/local` 文件夹,解压安装包,如 `tar -zxvf mysql - 5.7.31 - linux - glibc2.12 - x86_64.tar.gz -C ./`,然后将解压文件重命名为 `mysql`,即 `mv mysql - 5.7.31 - linux - glibc2.12 - x86_64/ mysql` [^1]。 3. **创建用户和组**:创建 `mysql` 用户组 `groupadd mysqlg`,创建 `mysql` 用户 `useradd -r -g mysqlg mysql` [^1]。 4. **修改安装目录所有者及所属组**:将 `mysql` 文件夹的归属用户组以及用户修改为 `mysql`,使用命令 `chown -R mysql:mysqlg mysql/` [^1]。 5. **创建数据存放文件夹**:创建 `data` 文件夹,用于存放数据库表之类的数据 [^1]。 ### 了解MySQL相关目录 1. **数据库目录**: `/var/lib/mysql/` 2. **配置文件**: `/usr/share/mysql`(包含 `mysql.server` 命令及配置文件) 3. **相关命令**: `/usr/bin`(如 `mysqladmin`、`mysqldump` 等命令) 4. **启动脚本**: `/etc/rc.d/init.d/`(启动脚本文件 `mysql` 的目录) [^2] ### 启动并检查MySQL服务 使用以下命令启动并检查MySQL服务: ```bash sudo systemctl start mysql sudo systemctl enable mysql sudo systemctl status mysql ``` 此步骤适用于在CentOS/RHEL上安装的情况 [^4]。 ### 解决Socket参数问题 若遇到Socket参数问题,如 `/var/lib/mysql/mysql.sock` 与 `tcp` 协议要找的地址 `/tmp/mysql.sock` 不一致,可通过软连接到 `/tmp/mysql.sock` 来解决 [^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值