当前位置:首页>Linux>Linux 6.6 基础驱动模型框架详解:从内核对象到设备绑定

Linux 6.6 基础驱动模型框架详解:从内核对象到设备绑定

  • 2026-02-05 00:49:49
Linux 6.6 基础驱动模型框架详解:从内核对象到设备绑定

引言

在 Linux 内核中,驱动程序并非孤立存在的代码片段。它们是庞大而精密的“驱动模型”(Driver Model)的一部分。这个模型的核心位于 drivers/base/ 目录下,它抽象并统一了设备(Device)、驱动(Driver)、总线(Bus)和类(Class)之间的关系,为所有硬件子系统(如 I2C, SPI, USB, PCI 等)提供了一套通用的注册、匹配、管理和交互机制。理解这套基础框架,是编写任何现代 Linux 驱动程序的前提。

本教材将带领你深入 drivers/base/ 的核心,剖析其背后的设计哲学与实现原理。

一、概述:驱动模型的四大支柱

驱动模型的核心思想是解耦。它将硬件实体(设备)与软件逻辑(驱动)分离,并通过一个中介(总线)来完成它们的动态匹配。此外,为了方便用户空间的访问,又引入了“类”的概念。

·设备 (Device): 代表一个具体的硬件实例或逻辑功能单元。例如,一个 I2C 总线上的温度传感器芯片。

·驱动 (Driver): 负责控制一类设备的软件模块。它知道如何与特定类型的硬件通信。

·总线 (Bus): 设备与驱动之间的桥梁。它定义了设备和驱动如何被发现、如何进行匹配的规则。例如,I2C 总线、平台总线(Platform Bus)。

·类 (Class): 从功能角度对设备进行分组,与物理连接方式无关。例如,所有的输入设备(键盘、鼠标)都属于 input 类,所有的网络接口都属于 net 类。

这种设计使得内核可以:

1.动态管理:支持热插拔,在设备插入或移除时自动加载或卸载驱动。

2.统一接口:为用户空间(通过 sysfs)和内核其他部分提供一致的视图。

3.资源安全:确保在设备移除时,其占用的所有资源(内存、中断等)都能被正确释放。

1.1 核心文件结构

drivers/base/ 目录的组织直接反映了上述四大支柱:

·core.c: 设备 (device) 的生命周期管理核心。

·bus.c: 总线 (bus_type) 的注册、管理和匹配逻辑。

·driver.c: 驱动 (device_driver) 的注册和管理。

·class.c: 设备类 (class) 的管理,用于创建 /dev 下的设备节点。

·platform.c: 平台总线的具体实现,这是最常用的虚拟总线。

·dd.c:Device-Driver 绑定的核心逻辑,是匹配流程的执行者。

·devres.cDevice Resource Management,革命性的自动资源管理机制。

1.2 核心数据结构:内核的“积木”

驱动模型的一切操作都围绕着几个关键的数据结构展开。

1.2.1 struct device:万物皆设备

struct device 是驱动模型中最基础的对象,代表了系统中的每一个硬件或逻辑设备。

核心成员原理解析:

·kobj (kobject): 这是整个驱动模型乃至 sysfs 的基石。kobject 提供了统一的引用计数、生命周期管理和 sysfs 表示能力。每个 device 在 sysfs 中的目录(如 /sys/devices/...)就是由其 kobj 创建的。原理:通过 kobject,内核可以追踪一个对象何时被创建、被引用、以及何时可以安全销毁。

·parent: 构建设备的层次树。例如,一个 USB 设备的父设备是其所在的 USB 端口,而 USB 端口的父设备又是 USB 控制器。这形成了清晰的拓扑结构,对电源管理和依赖关系至关重要。

·driver: 指向当前与该设备成功绑定的驱动程序。一旦绑定,设备就可以通过此指针调用驱动提供的各种操作。

