当前位置:首页>Linux>从0到1,带你吃透 Linux 设备驱动模型

从0到1,带你吃透 Linux 设备驱动模型

  • 2026-06-13 06:10:29
从0到1,带你吃透 Linux 设备驱动模型

很多嵌入式开发者学习驱动时,只会照搬模板代码,单纯实现设备读写功能,却完全不懂底层运行机制。面对Linux设备驱动模型的总线、设备、驱动匹配逻辑,以及kobject、sysfs等核心机制,多数人始终一知半解。一旦遇到驱动加载失败、设备匹配异常、节点无法生成等实际问题,就没有排查思路,无法独立解决问题,这也是新手驱动开发难以进阶的核心原因。

为此本文采用从0到1的零基础讲解模式,摒弃晦涩的源码堆砌,由浅入深拆解Linux设备驱动模型核心架构。系统梳理驱动注册、设备挂载、总线匹配、资源释放的完整流程,结合开发实战场景拆解常见问题与调试思路。零基础也能轻松看懂,帮你彻底摆脱只会抄代码的困境,扎实掌握驱动底层核心原理,筑牢嵌入式Linux驱动开发的知识根基。

一、初识设备驱动模型

面试题写作模版

1.1 Linux 设备驱动模型是什么?

Linux 设备驱动模型是 Linux 内核中负责管理系统中不同硬件设备驱动程序的关键部分,是硬件设备与操作系统之间交互的标准化框架,实现设备与操作系统的通信和协作。在 Linux 里,每个硬件设备都对应着自己的设备驱动程序,这些驱动程序提供设备对应的功能和接口。打个比方,硬件设备就像各种不同类型的电器,而驱动程序就像是控制这些电器的遥控器,设备驱动模型则是协调这些遥控器和电器之间如何顺畅配合工作的规则和机制。

Linux 设备驱动模型采用统一的设备模型来管理各种硬件设备,涵盖设备的注册、命名、资源分配、状态管理等功能 。这种设计让 Linux 系统具备更高的灵活性和可扩展性,能够支持各类不同类型的硬件设备,也为开发者编写和调试设备驱动程序提供了便利。

比如,当你要在 Linux 系统中添加一个新的 USB 设备时,设备驱动模型就会按照既定的规则和流程,去识别这个设备、为它分配系统资源,然后找到合适的驱动程序来让它正常工作。对从事 Linux 开发的人来说,理解 Linux 设备驱动模型是非常重要的,它是深入掌握 Linux 系统开发、优化系统性能、提升硬件兼容性的基础。

1.2 为什么要有 Linux 设备驱动模型

Linux 内核需要适配多种硬件架构与硬件设备,不同硬件的功能与操作方式存在差异。若缺少统一的设备驱动模型,开发各类硬件驱动时会产生大量重复代码,增加开发工作量,同时造成内核代码冗余,提升代码维护与管理难度。

Linux 设备驱动模型对驱动代码进行分层抽象,提取通用功能并封装为可复用模块。开发新设备驱动时,可直接调用现有通用模块,仅需针对硬件特有特性编写定制代码,有效减少冗余代码,契合高内聚、低耦合的设计原则,提升了内核代码的可维护性与可扩展性,各类同类型硬件设备均可基于通用驱动接口完成开发适配。

电源管理是计算机系统运行的重要环节,移动设备、服务器等设备对功耗控制有着严格要求。硬件设备在不同运行状态下功耗不同,系统需要根据运行状态切换设备工作模式,实现节能与性能优化。系统进入待机状态时,需将硬件设备切换为低功耗状态;系统恢复运行时,需有序唤醒硬件设备。

Linux 设备驱动模型构建了设备层级结构与设备依赖关系,让内核清晰掌握设备的连接与控制逻辑。内核可依据设备层级顺序执行电源状态切换,按照规范顺序完成设备休眠与唤醒操作,规避电源操作顺序异常引发的设备故障与系统异常,保障系统电源管理的稳定性与安全性。

