自己笔记使用.

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_driver

  • driver_find() 函数会先检查驱动是否已经注册,从这里可以看,注册过的驱动都会放在

bus->p->driver_kset 链表里面,同时 kset.list.next prev 指向的是 struct kobject.entry

代码里面经常会看到宏 Container_of,  当我们透过 kset.list做循环的时候,提到的next或者prev 都是

struct kobject.entry,那么我们如何得到 kobject的首地址呢,那我们就需要用到 Container_of

  • bus_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 Kernel ---- PCI Driver 分析的更多相关文章

  1. Linux kernel AACRAID Driver Compat IOCTL 本地安全绕过漏洞

    漏洞名称: Linux kernel AACRAID Driver Compat IOCTL 本地安全绕过漏洞 CNNVD编号: CNNVD-201311-390 发布时间: 2013-11-29 更 ...

  2. Linux kernel workqueue机制分析

    Linux kernel workqueue机制分析 在内核编程中,workqueue机制是最常用的异步处理方式.本文主要基于linux kernel 3.10.108的workqueue文档分析其基 ...

  3. Linux Kernel Oops异常分析

    1.PowerPC小系统内核异常分析 1.1  异常打印 Unable to handle kernel paging request for data at address 0x36fef31eFa ...

  4. linux kernel make构建分析

    前言 之前对uboot的构建进行了分析,现在再对linux kernel的构建进行分析.几年前的确也分析过,但是只是停留在笔记层面,没有转为文章,这次下定决定来完善它. 环境 同样,采用的还是zynq ...

  5. Linux kernel workqueue机制分析【转】

    转自:http://www.linuxsir.org/linuxjcjs/15346.html 在内核编程中,workqueue机制是最常用的异步处理方式.本文主要基于linux kernel 3.1 ...

  6. Linux Kernel CMPXCHG函数分析

    原文地址:http://blog.csdn.net/penngrove/article/details/44175387 最近看到Linux Kernel cmpxchg的代码,对实现很不理解.上网查 ...

  7. linux kernel input 子系统分析

    Linux 内核为了处理各种不同类型的的输入设备 , 比如说鼠标 , 键盘 , 操纵杆 , 触摸屏 , 设计并实现了一个对上层应用统一的试图的抽象层 , 即是Linux 输入子系统 . 输入子系统的层 ...

  8. Linux的PCI驱动分析

    1. 关键数据结构 PCI设备上有三种地址空间:PCI的I/O空间.PCI的存储空间和PCI的配置空间.CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给设备驱动程序使用,而配置 ...

  9. Linux Kernel 'MSR' Driver Local Privilege Escalation

    本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! // PoC exploit for /dev/cpu/*/msr, 32bit userland on a 64bit hos ...

随机推荐

  1. 在快速自定义的NopCommerce中使用实体框架(EF)代码优先迁移

    我看到很多nopCommerce论坛的用户问他们如何使用Entity Framework(EF)代码优先迁移来自定义nopCommerce,添加新的字段和entites核心.我实际上在做nopComm ...

  2. 102001 E

    x轴上方给你n个点,m个水平杆子, 然后q组询问,每次询问一个点,问能看到多少个点. n,q<=40000,m<=5 自闭了呀,又写了个 for(int i=1;i<(1<&l ...

  3. 开启win7笔记本自带无线功能

    在cmd中输入以下命令: netsh wlan set hostednetwork mode=allow /disallow netsh wlan set hostednetwork ssid=Myw ...

  4. EditText中光标的位置设置

    CharSequence text = userName.getText();              if (text instanceof Spannable) {                ...

  5. 【起航计划 023】2015 起航计划 Android APIDemo的魔鬼步伐 22 App->Menu->Inflate from XML 使用xml资源展示菜单

    本例MenuInflateFromXml.java演示了如何从Menu 资源(XML 定义)展开菜单项.这个例子的onCreate 采用了使用代码来创建Activity 界面的方法 而通常的方法是采用 ...

  6. Eclipse + Tomcat 环境下配置 JSTL 标签

    1.下载 jar 包. 网址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 2.解压后将jstl.jar和stan ...

  7. check_mk 之 Configuration variables

    Basic settings #check_parameters This is a configuration list assigning specific check parameters to ...

  8. Selenium入门15 截图

    截图方法: 1 保存截图 get_screenshot_as_file('保存路径\\文件名.png')     #有一个\是转义符 2 保存截图 save_screenshot('保存路径\\文件名 ...

  9. C# 安装 Visual Studio IDE

    官网: https://visualstudio.microsoft.com/zh-hans/ 下载社区版(免费的) .微软的软件安装都是很nice的.安装过程中选择需要的配置进行安装(比如.net桌 ...

  10. Ubuntu中在QT中配置OpenGL

    之前搞实验室项目,博客有些天没有更新.现在学习需要,开始搞OpenGL+Ubuntu+QT. 搞了整整一天,由于是首次使用ubuntu,所以这ubuntu下配置qt和Opengl环境时走了很多的弯路, ...