自己笔记使用.

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 分析相关推荐

  1. linux怎么扫描磁盘,Linux中磁盘扫描流程是怎么样的?

    通常SCSI总线适配器作为PCI设备的形式存在,其在计算机体系结构中的位置如下图所示:图1 scis host及device在计算机体系结构中的位置 在系统初始化时会扫描系统PCI总线,由于scsi ...

  2. linux 重新扫描硬件,Linux查看硬件信息以及驱动设备的命令

    用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart) 查看CPU信息:cat /proc/cpuinfo 查看板卡信息:cat /proc/pci 查 ...

  3. linux内核计算list的长度,Linux内核通用链表 linux/list.h阅读

    #ifndef _LINUX_LIST_H #define _LINUX_LIST_H //宏定义,不做过多解释,就是检查是否包含了linux/list.h #ifdef __KERNEL__ #in ...

  4. linux端口扫描nc,Linux下nc命来实现文件传输、端口扫描

    今天在饮水思源上闲逛,看到了一个贴子关于Linux下nc命来实现文件传输,进行学习了解了一下. 发送端: cat test.txt | nc -l -p 6666 或者nc -l  -p 6666 & ...

  5. 嵌入式linux按键扫描,嵌入式Linux驱动笔记(三十一)------SYSRQ组合键使用

    你好!这里是风筝的博客, 欢迎和我一起交流. ALT+SYSRQ组合键是Linux调试的一种手段,即使在系统死机.panic.卡住等情况,只要系统还能响应中断,那么SYSRQ就派上用场了(比如触发cr ...

  6. linux 如何扫描 病毒,linux安装fprot扫描病毒

    cd / 如果没有nfs8205,则 yum install -y nfs-utils       mount -t nfs 172.28.8.205:/nfs205 /nfs8205/ mkdir ...

  7. c linux time微秒_Linux基础知识(Linux系统、Linux中的链表)

    Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...

  8. linux中_Linux基础知识(Linux系统、Linux中的链表)

    Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...

  9. linux中断数据结构图,北桥.PCI.linuxPCI中断处理

    2008.8.9  , rev 2009.4.13 最开始只是想搞明白cpu 的load save指定的地址是如何正确的分别送到PCI和内存控制器的.....*感性认识 Dell 630 *PCI  ...

最新文章

  1. 将文件名和文件修改时间批量输出至Excel中
  2. python 比较list差异
  3. Pandas的学习(pandas中删除行以及重排(重建)行索引)
  4. wxWidgets:wxListCtrl 示例
  5. 判断android图片是否硬解码(方法)
  6. qt triggered信号_Qt之网络编程UDP通信
  7. 面试进阶题集锦-持续更新
  8. Promise解决回调地狱写法
  9. javascript学习笔记之入门
  10. ue4 命名插件_实时渲染模拟每根头发丝!新版UE4在实时毛发方面的实验性新功能...
  11. 高斯分布函数c语言编程,c语言 写高斯分布函数
  12. 全网首发:gpg: gpg-agent 在此次会话中无法使用的解决办法
  13. C/C++与Fortan混编
  14. mysql微信昵称特殊符号_mysql保存微信昵称特殊字符的方法
  15. 水逆期自我救赎:MacBook pro进水
  16. 年度大促将至,企业如何进行性能压测
  17. 软件工程——系统流程图符号及案例
  18. Redis监听失效的字段
  19. 数据可视化工具(QBarSeries柱状图)
  20. 什么叫中断、中断向量、中断向量表?

热门文章

  1. 使用python实现多维数据降维操作
  2. Python 3.x 引入了函数注释
  3. 计算机几个发展阶段相关介绍,计算机的发展经历了哪几个阶段
  4. java五大原则_Java成长第五集--面向对象设计的五大原则
  5. c mysql 关闭连接池_数据库连接池关闭的时间
  6. okhttp3测试框架_easy-okhttp: 这是一个对okhttp3进行封装的工具,提供了更为便捷的方法调用。目的是为了替换难用的apache HttpClient。...
  7. 进程、线程、端口、服务间关系
  8. Divan and bitwise operations 异或,同或,组合数学(1500)
  9. 枚举与常量 java_java – 为什么两个枚举常量可以在同一行中使用?
  10. python文件名带日期变量_Python实现文件按照日期命名的方法