自己笔记使用.

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. Window WindowManager 和WindowManager.LayoutParams

    <一> Window window是android中的窗口,表示顶级窗口的意思,也就是主窗口,它有两个实现类, PhoneWindow和MidWindow,我们一般的activity对应的 ...

  2. playbook+roles

    playbook setup ansible_all_ipv4_addresses # ipv4的所有地址 ansible_all_ipv6_addresses # ipv6的所有地址 ansible ...

  3. 零基础逆向工程33_Win32_07_创建线程

    1 什么是线程(Threads)? 什么是多线程? 怎么在windows中观察多线程? 线程可以简单理解为主程序为解决一个问题而选择的其中一条路线. 同理,多线程就是同时选择不同的路线来解决此问题. ...

  4. Cocos2d-x v3.1项目创建(三)

    Cocos2d-x v3.1项目创建(三) Cocos2d-x官方为我们提供了用于创建.编译.运行和部署的一套命令行的工具集,也就是上篇文章中我们所提到的Cocos2d-Console,它位于我们的引 ...

  5. SQL SERVER 错误代码 0x534

    解决办法就是修改一下登陆名: ALTER LOGIN [G-PC\zqwang]   WITH NAME=[新的机器名\zqwang]; 然后查询一下 Service Broker 队列, 里面已经有 ...

  6. Movideo SaaS解决方案

    类型: 定制服务 软件包: media solution collateral 联系服务商 产品详情 解决方案 概要 Movideo为媒体客户提供的SaaS解决方案部署在位于全球数据中心的Azure云 ...

  7. Hive建模

    Hive建模 1.介绍 Hive作为数据仓库,同关系型数据库开发过程类似,都需要先进行建模,所谓建模,就是对表之间指定关系方式.建模在hive中大致分为星型.雪花型和星座型.要对建模深入理解,首先需要 ...

  8. JavaScript 面向对象编程(三):非构造函数对象的继承

    JavaScript 面向对象编程(三):非构造函数对象的继承 一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Chinese ...

  9. 关于HTML5,最牛逼的10本书!

    关于HTML5,最牛逼的10本书! 关于HTML5,最牛逼的10本书.rar HTML5+CSS3从入门到精通 李东博 著 推荐指数:★★★☆ 简介:本书通过基础知识+中小实例+综合案例的方式,讲述了 ...

  10. 简单的NLog配置文件

    NLog.config <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="h ...