Linux 设备驱动模型支持硬件设备的热插拔与即插即用功能,无需重启系统即可完成硬件的接入与移除适配,简化了硬件设备的管理流程。该模型通过标准化的设备管理接口与匹配机制,可自动检测硬件设备的接入与移除状态。新设备接入系统后,模型会自动匹配对应驱动程序,为设备分配内存、中断号等系统资源,完成设备初始化配置;设备移除时,系统会自动回收相关资源,完成清理工作,有效保障系统运行的稳定性,提升了硬件适配的灵活性与系统易用性。

1.3 设备驱动模型的分类

设备驱动按照功能与硬件访问方式分为字符设备、块设备、网络设备三类,三类驱动在数据读写形式、缓存机制、使用场景上存在明显区别。

  1. 字符设备驱动面向字节流式收发数据的硬件,数据读写严格按字节顺序串行处理,设备不配备 IO 缓存。串口、键盘、鼠标都属于典型字符设备。串口外接传感器时,传感器周期性上报温度字符串数据,驱动逐字节接收数据流,拼接完整数据后上交应用完成数值解析。键盘按键触发硬件扫描码,驱动转换扫描码为标准字符,逐层转发至前端应用,实现文字录入。
  2. 块设备驱动管理磁盘、U 盘等存储硬件,数据以固定大小块为单位存取,支持随机寻址访问。块设备依靠请求队列统一调度 IO 任务,所有读写请求入队后由驱动调度执行。读取磁盘视频文件时,应用下发读请求,内核转换为块 IO 请求并入设备请求队列,驱动依据块地址寻址、分片读取多块数据,汇总数据后回传给播放程序。
  3. 网络设备驱动适配网卡类硬件,负责数据包收发、网卡初始化与网络参数配置。应用发起网页访问请求后,内核把业务数据交由网卡驱动,驱动按照 TCP/IP 协议封装报文并从网卡发出;远端服务器回传的数据包经网卡接收、驱动拆包校验,有效载荷逐层上交浏览器完成页面展示,驱动同时承担 IP、子网掩码等网卡基础参数配置工作。

二、Linux 设备驱动模型核心组件

面试题写作模版

2.1 kobject:设备驱动模型的基石

kobject 是 Linux 设备驱动模型的基础数据结构,为整个设备驱动体系提供对象管理、层次组织与 sysfs 对接能力。kobject 包含多个核心成员,用于实现对象标识与层级管理。

其中 name 成员用于标识 kobject 对象,在 sysfs 文件系统中直接对应一个目录名称,系统通过该名称实现对象的索引与访问。parent 是指向父 kobject 的指针,用于构建对象间的层级关系,使多个 kobject 能够按照硬件与驱动的实际结构形成树形组织。kset 表示 kobject 所属的对象集合,用于将同类或相关的 kobject 统一归类管理,实现同类对象的批量维护。ktype 定义 kobject 的类型,包含对象的操作函数与默认属性,不同用途的 kobject 会使用不同的 ktype 以实现差异化行为。

kobject 的核心作用是提供统一的内核对象管理机制,并与 sysfs 文件系统深度绑定。每个在内核中完成注册的 kobject,都会在 sysfs 中生成对应的目录,用户空间可通过该目录访问设备属性与状态。在设备驱动开发中,设备结构体通常会内嵌 kobject 对象,kobject 注册后即可在 /sys 目录下呈现对应设备目录,例如 /sys/devices/platform 下的各类子目录,均由设备的 kobject 自动创建。

// kobject 核心结构体简化示例struct kobject {    const char              *name;struct kobject          *parent;struct kset             *kset;struct kobj_type        *ktype;};

kobject 提供一组标准操作函数,用于对象的生命周期管理。kobject_init 函数用于初始化 kobject 对象,完成引用计数、链表头等基础信息的设置,为对象添加到内核做好准备。kobject_add 函数将初始化后的 kobject 加入内核系统,并依据 parent 与 kset 配置,在 sysfs 中创建对应目录,完成对象的对外呈现。kobject_del 函数用于从内核移除 kobject,并删除 sysfs 中对应的目录,函数会先检查对象引用计数,确保无使用者后再执行完整删除操作。

