当前位置:首页>Linux>用"假"驱动读懂真linux内核

用"假"驱动读懂真linux内核

  • 2026-08-19 10:12:23
用"假"驱动读懂真linux内核

用"假"驱动读懂真内核:linux-dummy-drivers 仓库解读

学习 Linux 驱动开发最大的障碍往往不是代码本身,而是没有硬件。写 I2C 驱动需要一块传感器,写 DRM 驱动需要一块 LCD 屏,写 V4L2 驱动需要一台摄像头——而 linux-dummy-drivers 这个仓库正是为此而生:它用一套"假"驱动,把内核各子系统的真实骨架完整地搭了出来,让学习者在纯软件环境下就能把每个子系统摸透。


一、仓库是什么

这是嵌入式工程师 IotaHydrae(Hua Zheng,来自 embeddedboys)维护的一个 Linux dummy drivers 合集。所谓 dummy driver,就是用代码"扮演"一块硬件、但背后没有任何真实硅片的驱动程序。仓库的目标写得很直白:

These drivers are designed with reduced complexity to simulate various hardware components and are intended for learning purposes. With this repository, you can easily understand how the driver works when invoked from userspace tools. It is a good starting point if you want to develop an actual hardware driver.

即:降低复杂度、模拟硬件、面向学习。作者在 WSL2 环境(Ubuntu 24.04.3,内核 6.6.114.1-microsoft-standard-WSL2+)上完成了全部验证——也就是说,一台没有开发板的普通 PC 就能完整复现这些实验,仓库还维护着 7.0.0-28-generic 与 rpi-6.12.y 分支,适配不同内核版本。

二、仓库总览

整个仓库约 2700 行 C 代码,按子系统分目录,每个目录自带 README、Makefile 和验证脚本,覆盖了从"三行 Hello World"到"运行时修改机器码"的完整梯度:

目录
模拟的子系统
亮点
用户态验证方式
hello/
最小模块
20 行的经典入门
insmod
 看日志
template/
驱动骨架
字符设备 + class + device 的标准模板
复制改名即用
bus/basic_bus
设备模型
最简 bus / device / driver 匹配
看 match → probe 日志
bus/dummy_bus
设备模型
讲清 struct device 为何是"基类"
阅读 + 对照源码
v4l2/
视频采集
定时器喂帧,默认播放动画
cheese 摄像头软件
drm/
显示框架
drm_simple_pipe + 脏区域追踪
make dump
 导出 PNG
fbdev/
帧缓冲
传统 fbdev 完整链路
fbcat / fbgrab 截图
i2c/
I2C 控制器
假 adapter + 用户态建设备
i2c-tools 全地址扫描
spi/
SPI 主机
假 master + spidev 绑定
spi-test
 读写
gpio/
GPIO 控制器
16 路 gpio_chip,每个回调都打日志
libgpiod / sysfs
regulator/
电源管理
regulator + consumer 一对
阅读消费端请求流程
firmware/
固件加载
request_firmware 完整路径
dynamic debug 追踪
static_call/
内核机制
运行时函数修补,附反汇编分析
直接看机器码变化

开发状态:v4l2、fbdev、drm_simple_pipe、i2c adapter、spi master、gpiochip 已完成;usb host、sound、dma engine 仍在 TODO 中——这也暗示了这套方法论完全可以继续复制到更多子系统。

三、从最小的开始:hello 与 template

hello/ 只有 20 行,是标准的 module_init / module_exit 骨架,适合第一次 insmod 的仪式感。

真正有"工程感"的是 template/,它把字符设备驱动的固定套路提炼成了 66 行模板:

alloc_chrdev_region(&template->dev_num, 0, 1, "dummy-template");
template->class = class_create("dummy-template-class");
template->dev  = device_create(template->class, NULL, template->dev_num, NULL, "dummy-template-dev");
/* subsys alloc & register */

register 失败时从 device_destroy → class_destroy → unregister_chrdev_region 逐级回滚,错误处理路径清晰,还预留了 /* subsys alloc & register */ 注释位。作者的用法是:

cp template -rd static_call   # 复制后全局替换字符串即可

regulator 驱动就是这么从模板长出来的——先有骨架,再填子系统 API,这正是 dummy 方法论的精髓。

四、理解内核的设备模型:bus/basic_bus 与 bus/dummy_bus

设备模型(driver model)是内核驱动架构的基石,但直接读 drivers/base/ 源码很容易迷失。bus/basic_bus 把整个流程压缩到 139 行,加载后的日志就是最生动的教材:

[  +0.000488] dummy-bus, dummy_bus_init: bus registered
[  +0.000505] dummy_device_init, device registered
[  +0.000728] dummy-bus: match(dummy0 <-> dummy0)
[  +0.000525] dummy_driver_probe
[  +0.000295] dummy_driver_init, driver registered

注册 bus → 注册 device → bus 遍历匹配 → 命中后调用 driver 的 probe,一条完整链路肉眼可见。

bus/dummy_bus 更进一步,回答了一个新手最容易困惑的问题:为什么平台、SPI、I2C、PCI、USB 各有一套 device/driver 类型,而不是共用 struct device 因为 SPI 需要存片选号、模式、频率、bits_per_word,这些信息没有地方放。答案是在 C 语言里用组合模拟继承:

struct platform_device { ...struct device dev; };
struct spi_device     {
 ...struct device dev; };
struct i2c_client     {
 ...struct device dev; };

struct device 就是所有总线设备的"基类"。看懂这段,再回看内核源码里的各种 container_of,一切就顺理成章了。

五、看得见的显示:fbdev 与 drm

显示子系统的痛苦在于:没有屏幕就什么都验证不了。这个仓库用两种方式解决了。

fbdev(336 行)dummy-fb.c 注册一个传统帧缓冲,在 PC 上会出现在 /dev/fb1。用 fbcat 截图:

sudo ./fbcat /dev/fb1 > screenshot.ppm
sudo
 ./fbgrab -d /dev/fb1 output.png

DRM(355 行):基于 drm_simple_display_pipe,加载后生成一个 480x320 的 fb,并通过 drm_atomic_helper_damage_merged 把脏区域打印出来——这是学习 DRM 损伤追踪(damage tracking)的绝佳入口:

[ 1165.018451] dummy-drm: dummy_drm_pipe_update
[ 1165.018454] dummy-drm: x1: 184, y1: 48, x2: 192, y2: 64

当你在终端里移动鼠标时,dmesg 里就能看到屏幕上哪个矩形区域被重绘。一个假的 pipe 函数,把 atomic 提交、plane 状态、framebuffer 的生命周期全部串了起来,还能 make dump 用 netpbm 把显存导成 PNG。

六、能"造假"外设的总线:i2c 与 spi

I2Ci2c.c 注册一个假 adapter,配好用户态验证链:

sudo modprobe i2c-dev
sudo
 insmod dummy_i2c.ko
i2cdetect -l        # 看到 dummy_i2c bus0
sudo
 i2cdetect -y 0 # 扫描出 0x08 ~ 0x77 全部地址
echo
 eeprom | sudo tee /sys/bus/i2c/devices/i2c-0/new_device

i2cdetect -y 0 扫出一整排地址的那一刻,I2C 的"控制器—总线—从设备"三层模型瞬间具象化。README 还顺手记录了内核里 no algo supplied 的校验逻辑位置(drivers/i2c/i2c-core-base.c),把异常路径也变成了学习材料。

SPI:假 master 注册后,用 driver_override 把用户态 spidev 绑上去:

echo spidev | sudo tee /sys/bus/spi/devices/spi0.0/driver_override
echo
 spi0.0 | sudo tee /sys/bus/spi/drivers/spidev/bind

tests/spi-test 直接对 spidev 做读写,验证整条链路。

七、让工具链跑起来:gpio、regulator、firmware

这三个驱动展示了一个共同哲学:dummy driver 要让真实用户态工具能"端到端"工作

gpio:注册一个 16 路的 gpio_chipget / set / request / free / direction_input / direction_output 全部实现——而每个回调函数体只有一行 dev_info(..., "%s", __func__)。当你用 libgpiod 或 sysfs 操作 GPIO 时,dmesg 里会依次打印出内核到底调用了哪些回调、以什么顺序调用。这就是 dummy driver 最核心的价值:把内核与驱动之间的每一个握手都变成可见的日志。

regulator:一个 regulator.c(provider)+ 一个 consumer.c(consumer),演示了 regulator 框架"请求—获取—使能—调压—释放"的完整生命周期,而消费端只需要 74 行。

