当前位置:首页>Linux>Linux platform 总线

Linux platform 总线

  • 2026-02-19 08:33:53
Linux platform 总线
大家好,我是王鸽,今天这篇文章承接总线驱动设备,具体化实例,好了进入主题。
platform总线
Linux发明了一种虚拟的总线, 称为platform总线,platform 总线是 bus_type 的一个具体实例,相应的设备称为platform_device,而驱动成为platform_driver

物理总线 vs 虚拟总线

  • 物理总线:实际存在的硬件总线(如 I2C、SPI、PCI、USB),设备和驱动通过物理总线通信;
  • Platform 总线:Linux 内核定义的 虚拟总线bus_type platform_bus_type),专为 SoC 中没有标准物理总线的外设(如片上定时器、GPIO、UART 控制器)设计,本质是内核的软件抽象。
定义在文件 drivers/base/platform.c, platform 总线定义如下:
struct bus_type platform_bus_type = {    .name = "platform",    .dev_groups = platform_dev_groups,   .match = platform_match,   .uevent = platform_uevent,  .pm = &platform_dev_pm_ops,};
platform_bus_type 就是 platform 平台总线,其中 platform_match 就是匹配函数。
platform_match 函数定义在文件 drivers/base/platform.c 中,函数内容如下所示:
staticintplatform_match(struct device *dev, struct device_driver *drv){struct platform_device *pdev = to_platform_device(dev);struct platform_driver *pdrv = to_platform_driver(drv);/* Attempt an OF style match first */if (of_driver_match_device(dev, drv))return 1;/* Then try ACPI style match */if (acpi_driver_match_device(dev, drv))return 1;/* Then try to match against the id table */if (pdrv->id_table)return platform_match_id(pdrv->id_table, pdev) != NULL;/* fall-back to driver name match */return (strcmp(pdev->name, drv->name) == 0);}

驱动和设备的匹配有四种方法,

第一种匹配方式:of_driver_match_device(dev, drv),OF 类型的匹配,也就是设备树采用的匹配方式,device_driver 结构体(表示设备驱动)中有个名为of_match_table的成员变量,此成员变量保存着驱动的compatible匹配表,设备树中的每个设备节点的 compatible 属性会和 of_match_table 表中的所有成员比较,查看是否有相同的条目,如果有的话就表示设备和此驱动匹配,设备和驱动匹配成功以后 probe 函数就会执行。

第二种匹配方式ACPI 匹配方式,

Linux ACPI 匹配是内核通过 _HID(硬件 ID)、_CID(兼容 ID) 与驱动的 acpi_match_table 进行字符串比对。

比如:

#include<linux/acpi.h>static const struct acpi_device_id my_acpi_ids[] = {    { "ACME0001"0 },  // 匹配 _HID    { "ACME0002"0 },  // 匹配 _CID    { "PRP0001"0 },   // 兼容 DT 模式    { }                 // 结束标记};MODULE_DEVICE_TABLE(acpi, my_acpi_ids);  // 导出给模块自动加载

另外调试与查看

  • 查看系统 ACPI 设备:cat /sys/bus/acpi/devices/*/hid
  • 查看驱动 ACPI 匹配表:modinfo my_driver.ko | grep alias
  • 内核日志:dmesg | grep -i acpi 查看匹配与 probe 过程

第三种匹配方式, id_table 匹配,每个 platform_driver 结构体有一个 id_table成员变量,顾名思义,保存了很多 id 信息。这些 id 信息存放着这个 platformd 驱动所支持的驱动类型。

platform_match_id(pdrv->id_table, pdev) != NULL

具体函数如下:

static const struct platform_device_id *platform_match_id(const struct platform_device_id *id,struct platform_device *pdev){while (id->name[0]) {if (strcmp(pdev->name, id->name) == 0) {			pdev->id_entry = id;return id;		}		id++;	}return NULL;}

第四种匹配方式

直接比较驱动和设备的 name 字段,看看是不是相等,如果相等的话就匹配成功。

(strcmp(pdev->name, drv->name) == 0);

对于支持设备树的 Linux 版本号,一般设备驱动为了兼容性都支持设备树和无设备树两种匹配方式。也就是第一种匹配方式一般都会存在,第三种和第四种只要存在一种就可以,一般用的最多的还是第四种,也就是直接比较驱动和设备的 name 字段,毕竟这种方式最简单了。

platform _driver
platform _driver 结构体表示platform驱动,该结构体定义在文件include/linux/platform_device.h,内容如下:
struct platform_driver {int (*probe)(struct platform_device *);int (*remove)(struct platform_device *);void (*shutdown)(struct platform_device *);int (*suspend)(struct platform_device *, pm_message_t state);int (*resume)(struct platform_device *);struct device_driver driver;const struct platform_device_id *id_table;};

probe 函数,当驱动与设备匹配成功以后 probe 函数就会执行,driver 成员,为 device_driver 结构体变量, Linux 内核里面大量使用到了面向对象的思维, device_driver 相当于基类,提供了最基础的驱动框架。 plaform_driver 继承了这个基类,然后在此基础上又添加了一些特有的成员变量。device_driver 结构体定义在 include/linux/device.h

of_match_table 就是采用设备树的时候驱动使用的匹配表,同样是数组,每个匹配项都为 of_device_id 结构体类型,此结构体定义在文件 include/linux/mod_devicetable.h 中.

/* * Struct used for matching a device */struct of_device_id{char	name[32];char	type[32];char	compatible[128];const void *data;};