·bus 和 class: 分别指向设备所属的总线类型和设备类。这两个指针决定了设备在 sysfs 中的“家”(/sys/bus/... 和 /sys/class/...)。

·of_node: 指向设备树(Device Tree)中的对应节点。在 ARM 等架构上,设备的硬件信息(如寄存器地址、中断号)主要通过设备树传递,驱动通过 of_node 来解析这些信息。原理:实现了硬件描述与驱动代码的分离,使同一个驱动可以适配多种硬件配置。

·devres_head: 设备资源链表头。这是 devres 机制的关键,所有通过 devm_* 系列函数申请的资源都会挂在这个链表上,确保在设备移除时自动释放。

1.2.2 struct device_driver:设备的灵魂

struct device_driver 封装了控制一类设备所需的所有软件逻辑。

核心成员原理解析:

·probe: 这是驱动最重要的回调函数。当总线发现一个新设备,并且通过 match 函数确认该驱动可以控制此设备后,就会调用 probe。在此函数中,驱动会初始化硬件、申请资源、注册字符设备等。原理:probe 是驱动真正开始工作的起点。

·remove: probe 的反向操作。当设备被移除或驱动被卸载时调用,用于清理 probe 中申请的所有资源。

·of_match_table: 设备树匹配表。它是一个 of_device_id 结构体数组,其中包含了驱动所能支持的设备的 compatible 字符串。总线的 match 函数会比对设备树节点的 compatible 属性和此表,以决定是否匹配。原理:这是现代 Linux 驱动(尤其是嵌入式)最主要的匹配方式,取代了传统的硬编码 ID 表。

·pm: 电源管理操作集。定义了设备在系统挂起(suspend)和恢复(resume)时应执行的操作。

1.2.3 struct bus_type:匹配的裁判

struct bus_type 定义了一种总线的行为规范。

核心成员原理解析:

·match: 最关键的函数。它的职责是判断一个给定的 device 是否能被一个给定的 device_driver 所驱动。不同的总线有不同的匹配逻辑。例如,USB 总线根据 Vendor ID 和 Product ID 匹配,而平台总线则优先使用设备树 compatible 字段匹配。原理:match 函数是设备与驱动能否“牵手”的唯一裁决者。

·uevent: 当设备状态发生变化(如添加、移除、绑定)时,内核需要通知用户空间的 udev 或 mdev 守护进程,以便它们能创建或删除 /dev 节点。uevent 回调负责填充要发送给用户空间的环境变量(如 DEVPATHMODALIAS 等)。

·p (subsys_private): 一个私有数据结构,内部维护了两个重要的链表:klist_devices(挂载在此总线上的所有设备)和 klist_drivers(注册到此总线的所有驱动)。总线正是通过遍历这两个链表来执行匹配操作的。

1.2.4 struct class:面向用户的窗口

struct class 主要服务于用户空间。

核心成员原理解析:

·devnode: 回调函数,用于确定在 /dev 目录下创建的设备节点的名称和权限。例如,tty 类会创建 ttyS0, ttyUSB0 等节点。

·dev_groups: 定义了属于此类的所有设备在 sysfs 中共有的属性文件(attribute files),方便用户空间查看或配置设备。

二、设备注册和绑定流程:一场精心策划的“相亲”

设备和驱动的注册是独立进行的。内核的核心任务就是在两者都出现后,通过总线将它们正确地“撮合”在一起。

2.1 设备注册流程:device_register()

当你调用 device_register() 时,内核会执行以下步骤:

1.device_initialize(): 初始化 device 结构体内部的各种链表和锁。此时,设备只是一个“空壳”,尚未进入系统。

2.device_add(): 这是设备正式“亮相”的时刻。

o建立父子关系:设置设备的父设备,通常是总线的根设备(如 platform_bus)。

o创建 sysfs 入口:通过 kobject_add() 在 /sys/devices/ 下创建对应的目录。