firmwarefw.c 调用 request_firmware(),配合 dynamic debug 打开 drivers/base/firmware_loader/* 的日志,能看到固件加载器按 /lib/firmware/updates/ → /lib/firmware/ → .xz 压缩包的顺序逐一尝试的完整搜索路径,连"找不到文件"的失败路径都成了教学素材。

八、进阶:static_call 深度笔记

仓库里最"硬核"的一篇是 static_call/ 的 README,它已经不满足于"模拟硬件",而是把 static_call 这个内核机制本身讲透了:函数指针灵活但间接跳转贵,普通调用快但不能换实现,static_call 用"启动时编成普通 call,运行时改写 call 目标机器码"来兼得两者。文中附上了 objdump 反汇编,展示 __SCT__dummy_static_call 里的 jmp 指令如何在 static_call_update() 之后被改写、.static_call_sites ELF section 如何记录每个调用点,并对比了 trampoline 与 inline 两种实现。

这也展示了 dummy driver 的另一个用法:当你想搞懂某个内核机制,就写一个最小的 dummy 模块去触发它,然后用观测工具把机制本身"照"出来

九、为什么 dummy driver 能帮你理解一个子系统

归结起来,这个仓库的方法论可以总结为四点:

  1. 1. 剥离硬件,聚焦 API。真实驱动的代码量里,硬件时序、寄存器操作、中断底半部往往占去八成,剩下两成才是子系统 API。dummy driver 砍掉那八成,剩下的就是子系统的"纯骨架"——drm_simple_pipe 五个回调、gpio_chip 六个 ops、vb2_queue 四个流程,一眼看尽。
  2. 2. 全链路可观测。每个回调都打日志,配合 dmesg 就能"看见"内核的调度:用户态工具敲一下,内核调用了哪个函数、传了什么参数、按什么顺序执行,全部透明。这比读一百篇博客都直观。
  3. 3. 端到端打通用户态。i2cdetect、cheese、fbcat、libgpiod、spidev——这些真实工具全部可以驱动 dummy 硬件。你学会的不只是"怎么写驱动",而是"驱动在系统里如何被使用",这才是完整的学习闭环。
  4. 4. 可演进为真实驱动。作者自己的 i2c-suniv(Allwinner suniv SoC 的 I2C adapter)就是这条路径的实证:dummy 验证框架 → 替换为真实硬件操作 → 变成能跑的产品驱动。dummy 不是终点,是起点。

十、上手建议

建议按这个顺序读:

  1. 1. hello → template:建立最小模块的直觉;
  2. 2. bus/basic_bus → bus/dummy_bus:搞懂设备模型;
  3. 3. 挑一个你正在用的子系统深入:做显示的读 fbdev / drm,做嵌入式的读 i2c / spi / gpio
  4. 4. 用 make test 复现日志,再对照内核源码(仓库 README 已经标好了对应源码位置);
  5. 5. 最后尝试用 template 复制出自己的第一个 dummy driver。

唯一的门槛是环境:需要一份可加载模块的内核(WSL2 或任意发行版均可),clone 下来 make 就能跑。

结语

Linux 内核的复杂之处,从来不是某个子系统本身,而是它被埋藏在庞大工程代码中的调用关系。linux-dummy-drivers 用"假硬件"换来了"真可见",把内核与驱动之间的每一次握手都摆在台面上。对初学者,它是一条加速理解子系统的最短路径;对老手,它是快速验证某个子系统行为的脚手架。下次想搞懂某个子系统时,不妨先问自己一句:能不能先写一个 dummy 驱动,把它"假"出来?

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-22 03:28:36 HTTP/2.0 GET : https://f.mffb.com.cn/a/508835.html
  2. 运行时间 : 0.211276s [ 吞吐率:4.73req/s ] 内存消耗:4,421.27kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9375e96f3462af788c96aa102acf5f1f
  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.001118s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001612s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.006597s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000825s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001635s ]
  6. SELECT * FROM `set` [ RunTime:0.000681s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001847s ]
  8. SELECT * FROM `article` WHERE `id` = 508835 LIMIT 1 [ RunTime:0.005732s ]
  9. UPDATE `article` SET `lasttime` = 1787340516 WHERE `id` = 508835 [ RunTime:0.004439s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000688s ]
  11. SELECT * FROM `article` WHERE `id` < 508835 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001049s ]
  12. SELECT * FROM `article` WHERE `id` > 508835 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001083s ]
  13. SELECT * FROM `article` WHERE `id` < 508835 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001727s ]
  14. SELECT * FROM `article` WHERE `id` < 508835 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002113s ]
  15. SELECT * FROM `article` WHERE `id` < 508835 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.010359s ]
0.214889s