// kobject 常用操作函数示例// 初始化 kobjectkobject_init(&my_kobj, &my_ktype);// 设置父对象并添加到内核,创建 sysfs 目录my_kobj.parent = &parent_kobj;kobject_add(&my_kobj, NULL, "my_device");// 从内核删除 kobject 并移除 sysfs 目录kobject_del(&my_kobj);

2.2 kset:kobject 的集合管理者

kset 是用于对 kobject 进行集合管理的数据结构,在 Linux 设备驱动模型中承担对象分组与统一管理的功能。kset 内部包含多个用于管理与维护的核心成员。list 成员是链表头结构,作用是将当前 kset 所管理的全部 kobject 以链表形式进行组织,内核可通过该链表完成对所有子对象的遍历与管理。list_lock 是自旋锁结构,用于对链表访问操作进行互斥保护,在多线程并发访问场景下,避免因同时操作链表导致的数据异常与不一致问题。

kset 自身同样属于内核对象,因此内部嵌入 kobj 成员,该 kobject 用于实现 kset 的层级挂载与 sysfs 目录创建,使 kset 能够以树形结构接入内核体系。uevent_ops 是用户空间事件操作函数集,当 kset 内部的 kobject 状态发生变化时,内核会通过该函数集向用户空间发送设备热插拔等事件通知。

// kset 核心结构体简化示例struct kset {struct list_head list;    spinlock_t list_lock;struct kobject kobj;    conststruct kset_uevent_ops *uevent_ops;};

kset 与 kobject 存在明确的管理与被管理关系,kobject 依靠 kset 实现同类对象的统一归类与层次化组织。同一 kset 管理的 kobject 通常属于相同类型或相同总线设备,这些 kobject 会自动以 kset 内部的 kobj 作为父对象,并挂载到同一链表中。在 sysfs 文件系统中,/sys/bus 目录下的各类子目录均对应一个 kset,目录内部的设备节点则由对应 kset 管理的 kobject 生成,这种结构让同类设备能够被集中管理,同时形成清晰稳定的设备层次关系,为总线管理、设备匹配与热插拔处理提供基础支撑。

2.3 bus_type:总线的内核体现

bus_type 是 Linux 内核中用于表示总线的标准结构体,是实现设备与驱动匹配、管理、通信的核心组件。bus_type 包含多个用于描述总线特性与行为的核心成员。

name 字段用于标识总线类型,例如 pci、usb、platform 等,是总线在系统中的唯一名称。dev_name 用于定义总线设备在 sysfs 中的命名规则,决定设备节点的显示格式。dev_root 指向该总线在 sysfs 中的根目录节点,内核通过该指针完成总线目录的层级挂载。bus_groups、dev_groups、drv_groups 分别定义了总线、设备、驱动在 sysfs 中展示的属性集合,用于向外提供可查看与配置的属性文件。

match 是总线的核心函数指针,负责实现设备与驱动的匹配检查,当新设备或新驱动注册时,总线会调用该函数判断二者是否兼容。probe 函数在设备与驱动匹配成功后被调用,主要完成设备的初始化、资源分配与功能使能。remove 函数在设备移除时执行,用于释放设备占用的资源并完成清理工作。

// bus_type 核心结构体简化示例struct bus_type {    const char              *name;    const char              *dev_name;struct kobject          *dev_root;    conststruct attribute_group **bus_groups;    conststruct attribute_group **dev_groups;    conststruct attribute_group **drv_groups;    int (*match)(struct device *dev, struct device_driver *drv);    int (*probe)(struct device *dev);    void (*remove)(struct device *dev);};

bus_type 的典型应用是总线注册流程,以 PCI 总线为例,内核会定义并初始化 PCI 对应的 bus_type 实例,填充名称、匹配函数、属性组等关键信息,随后通过总线注册函数将其加入系统。

注册完成后,内核会自动在 /sys/bus 目录下创建名为 pci 的目录,作为 PCI 总线在 sysfs 中的可视化体现。该目录下会自动生成 devices 与 drivers 子目录,前者用于展示所有挂载在 PCI 总线上的设备节点,后者则列出所有已注册的 PCI 驱动程序。通过这种结构,用户与内核工具可以直观查看、管理总线设备与驱动,这也是 Linux 设备驱动模型标准化、层次化设计的典型体现。

