linux pci扫描链表,Linux Kernel ---- PCI Driver 分析
自己笔记使用.
Kernel 版本 4.15.0 (ubuntu 18.04,intel skylake)
最近想学习VGA驱动去了解 DDCCP / EDID 等协议,然后顺便了解下驱动是如何工作的.
1. drivers/base/init.c –> driver_init() 这个函数比较重要,会创建驱动所需要的若干结构体,并且产生相应主目录比如 /sys/bus, /sys/devices, /sys/dev 等等目录.
2. drivers/pci/pci-driver.c –> postcore_initcall(pci_driver_init) 这里是个关键.
PCI驱动所使用的结构体 struct pci_driver. struct device_driver.bus_type 都是引用 pci_driver_init 所初始化的
struct bus_type pci_bus_type,而 struct bus_type 引用的 kset 就是前面 1. 函数里面 buses_init 所创建
bus_register 里面有两动作是klist_init(&priv->klist_devices,klist_devices_get,klist_devices_put);
klist_init(&priv->klist_drivers,NULL,NULL);
从这里可以看出这里开始初始 bus->p->klist_devices,bus->p->klist_drivers
3. drivers/gpu/drm/i915/i915_pci.c -> module_init(i915_init) –>pci_register_driver(&i915_pci_driver)
static struct pci_driver i915_pci_driver{…} 这个是显卡驱动的结构体.
上面调用最终会调用到 driver_register(struct device_driver *drv) ; //pci_driver.device_driverdriver_find() 函数会先检查驱动是否已经注册,从这里可以看,注册过的驱动都会放在
bus->p->driver_kset 链表里面,同时 kset.list.next prev 指向的是 struct kobject.entry
代码里面经常会看到宏 Container_of, 当我们透过 kset.list做循环的时候,提到的next或者prev 都是
struct kobject.entry,那么我们如何得到 kobject的首地址呢,那我们就需要用到 Container_ofbus_add_driver 创建驱动的私有成员 struct driver_private , priv->kobj.kset = bus->p->driver_kset
同时把 priv->kobj.entry 添加到 bus->p->driver_kset链表里面
创建目录 /sys/bus/pci/driver/i195&priv->knodbus.node 添加到 bus.p->klist_drivers 链表里面
下面会继续调用 driver_attach(drv)-> bus_for_each_dev(drv->bus,NULL,drv,__driver_attach)
4. bus_for_each_dev 函数.
struct klist_iter i; i.i_klist = bus->p>klist_devices ; i.i_cur = NULL;
下面会循环读 bus->p->klist_devices 里面链表的数据,问题了,这个链表里面的数据在哪里放的呢?
如果你知道,请告诉我,谢谢.
内容来源于网络如有侵权请私信删除
linux pci扫描链表,Linux Kernel ---- PCI Driver 分析相关推荐
- linux怎么扫描磁盘,Linux中磁盘扫描流程是怎么样的?
通常SCSI总线适配器作为PCI设备的形式存在,其在计算机体系结构中的位置如下图所示:图1 scis host及device在计算机体系结构中的位置 在系统初始化时会扫描系统PCI总线,由于scsi ...
- linux 重新扫描硬件,Linux查看硬件信息以及驱动设备的命令
用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart) 查看CPU信息:cat /proc/cpuinfo 查看板卡信息:cat /proc/pci 查 ...
- linux内核计算list的长度,Linux内核通用链表 linux/list.h阅读
#ifndef _LINUX_LIST_H #define _LINUX_LIST_H //宏定义,不做过多解释,就是检查是否包含了linux/list.h #ifdef __KERNEL__ #in ...
- linux端口扫描nc,Linux下nc命来实现文件传输、端口扫描
今天在饮水思源上闲逛,看到了一个贴子关于Linux下nc命来实现文件传输,进行学习了解了一下. 发送端: cat test.txt | nc -l -p 6666 或者nc -l -p 6666 & ...
- 嵌入式linux按键扫描,嵌入式Linux驱动笔记(三十一)------SYSRQ组合键使用
你好!这里是风筝的博客, 欢迎和我一起交流. ALT+SYSRQ组合键是Linux调试的一种手段,即使在系统死机.panic.卡住等情况,只要系统还能响应中断,那么SYSRQ就派上用场了(比如触发cr ...
- linux 如何扫描 病毒,linux安装fprot扫描病毒
cd / 如果没有nfs8205,则 yum install -y nfs-utils mount -t nfs 172.28.8.205:/nfs205 /nfs8205/ mkdir ...
- c linux time微秒_Linux基础知识(Linux系统、Linux中的链表)
Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...
- linux中_Linux基础知识(Linux系统、Linux中的链表)
Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...
- linux中断数据结构图,北桥.PCI.linuxPCI中断处理
2008.8.9 , rev 2009.4.13 最开始只是想搞明白cpu 的load save指定的地址是如何正确的分别送到PCI和内存控制器的.....*感性认识 Dell 630 *PCI ...
最新文章
- 将文件名和文件修改时间批量输出至Excel中
- python 比较list差异
- Pandas的学习(pandas中删除行以及重排(重建)行索引)
- wxWidgets:wxListCtrl 示例
- 判断android图片是否硬解码(方法)
- qt triggered信号_Qt之网络编程UDP通信
- 面试进阶题集锦-持续更新
- Promise解决回调地狱写法
- javascript学习笔记之入门
- ue4 命名插件_实时渲染模拟每根头发丝!新版UE4在实时毛发方面的实验性新功能...
- 高斯分布函数c语言编程,c语言 写高斯分布函数
- 全网首发:gpg: gpg-agent 在此次会话中无法使用的解决办法
- C/C++与Fortan混编
- mysql微信昵称特殊符号_mysql保存微信昵称特殊字符的方法
- 水逆期自我救赎:MacBook pro进水
- 年度大促将至,企业如何进行性能压测
- 软件工程——系统流程图符号及案例
- Redis监听失效的字段
- 数据可视化工具(QBarSeries柱状图)
- 什么叫中断、中断向量、中断向量表?
热门文章
- 使用python实现多维数据降维操作
- Python 3.x 引入了函数注释
- 计算机几个发展阶段相关介绍,计算机的发展经历了哪几个阶段
- java五大原则_Java成长第五集--面向对象设计的五大原则
- c mysql 关闭连接池_数据库连接池关闭的时间
- okhttp3测试框架_easy-okhttp: 这是一个对okhttp3进行封装的工具,提供了更为便捷的方法调用。目的是为了替换难用的apache HttpClient。...
- 进程、线程、端口、服务间关系
- Divan and bitwise operations 异或,同或,组合数学(1500)
- 枚举与常量 java_java – 为什么两个枚举常量可以在同一行中使用?
- python文件名带日期变量_Python实现文件按照日期命名的方法