o触发总线探测:调用 bus_probe_device(dev)。这是匹配流程的入口。

o尝试绑定bus_probe_device() 会遍历该设备所属总线上所有已注册的驱动,对每个驱动调用 __device_attach()__device_attach() 会先调用总线的 match 函数,如果匹配成功,则调用 driver_probe_device(),最终执行驱动的 probe 函数。如果 probe 成功,设备和驱动就正式“绑定”了。

o创建类链接:如果设备有指定 class,还会在 /sys/class/... 下创建一个指向设备 sysfs 目录的符号链接。

原理总结:设备注册是一个主动寻找“伴侣”的过程。它会立即尝试与所有现有的驱动进行匹配。

2.2 驱动注册流程:driver_register()

驱动的注册流程与设备类似,但方向相反。

1.bus_add_driver(): 将驱动添加到其所属总线的 klist_drivers 链表中,并在 /sys/bus/.../drivers/ 下创建 sysfs 目录。

2.尝试绑定:关键一步!它会遍历该总线上所有已注册的设备,对每个设备调用 __driver_attach()。这个函数同样会执行 match -> probe 的流程。

原理总结:驱动注册也是一个主动寻找“伴侣”的过程。它会立即尝试去匹配所有现有的设备。

这种双向触发机制确保了无论设备先到还是驱动先到,只要两者都存在于系统中,最终都能成功绑定。

2.3 设备与驱动匹配:match 与 probe 的协奏曲

匹配的核心在于 driver_match_device(),它直接调用 drv->bus->match(dev, drv)

平台总线 (platform_bus_type) 为例,其 platform_match 函数的匹配优先级如下:

1.ID 表匹配 (id_table):传统的 C 字符串匹配,现已较少使用。

2.设备树匹配 (of_driver_match_device):最常用。比对设备的of_node->compatible 属性和驱动的 of_match_table

3.ACPI 匹配:用于 x86 ACPI 系统。

4.名称匹配:最后的兜底方案,比对 pdev->name 和 drv->name

一旦 match 返回真,内核就会调用 driver_probe_device()。这个函数是安全的关键:

·它会先调用总线级别的 probe(如果有),然后才是驱动自己的 probe

·如果驱动的probe失败(返回非0值),内核会认为绑定失败,并清理现场(如清除 dev->driver 指针)。

·如果 probe成功,则调用 device_bind_driver(),正式建立设备和驱动之间的双向链接,并在 sysfs 中创建 driver 符号链接。

三、平台设备驱动(Platform Driver):嵌入式世界的基石

平台设备是一种特殊的设备,它们连接在物理总线上(如 I2C, SPI),而是直接集成在 SoC 内部(如 UART, I2C 控制器, GPIO 控制器)。平台总线是一个虚拟的软件总线,用于管理这些片上设备。

3.1-3.3 注册原理

·platform_device: 内嵌了一个 struct device dev,同时还包含了硬件资源信息(resource 数组,描述了内存区域、中断号等)。

·platform_driver: 内嵌了一个 struct device_driver driver,并提供了专门针对 platform_device 的 probe/remove 回调。

·注册时的“包装”: 当你调用 platform_driver_register() 时,它会将 platform_driver 的 probe 函数“包装”成一个标准的 device_driver.probe。这个包装函数 (platform_drv_probe) 会自动将传入的 struct device * 转换为 struct platform_device *,再调用你写的 probe原理:这是一种典型的适配器模式,让平台驱动可以无缝接入通用的驱动模型。

3.4 资源获取:devm_* 的优雅

在 probe 函数中,驱动需要获取硬件资源。传统做法是手动申请和释放,极易出错。Linux 引入了 devm_* (managed device resource) 系列 API。

·devm_platform_ioremap_resource(): 获取并映射 I/O 内存。

·devm_request_irq(): 申请中断。

·devm_clk_get(): 获取时钟。