2.4 device:设备在内核的呈现

device 结构体是 Linux 内核中用于抽象和表示硬件设备的核心数据结构,统一封装了设备的标识、所属总线、关联驱动、设备号及系统管理所需的全部信息。

device 结构体通过内嵌 kobject 对象与 sysfs 文件系统关联,该 kobj 成员负责实现设备的引用计数、生命周期管理以及树形层次结构组织。设备名用于唯一标识一个设备,使系统和用户能够清晰区分不同设备。bus 指针指向设备所连接的总线对应的 bus_type 结构体,设备通过该指针与总线交互,使用总线提供的匹配、资源分配等服务。

driver 指针指向与设备匹配成功的 device_driver 结构体,若设备暂未找到驱动,该指针为空。platform_data 用于存放平台相关的私有数据,常见于平台总线设备,保存硬件地址、中断号、GPIO 配置等板级信息。devt 为设备号,由主设备号与次设备号构成,是系统中字符设备与块设备的唯一标识。

// device 核心结构体简化示例struct device {struct kobject kobj;    const char *init_name;struct bus_type *bus;struct device_driver *driver;    void *platform_data;    dev_t devt;};

设备注册通过 device_register 函数完成,函数执行时会先初始化 device 结构体内部的 kobject 对象与默认属性,随后将设备挂载到所属总线的设备管理链表中。挂载完成后,总线会自动调用 bus_type 中的 match 函数,对设备与总线上的驱动进行匹配检查。

若匹配成功,设备与驱动完成绑定,驱动的 probe 函数会被调用以初始化设备。注册成功后,内核会在 sysfs 文件系统对应的总线目录下创建与该设备对应的目录,用户可通过该目录查看设备状态、设备号、驱动信息等相关属性。

2.5 device_driver:驱动的内核表示

device_driver 结构体是 Linux 内核中驱动程序的抽象表示,用于描述驱动的基本信息、所属总线、匹配规则以及设备操作接口,是实现驱动与设备绑定的核心数据结构。该结构体包含多个关键成员,用于驱动的识别、匹配与管理。

其中 name 字段表示驱动名称,用于唯一标识一个驱动程序。bus 指针指向驱动对应的总线类型,标明该驱动支持哪一类总线上的设备。owner 指针指向驱动所属的内核模块,用于模块引用计数与生命周期管理。mod_name 表示驱动模块名称。suppress_bind_attrs 用于控制是否在 sysfs 中开放驱动绑定属性。probe_type 用于指定设备探测的执行方式。

of_match_table 是设备树匹配表,驱动通过该表中的 compatible 属性与设备树节点完成匹配,是嵌入式系统中最常用的匹配方式。acpi_match_table 用于基于 ACPI 规范的设备匹配。probe 函数在驱动与设备匹配成功后执行,主要完成设备初始化、资源申请、硬件配置等工作。remove 函数在设备卸载时调用,用于释放中断、内存等系统资源。

// device_driver 核心结构体简化示例struct device_driver {    const char                  *name;struct bus_type             *bus;struct module               *owner;    const char                  *mod_name;    bool                        suppress_bind_attrs;enum probe_type             probe_type;    conststruct of_device_id   *of_match_table;    conststruct acpi_device_id *acpi_match_table;    int  (*probe)(struct device *dev);    void (*remove)(struct device *dev);};

驱动注册通过 driver_register 函数完成,函数首先对 device_driver 结构体进行初始化,然后将驱动添加到对应总线的驱动管理链表中。注册完成后,总线会自动遍历已挂载的设备列表,调用 bus_type 的 match 函数进行驱动与设备的匹配检查。

若匹配成功,总线会自动绑定驱动与设备,并执行驱动的 probe 函数完成设备初始化。注册成功后,内核会在 sysfs 文件系统中对应总线目录的 drivers 目录下创建以驱动名称命名的目录,用户可通过该目录查看驱动信息、绑定状态及相关属性,实现对驱动的可视化管理与配置。