compatible 非常重要,因为对于设备树而言,就是通过设备节点的 compatible 属性值和 of_match_table 中每个项目的 compatible 成员变量进行比较,如果有相等的就表示设备和此驱动匹配成功。

const struct platform_device_id *id_table;

另外id_table 表,之前 platform 总线匹配驱动和设备的时候采用的第三种匹配方法, id_table 是个表(也就是数组),每个元素的类型为 platform_device_id,platform_device_id 结构体内容如下:

struct platform_device_id {char name[PLATFORM_NAME_SIZE];kernel_ulong_t driver_data;};

其实platform 驱动还是传统的字符设备驱动、块设备驱动或网络设备驱动,只是套上了一张“platform” 的壳,目的是为了使用总线、驱动和设备这个驱动模型来实现驱动的分离与分层。

典型示例

设备注册(设备树方式,主流)

在设备树(.dts)中定义设备:

my_platform_device {    compatible = "my_driver,platform_dev";  // 匹配关键字    reg = <0x12340000 0x1000>;              // 寄存器地址    interrupts = <IRQ_TYPE_EDGE_RISING 5>;  // 中断号};

内核解析设备树后,自动创建 device 结构体并注册到 platform 总线。

驱动注册(匹配 + probe)

#include<linux/module.h>#include<linux/platform_device.h>// 匹配表(和设备树的compatible对应)static const struct of_device_id my_dev_of_match[] = {    { .compatible = "my_driver,platform_dev" },    { },  // 结束符};MODULE_DEVICE_TABLE(of, my_dev_of_match);// 驱动的probe函数(匹配成功后执行)staticintmy_platform_probe(struct platform_device *pdev){    printk(KERN_INFO "设备匹配成功,初始化硬件!\n");    // 1. 获取设备树参数(寄存器地址、中断号)    struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);    // 2. 映射寄存器地址    void __iomem *reg_base = devm_ioremap(&pdev->dev, res->start, resource_size(res));    // 3. 初始化硬件(比如设置寄存器)    writel(0x1234, reg_base + 0x00);    return 0;}// 驱动移除函数staticintmy_platform_remove(struct platform_device *pdev){    printk(KERN_INFO "驱动移除,释放资源!\n");    return 0;}// 定义platform驱动结构体static struct platform_driver my_platform_driver = {    .driver = {        .name = "my_platform_driver",        .of_match_table = my_dev_of_match,  // 设备树匹配表    },    .probe = my_platform_probe,    .remove = my_platform_remove,};// 模块加载/卸载module_platform_driver(my_platform_driver);MODULE_LICENSE("GPL");
  • 加载驱动模块后,platform 总线调用 match 函数,对比驱动的 of_match_table 和设备树的 compatible
  • 匹配成功后,调用 my_platform_probe 初始化硬件;
  • 卸载驱动时,调用 my_platform_remove 释放资源。
  • 核心流程
注册总线→注册设备 / 驱动→总线匹配→执行 probe 初始化硬件。
dmesg|grep my_dev
关键调试技巧
  1. 查看 Platform 设备列表:ls /sys/bus/platform/devices/
  2. 查看 Platform 驱动列表:ls /sys/bus/platform/drivers/
  3. 查看设备绑定的驱动:
  4. ls /sys/bus/platform/drivers/my_platform_driver/
  5. 查看内核匹配日志:dmesg | grep -i platform
接下来讲一下platform设备,这个因为设备树出现导致使用少了。

platform 设备

platform 驱动已经准备好了,我们还需要 platform 设备,否则的话单单一个驱动也做不了什么。 platform_device 这个结构体表示 platform 设备,这里我们要注意,如果内核支持设备树的话就不要再使用 platform_device 来描述设备了,因为改用设备树去描述了。
设备注册
设备树(DTB)解析后,内核将硬件设备封装成 device 结构体,挂到对应总线上;
当然了,你如果一定要用 platform_device 来描述设备信息的话也是可以的。 
platform_device 结构体定义在文件include/linux/platform_device.h 
struct platform_device {constchar	*name;int		id;bool		id_auto;struct device	dev;u32		num_resources;struct resource	*resource;conststruct platform_device_id	*id_entry;/* MFD cell pointer */struct mfd_cell *mfd_cell;/* arch specific additions */struct pdev_archdata	archdata;};
定义
含义
name
要和所使用的 platform 驱动的 name 字段相同,否则的话设备就无法匹配到对应的驱动。比如对应的 platform 驱动的 name 字段为“xxx-led”,那么此 name字段也要设置为“xxx-led
num_resources
资源数量
resource
- 指向 struct resource 数组,描述设备的硬件资源:
- 寄存器地址(IORESOURCE_MEM);
- 中断号(IORESOURCE_IRQ);
- DMA 通道(IORESOURCE_DMA);
- 驱动匹配后,可通过 platform_get_resource() 获取具体资源。
dev
struct device
通用设备结构体(基类)
- 所有 Linux 设备的通用父结构体,包含设备的核心属性:
parent:父设备指针(用于设备树层级);
platform_data:设备私有数据(旧版方式,现代推荐用 of_device_id/ 设备树);
driver:匹配成功的驱动指针;
kobj:设备的内核对象(sysfs 节点);
- 是 platform 设备融入 Linux 设备模型的核心。
其中resource 结构体在
structresource {resource_size_t start;resource_size_t end;const char *name;unsigned long flags;struct resource *parent, *sibling, *child; };

start 和 end 分别表示资源的起始和终止信息,对于内存类的资源,就表示内存起始和终止地址, name 表示资源名字, flags 表示资源类型。

在以前不支持设备树的Linux版本中,用户需要编写platform_device变量来描述设备信息,然后使用 platform_device_register 函数将设备信息注册到 Linux 内核中。

intplatform_device_register(struct platform_device *pdev){	device_initialize(&pdev->dev);	arch_setup_pdev_archdata(pdev);        return platform_device_add(pdev);}EXPORT_SYMBOL_GPL(platform_device_register);

函数参数和返回值含义如下:pdev:要注册的 platform 设备。返回值: 负数,失败; 0:成功。

如果要注销掉platform设备,对应调用函数不再使用 platform 的话可以通过 platform_device_unregister 函数注销掉。

举一个例子

#include<linux/module.h>#include<linux/platform_device.h>#include<linux/init.h>#include<linux/kernel.h>// 定义设备私有数据(可选,用于存储设备相关的自定义信息)struct demo_dev_data {    int id;    char name[32];};// 设备私有数据初始化static struct demo_dev_data demo_data = {    .id = 1001,    .name = "platform_demo_device",};// 设备资源定义(可选,比如外设的寄存器地址、中断号等)static struct resource demo_resource[] = {    // 示例:定义一个内存资源(寄存器基地址)    [0] = {        .start = 0x12340000,  // 模拟的寄存器起始地址        .end   = 0x123400FF,  // 模拟的寄存器结束地址        .flags = IORESOURCE_MEM, // 资源类型:内存    },    // 示例:定义一个中断资源    [1] = {        .start = 50,          // 模拟的中断号        .end   = 50,        .flags = IORESOURCE_IRQ, // 资源类型:中断    },};// platform 设备结构体定义static struct platform_device demo_platform_device = {    .name = "demo_platform_dev",  // 设备名(需与驱动的 name 匹配才能成功匹配)    .id = PLATFORM_DEVID_AUTO,    // 自动分配设备 ID    .dev = {        .platform_data = &demo_data, // 挂载私有数据    },    .num_resources = ARRAY_SIZE(demo_resource), // 资源数量    .resource = demo_resource,                 // 资源数组};// 模块初始化函数:注册 platform 设备staticint __init demo_platform_device_init(void){    int ret;    // 注册 platform 设备    ret = platform_device_register(&demo_platform_device);    if (ret) {        pr_err("Failed to register platform device: %d\n", ret);        return ret;    }    pr_info("Platform device registered successfully!\n");    return 0;}// 模块退出函数:注销 platform 设备staticvoid __exit demo_platform_device_exit(void){    // 注销 platform 设备    platform_device_unregister(&demo_platform_device);    pr_info("Platform device unregistered successfully!\n");}// 模块入口和出口宏module_init(demo_platform_device_init);module_exit(demo_platform_device_exit);// 模块信息(必须)MODULE_LICENSE("GPL");MODULE_AUTHOR("Your Name");MODULE_DESCRIPTION("Demo for Platform Device Registration");MODULE_VERSION("1.0");
设备私有数据(demo_dev_data)
用于存储设备的自定义信息(如设备 ID、名称等),通过 platform_data 挂载到 platform_device 的 dev 成员中,驱动匹配后可读取这些数据。platform_data 挂载自定义数据,是驱动获取硬件信息的重要方式
  • .name
    设备名称,必须与 platform 驱动的名称一致 才能完成总线匹配。
  • .id
    设备 ID,PLATFORM_DEVID_AUTO 表示自动分配。
  • .dev.platform_data
    挂载私有数据的指针。
  • .num_resources
     和 .resource:指定设备资源的数量和数组。
编译测试
# 查看已注册的 platform 设备cat  /sys/bus/platform/devices/demo_platform_dev/name# 查看内核日志dmesg |grep "Platform device"
在现在设备树方式开发中(主流),只要编写底层驱动就可以了!
回顾一下
总线注册 → 设备注册(入列→遍历驱动匹配→未绑定) → 驱动注册(入列→遍历设备匹配)→ 匹配成功→probe初始化→已绑定 → 卸载→remove清理→解绑
步骤
核心 API
作用
总线注册
platform_bus_init()
创建 platform 总线
设备注册
platform_device_register()
注册设备到总线
驱动注册
platform_driver_register()
注册驱动到总线
匹配判定
platform_match()
/platform_match_id()
设备 - 驱动匹配
初始化
驱动的 .probe 函数
硬件初始化
资源清理
驱动的 .remove 函数
释放资源
卸载驱动
platform_driver_unregister()
移除驱动并解绑设备
移除设备
platform_device_unregister()
移除设备并清理资源

注意

  • 设备树定义的 Platform 设备,其 /sys/bus/platform/devices/ 下的目录名是节点名 + @reg 起始地址(如 my_platform_dev@12340000),而非 compatible 字符串;
  • driver
     软链接仅在驱动通过 of_match_table 匹配设备树 compatible 成功后生成,指向 /sys/bus/platform/drivers/驱动名
    举一个例子
// 加入设备树的根节点(如 /soc 下)my_platform_dev@12340000 {    compatible = "my_driver,platform_dev";    reg = <0x12340000 0x1000>;    interrupts = <IRQ_TYPE_EDGE_RISING 5>;    status = "okay"// 启用节点};//驱动代码// 设备树匹配表static const struct of_device_id my_dev_of_match[] = {    { .compatible = "my_driver,platform_dev" },    { },};MODULE_DEVICE_TABLE(of, my_dev_of_match);//........static struct platform_driver my_platform_drv = {    .probe = my_dev_probe,    .remove = my_dev_remove,    .driver = {        .name = "my_platform_driver",        .of_match_table = of_match_ptr(my_dev_of_match),    },};

编译设备树并烧录,启动系统

# 1. 查看设备目录(节点名+@地址)ls /sys/bus/platform/devices/my_platform_dev@12340000/# 2. 加载驱动前:无 driver 软链接ls /sys/bus/platform/devices/my_platform_dev@12340000/driver  # 报错:无此文件# 3. 加载驱动insmod my_platform_driver.ko# 4. 加载后:查看 driver 软链接ls -l /sys/bus/platform/devices/my_platform_dev@12340000/driver# 输出示例:# lrwxrwxrwx 1 root root 0 Jan  1 00:00 driver -> ../../../../bus/platform/drivers/my_platform_driver# 5. 查看驱动目录ls /sys/bus/platform/drivers/my_platform_driver/

谢谢点赞阅读收藏!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-28 14:31:29 HTTP/2.0 GET : https://f.mffb.com.cn/a/475599.html
  2. 运行时间 : 0.261198s [ 吞吐率:3.83req/s ] 内存消耗:4,515.07kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=e0347b7a9d37aa5037824119526cbe2c
  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.000991s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001257s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000689s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000676s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001404s ]
  6. SELECT * FROM `set` [ RunTime:0.000545s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001526s ]
  8. SELECT * FROM `article` WHERE `id` = 475599 LIMIT 1 [ RunTime:0.025830s ]
  9. UPDATE `article` SET `lasttime` = 1772260290 WHERE `id` = 475599 [ RunTime:0.006680s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.003729s ]
  11. SELECT * FROM `article` WHERE `id` < 475599 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.002399s ]
  12. SELECT * FROM `article` WHERE `id` > 475599 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001572s ]
  13. SELECT * FROM `article` WHERE `id` < 475599 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.024461s ]
  14. SELECT * FROM `article` WHERE `id` < 475599 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.011314s ]
  15. SELECT * FROM `article` WHERE `id` < 475599 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.005953s ]
0.267446s