工作原理:            这些函数在申请资源的同时,会将一个“释放函数”和资源指针打包成一个 devres 对象,并将其添加到 device.devres_head 链表中。当设备被移除(device_del)或 probe 失败时,内核会自动遍历此链表,并调用每个 devres 对象的释放函数。原理:利用 RAII (Resource Acquisition Is Initialization) 思想,将资源的生命周期与设备对象的生命周期绑定,彻底解决了资源泄漏问题。

四、设备资源管理(Devres):内核的“智能管家”

如上所述,devres 是驱动开发的最佳实践。它不仅简化了代码,更提高了可靠性。其核心在于 devres_add() 和 devres_release_all() 这一对函数,前者将资源纳入管理,后者在适当时机批量释放。

五、设备链接(Device Links):处理复杂的依赖关系

现代 SoC 中,设备之间存在复杂的依赖。例如,一个 USB 控制器(消费者)依赖于一个时钟(供应商)。如果在 USB 控制器还在运行时关闭了时钟,系统就会崩溃。

设备链接 (device_link) 就是用来显式声明这种 consumer -> supplier 依赖关系的机制。

·原理: 当创建一个链接后,内核的电源管理(PM)和驱动核心会感知到这种依赖。在挂起(suspend)时,会先挂起消费者,再挂起供应商;在恢复(resume)时,则先恢复供应商,再恢复消费者。这确保了依赖关系的正确性。

六、调试方法:窥探内核的内心世界

驱动模型与 sysfs 深度集成,这为我们提供了强大的调试手段:

·/sys/devices/: 查看完整的设备树。

·/sys/bus/*/devices/: 查看特定总线上的设备。

·/sys/bus/*/drivers/: 查看驱动及其绑定的设备。

·echo ... > /sys/.../bind/unbind: 手动触发绑定/解绑,用于测试。

·dynamic_debug: 动态开启内核源码中的调试打印,无需重新编译。

七、常见问题与解决方案

·-EPROBE_DEFER: 这不是一个错误,而是一个优雅的延迟机制。当驱动在 probe 时发现它依赖的另一个设备(如 regulator, clock)尚未准备好,它可以返回 -EPROBE_DEFER。内核会将此设备放入一个延迟队列,并在后续有新设备加入时重试 probe原理:解决了设备初始化顺序的难题,无需在驱动中编写复杂的轮询或定时器逻辑。

八、学习建议

1.动手实践:从编写一个简单的 LED 平台驱动开始,亲身体验 probe/remove 的全过程。

2.阅读源码:按照 core.c -> dd.c -> bus.c -> platform.c 的顺序阅读 Linux 6.6 的源码,理解函数调用栈。

3.善用工具:熟练掌握 ls /sys/...dmesg 和 dynamic_debug,它们是你的眼睛和耳朵。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-07 15:19:34 HTTP/2.0 GET : https://f.mffb.com.cn/a/471357.html
  2. 运行时间 : 0.135872s [ 吞吐率:7.36req/s ] 内存消耗:4,761.20kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=741256fd1986afe103430a2ecec0790d
  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.000408s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000635s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000316s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000247s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000528s ]
  6. SELECT * FROM `set` [ RunTime:0.000201s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000529s ]
  8. SELECT * FROM `article` WHERE `id` = 471357 LIMIT 1 [ RunTime:0.000607s ]
  9. UPDATE `article` SET `lasttime` = 1770448774 WHERE `id` = 471357 [ RunTime:0.013403s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000302s ]
  11. SELECT * FROM `article` WHERE `id` < 471357 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000508s ]
  12. SELECT * FROM `article` WHERE `id` > 471357 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000789s ]
  13. SELECT * FROM `article` WHERE `id` < 471357 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000856s ]
  14. SELECT * FROM `article` WHERE `id` < 471357 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000910s ]
  15. SELECT * FROM `article` WHERE `id` < 471357 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.050965s ]
0.137418s