三、设备驱动模型的工作原理

面试题写作模版

了解了设备驱动模型的基本概念和核心组件之后,下面我来给大家讲讲它的工作原理,这其中主要涉及设备和驱动的注册、匹配过程以及数据传输与交互这几个关键环节。

3.1 设备和驱动的注册

在系统启动或者新设备接入时,设备和驱动都会向内核进行注册,这个过程就像是员工入职时要在公司的人事系统里登记个人信息一样。

对于设备来说,当硬件设备被识别后,系统会为它创建一个对应的设备对象,这个对象包含了设备的各种属性信息,比如设备的名称、类型、硬件地址、资源需求等等。以 U 盘插入电脑为例,USB 总线会检测到新设备的接入,然后创建一个表示这个 U 盘的设备对象,并将其相关信息记录下来,比如设备名称可能是 “/dev/sda1”,设备类型是存储设备,硬件地址则用于在 USB 总线上唯一标识这个 U 盘。

// 内核中注册一个驱动对象示例struct device_driver my_drv = {    .name = "my_usb_driver",    .bus = &usb_bus_type,    .probe = my_probe,    .remove = my_remove,};driver_register(&my_drv);

3.2 匹配过程

总线在设备驱动模型中扮演着 “红娘” 的角色,负责将设备和驱动进行匹配,看看哪一对 “郎才女貌” 能够携手合作。

总线会根据设备和驱动提供的信息,按照一定的规则进行匹配。一般来说,主要是通过比较设备和驱动的 ID 信息或者名称等。如果设备和驱动的信息能够匹配上,就好像找到了合适的搭档,它们就可以建立起关联。比如,当一个 PCI 设备插入电脑时,PCI 总线会遍历已经注册的 PCI 驱动,查找是否有驱动的 ID 与该设备的 ID 相匹配。如果找到了匹配的驱动,就会调用驱动的 probe 函数,对设备进行初始化配置,让设备能够正常工作。

// 总线 match 函数匹配示例static int my_bus_match(struct device *dev, struct device_driver *drv){    // 比较设备与驱动的名称或 ID 是否一致    return !strcmp(dev_name(dev), drv->name);}

但如果匹配失败,就意味着设备和驱动 “不合适”,设备无法正常工作。这种情况下,系统可能会提示用户缺少驱动程序,或者驱动不兼容等信息。比如,当你插入一个新的打印机,而电脑中没有安装对应的打印机驱动,或者安装的驱动版本不匹配时,打印机就无法被识别和使用,系统可能会弹出提示框,告知你需要安装正确的驱动程序。

3.3 数据传输与交互

当设备和驱动成功匹配后,就可以进行数据传输与交互了,这就像是两个已经建立联系的合作伙伴开始正式开展业务。

驱动程序会为设备提供一系列的操作接口,应用程序通过这些接口来访问设备,实现数据的传输和控制。例如,当我们在电脑上读取硬盘中的文件时,应用程序会向操作系统发出读取文件的请求。操作系统会将这个请求传递给硬盘驱动程序。

硬盘驱动程序会根据请求,向硬盘发送相应的命令,读取硬盘上的数据。然后,硬盘将数据返回给驱动程序,驱动程序再将数据传递给操作系统,最后操作系统将数据返回给应用程序,这样我们就能在应用程序中看到读取的文件内容了。

// 驱动提供设备操作接口示例(简化)ssize_t my_read(struct file *file, char __user *buf, size_t size, loff_t *ppos){    // 从硬件读取数据    read_data_from_device();    // 将数据传回用户空间    copy_to_user(buf, data_buffer, size);    return size;}

再比如,当我们使用浏览器上网时,浏览器会向操作系统发出发送网络请求的指令。操作系统将这个指令传递给网卡驱动程序。网卡驱动程序控制网卡将数据封装成网络数据包,通过网络线路发送出去。

同时,网卡驱动程序也会接收网络上返回的数据包,并将其解析后传递给操作系统,再由操作系统传递给浏览器,这样我们就能在浏览器上看到网页内容了。在这个过程中,设备驱动模型确保了数据在应用程序、操作系统和硬件设备之间的准确、高效传输。

四、rk-pcie 驱动案例

面试题写作模版

rk-pcie 驱动是一个典型的 platform 驱动,主要用于初始化 Rockchip SoC 内部的 PCIe 控制器,让其能顺利接入标准的 PCI 总线框架。在整个系统中,它起着承上启下的关键作用,是连接 SoC 内部 PCIe 控制器与外部 PCI 总线的桥梁。比如说,在基于 Rockchip 芯片的开发板中,rk-pcie 驱动负责将板载的 PCIe 控制器与外接的 PCIe 设备(如 PCIe 网卡、PCIe SSD 等)进行有效的连接和管理,使得这些外接设备能够在系统中正常工作。

rk-pcie 驱动依托 Linux 平台驱动框架实现设备匹配与加载,通过设备树兼容属性完成驱动与硬件节点的绑定,是嵌入式 PCIe 驱动的典型实现方式。

// rk-pcie 平台驱动注册与设备树匹配示例static conststruct of_device_id rockchip_pcie_of_match[] = {    { .compatible = "rockchip,rk3588-pcie" },    { /* 设备匹配结束标识 */ }};MODULE_DEVICE_TABLE(of, rockchip_pcie_of_match);staticstruct platform_driver rockchip_pcie_driver = {    .probe = rockchip_pcie_probe,    .remove = rockchip_pcie_remove,    .driver = {        .name = "rockchip-pcie",        .of_match_table = rockchip_pcie_of_match,    },};module_platform_driver(rockchip_pcie_driver);

系统启动时,rk-pcie 驱动模块被加载到内核中,内核会为驱动分配相应的内存空间,并对驱动中的一些全局变量和数据结构进行初始化,依托平台驱动的匹配机制,匹配设备树中对应的 PCIe 控制器节点,为后续硬件初始化工作奠定基础。

驱动加载完成后,会开始对 PCIe 控制器进行初始化操作,核心工作包括解析设备树中的资源信息,获取 PCIe 控制器的时钟频率、电源管理、寄存器地址等各类配置参数,再根据解析得到的参数对 PCIe 控制器寄存器进行逐一配置,完成时钟使能、硬件复位、功耗配置等操作,让 PCIe 控制器从休眠或初始状态切换为正常工作状态,保障设备稳定运行。

// PCIe 控制器硬件初始化核心示例static int rockchip_pcie_parse_dt(struct rockchip_pcie *pcie){    // 解析设备树,映射控制器物理寄存器地址    pcie->regs = devm_platform_ioremap_resource(pcie->pdev, 0);    // 解析并使能 PCIe 工作时钟    pcie->aclk = devm_clk_get(&pcie->pdev->dev, "aclk");    clk_prepare_enable(pcie->aclk);    // 解除硬件复位,初始化控制器状态    reset_control_deassert(pcie->rst);    return 0;}

PCIe 控制器初始化完成后,rk-pcie 驱动会在标准 PCI 总线框架中注册 root port,该端口是 PCI 总线的核心入口,所有下游外接 PCIe 设备的枚举、匹配与管理工作都需要通过该端口完成。驱动在注册 root port 的过程中,会向 PCI 总线框架提交设备类型、设备 ID 等关键信息,让内核总线系统能够准确识别、挂载并管理本地 PCIe 控制器。

// 注册 PCIe Root Port,接入内核 PCI 总线框架static int rockchip_pcie_host_init(struct rockchip_pcie *pcie){struct pci_host_bridge *bridge;    // 分配 PCI 总线桥接设备结构体    bridge = devm_pci_alloc_host_bridge(&pcie->pdev->dev, 0);    // 绑定 PCI 设备操作接口    bridge->ops = &rockchip_pcie_ops;    // 注册根总线,启动设备枚举流程    return pci_host_probe(bridge);}

root port 注册成功后,PCI 总线会自动启动下游设备枚举流程,通过发送标准枚举指令轮询总线上挂载的所有设备。接入总线的 PCIe 设备会主动响应枚举指令,向内核返回自身的厂商 ID、设备 ID、设备类型等硬件信息,内核根据这些信息为每一个设备分配唯一总线设备号,并在 /sys/bus/pci/devices/ 目录下自动创建对应的设备节点目录,完成硬件设备的系统注册,例如外接 PCIe 网卡、PCIe 固态硬盘等设备,都会在枚举后生成对应的系统设备文件。

设备枚举完成后,内核 PCI 驱动框架会根据设备的硬件标识信息,遍历系统内已注册的各类 PCI 驱动,完成设备与驱动的匹配工作,通过比对设备 ID、兼容属性等关键信息筛选适配驱动。当设备与驱动匹配成功后,内核会调用对应驱动的 probe 函数,完成设备硬件资源初始化、工作模式配置、中断与地址映射等操作,最终实现设备的正常加载与功能启用,让 PCIe 网卡、SSD 等设备能够正常响应系统指令、收发数据,实现正常的业务功能。

// rk-pcie 驱动总入口函数,整合初始化与设备枚举流程static int rockchip_pcie_probe(struct platform_device *pdev){struct rockchip_pcie *pcie;    // 分配驱动私有数据内存    pcie = devm_kzalloc(&pdev->dev, sizeof(*pcie), GFP_KERNEL);    // 解析设备树并初始化硬件    rockchip_pcie_parse_dt(pcie);    // 配置 PCIe 控制器工作参数    rockchip_pcie_init_controller(pcie);    // 注册总线并枚举下游设备    rockchip_pcie_host_init(pcie);    return 0;}

rk-pcie 驱动基于 Linux platform 驱动框架开发,依托设备树完成硬件匹配与资源配置,完整实现了 Rockchip 芯片 PCIe 控制器的初始化、总线注册、设备枚举与驱动匹配全流程。该驱动贴合 Linux 标准设备驱动模型,严格遵循设备注册、总线匹配、硬件初始化的核心逻辑,既完成了 SoC 内部 PCIe 控制器的底层硬件配置,又对接了标准 PCI 总线框架,为 PCIe 网卡、SSD 等外接设备提供了稳定的运行基础。

同时,整个驱动工作流程充分体现了设备树、总线机制、设备与驱动匹配等内核核心机制的协同作用,是嵌入式 Linux 设备驱动模型在实际硬件场景中典型且完整的应用案例。

end

如果这篇文章对你有所启发,欢迎点赞、在看,转发三连。星标⭐账号,还可以第一时间收到推送,感谢你的收看,我们下期再见~

往期干货推荐

【专栏模块嵌入式Linux
专栏模块】性能优化
专栏模块】面试八股文
专栏模块项目实战
【硬核干货缺了这些,别说你懂 Linux内核
硬核干货】缺了这些,别说你懂 Linux C/C++
【学习思维导图】Linux内核源码自主学习路线

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-02 23:28:01 HTTP/2.0 GET : https://f.mffb.com.cn/a/497935.html
  2. 运行时间 : 0.208465s [ 吞吐率:4.80req/s ] 内存消耗:4,907.64kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=48f8d9d58dea3a267927913e5e72e6c9
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001211s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001831s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000720s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000741s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001626s ]
  6. SELECT * FROM `set` [ RunTime:0.000598s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001693s ]
  8. SELECT * FROM `article` WHERE `id` = 497935 LIMIT 1 [ RunTime:0.001156s ]
  9. UPDATE `article` SET `lasttime` = 1783006081 WHERE `id` = 497935 [ RunTime:0.013815s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000758s ]
  11. SELECT * FROM `article` WHERE `id` < 497935 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001383s ]
  12. SELECT * FROM `article` WHERE `id` > 497935 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001382s ]
  13. SELECT * FROM `article` WHERE `id` < 497935 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002554s ]
  14. SELECT * FROM `article` WHERE `id` < 497935 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001927s ]
  15. SELECT * FROM `article` WHERE `id` < 497935 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004373s ]
0.214543s