当前位置:首页>Linux>Linux设备模型

Linux设备模型

  • 2026-02-05 07:22:00
Linux设备模型

1. 概述

Linux 设备模型(Linux Device Model)是内核中统一描述和管理硬件及其驱动关系的基础框架,核心目标是:抽象硬件、统一驱动模型、支持热插拔、并向用户空间暴露一致的视图(sysfs / uevent)。

2. 数据结构定义

struct bus_type 代表总线

struct bus_type {    const char        *name;      /* 总线的名字 */struct subsys_private *p; /* 总线私有数据 */};struct subsys_private {struct kset subsys;struct kset *devices_kset; /* 所有dev都属于这个kset集合 */struct list_head interfaces;struct mutex mutex;struct kset *drivers_kset; /* 所有drv都属于这个kset集合 */struct klist klist_devices; /* 设备链表头节点 */struct klist klist_drivers; /* 驱动链表头节点 */struct blocking_notifier_head bus_notifier;    unsigned int drivers_autoprobe:1;struct bus_type *bus;struct class *class;};

struct device 代表设备

struct device {struct device        *parent;struct device_private    *p;struct kobject kobj;    const char        *init_name; /* dev名字e */    conststruct device_type *type;struct bus_type    *bus;        /* 指向所属bus */struct klist_node    knode_class; /* 作为class成员时使用的链表节点 */struct class        *class};struct device_private {struct klist klist_children;    /* 链接children devic的链表头节点 */struct klist_node knode_parent; /* 链接到parent的链接节点 */struct klist_node knode_driver; /* 链接到绑定驱动的链表节点 */struct klist_node knode_bus;    /* 用于挂到其所属bus的klist_devices链表中 */struct device *device;}

struct device_driver 代表驱动

struct device_driver {    const char        *name;struct bus_type        *bus;struct module        *owner;enum probe_type probe_type;    int (*probe) (struct device *dev);    int (*remove) (struct device *dev);    void (*shutdown) (struct device *dev);    int (*suspend) (struct device *dev, pm_message_t state);    int (*resume) (struct device *dev);struct driver_private *p;};struct driver_private {struct kobject kobj;struct klist klist_devices;   /* 用于链接绑定该驱动的dev节点 */struct klist_node knode_bus;  /* 用于挂到其所属bus的klist_drivers链表中 */struct module_kobject *mkobj;struct device_driver *driver;};

3. 核心操作函数源码分析

当内核启动后,首先会依次调用devices_init 、buses_initclasses_init函数,用于建立设备模型的基础目录结构。

/** * driver_init: *  ├── devices_init *  ├── buses_init *  └── classes_init*/int __init devices_init(void){  /* /sys/devices */    devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL);    /* /sys/dev */    dev_kobj = kobject_create_and_add("dev", NULL);    /* /sys/dev/block */    sysfs_dev_block_kobj = kobject_create_and_add("block", dev_kobj);    /* /sys/dev/char */    sysfs_dev_char_kobj = kobject_create_and_add("char", dev_kobj);}int __init buses_init(void){  /* /sys/bus */    bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);    /* /sys/devices/system */    system_kset = kset_create_and_add("system", NULL, &devices_kset->kobj);}int __init classes_init(void){  /* /sys/class */    class_kset = kset_create_and_add("class", NULL, NULL);}

现在目录结构如下

3.1. 注册总线

bus_register 用于注册一个总线,首先将总线的目录注册到/sys/bus/[bus->name],函数内部使用bus_ksetbus_ktype是全局变量,所有总线都指向它。drivers_autoprobe用于控制驱动或者设备加载是是否自动探测。然后创建/sys/bus/[bus->name]文件,/sys/bus/[bus->name]/devices/sys/bus/[bus->name]/drivers 目录,创建两个链表priv→klist_devicespriv→klist_drivers 用于后续链接驱动和设备,在/sys/bus/[bus->name]/创建drivers_probedrivers_autoprobe文件和属性组文件。

int bus_register(struct bus_type *bus){    int retval;struct subsys_private *priv;  /* 双向关联 */    priv->bus = bus;    bus->p = priv;  /* 设置subsys的属性 */    retval = kobject_set_name(&priv->subsys.kobj, "%s", bus->name);    priv->subsys.kobj.kset = bus_kset;    priv->subsys.kobj.ktype = &bus_ktype;    /* 设置驱动自动探测 */    priv->drivers_autoprobe = 1;    retval = kset_register(&priv->subsys);  /* 创建/sys/bus/[bus->name]/uevent文件 */    retval = bus_create_file(bus, &bus_attr_uevent);  /* 创建/sys/bus/[bus->name]/devices和/sys/bus/[bus->name]/drivers */    priv->devices_kset = kset_create_and_add("devices", NULL,                         &priv->subsys.kobj);    priv->drivers_kset = kset_create_and_add("drivers", NULL,                         &priv->subsys.kobj);  /* 创建/sys/bus/platform/drivers_probe 和/sys/bus/platform/drivers_probe/drivers_autoprobe */    retval = add_probe_files(bus);  /* 在/sys/bus/[bus->name]/下创建属性组相关文件 */    retval = bus_add_groups(bus, bus->bus_groups);}

现在/sys/bus/的目录结构如下所示

3.2 device注册

函数bus_register 用于注册一个设备,其完成device结构体的初始化、然后把设备注册进系统。

device_register    ├── device_initialize:初始化各种结构体成员    └── device_add:设备上线

device_initialize用于初始化device对象的基础成员,为后续device_add()/device_register()做准备。函数先设置devkset指向devices_kset,初始化各种链表和锁,最后将dev的状态设置为没有驱动,此时设备仍然不可见。

void device_initialize(struct device *dev){  /* 设置kset */    dev->kobj.kset = devices_kset;    kobject_init(&dev->kobj, &device_ktype);    lockdep_set_novalidate_class(&dev->mutex);    /* 状态为无驱动 */    dev->links.status = DL_DEV_NO_DRIVER;}

device_add这一阶段是“设备正式上线”,核心动作包括:设置dev_name,建立parent-child关系,创建 /sys/devices/...目录,挂到bus->p->klist_devices ,触发uevent,尝试和driver进行匹配,从这里开始,设备对内核和用户态都是可见的。

int device_add(struct device *dev){struct device *parent;struct kobject *kobj;struct class_interface *class_intf;struct kobject *glue_dir = NULL;  /* 引用计数+1 */    dev = get_device(dev);  /* 初始化私有数据 */    if (!dev->p) {        error = device_private_init(dev);    }  /* 设置name */    if (dev->init_name) {        dev_set_name(dev, "%s", dev->init_name);        dev->init_name = NULL;    }    if (!dev_name(dev) && dev->bus && dev->bus->dev_name)        dev_set_name(dev, "%s%u", dev->bus->dev_name, dev->id);    if (!dev_name(dev)) {        error = -EINVAL;        goto name_error;    }    parent = get_device(dev->parent);    /* 计算实际的父目录 */    kobj = get_device_parent(dev, parent);    if (kobj)        dev->kobj.parent = kobj;    /* use parent numa_node */    if (parent && (dev_to_node(dev) == NUMA_NO_NODE))        set_dev_node(dev, dev_to_node(parent));  /* 添加到sysfs层次结构中 */    error = kobject_add(&dev->kobj, dev->kobj.parent, NULL);  /* 创建uevent文件 */    error = device_create_file(dev, &dev_attr_uevent);    /* 建立device和class之间的双向链接 */    error = device_add_class_symlinks(dev);    /* 创建属性文件 */    error = device_add_attrs(dev);    /* 添加dev到bus的链表 */    error = bus_add_device(dev);    /* 电源管理 */    error = dpm_sysfs_add(dev);    device_pm_add(dev);    if (MAJOR(dev->devt)) {      /* 创建文件 */        error = device_create_file(dev, &dev_attr_dev);        error = device_create_sys_dev_entry(dev);    /* 创建字符设备/dev/节点 */        devtmpfs_create_node(dev);    }  /* 内核通知链,ADD事件*/    if (dev->bus)        blocking_notifier_call_chain(&dev->bus->p->bus_notifier,                         BUS_NOTIFY_ADD_DEVICE, dev);  /*告知用户空间的ADD事件*/    kobject_uevent(&dev->kobj, KOBJ_ADD);    /* 驱动探测 */    bus_probe_device(dev);    if (parent)        klist_add_tail(&dev->p->knode_parent,                   &parent->p->klist_children);  /* class和device绑定 */    if (dev->class) {        mutex_lock(&dev->class->p->mutex);        /* tie the class to the device */        klist_add_tail(&dev->knode_class,                   &dev->class->p->klist_devices);        /* notify any interfaces that the device is here */        list_for_each_entry(class_intf,                    &dev->class->p->interfaces, node)            if (class_intf->add_dev)                class_intf->add_dev(dev, class_intf);        mutex_unlock(&dev->class->p->mutex);    }}

bus_add_device 建立两个软链接,并将dev加入到bus的链表进行管理。

int bus_add_device(struct device *dev){struct bus_type *bus = bus_get(dev->bus);    int error = 0;    if (bus) {        error = device_add_groups(dev, bus->dev_groups);    /* 建立/sys/bus/<bus>/devices/<dev_name> → /sys/devices/.../<dev_name>的软链接 */        error = sysfs_create_link(&bus->p->devices_kset->kobj,                        &dev->kobj, dev_name(dev));    /* 建立/sys/devices/.../<dev>/subsystem → /sys/bus/<bus>的软链接 */        error = sysfs_create_link(&dev->kobj,                &dev->bus->p->subsys.kobj, "subsystem");    /* 加入到klist_devices链表 */        klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices);    }    return 0;}

3.3. 注册驱动

函数driver_register用于注册一个驱动,首先根据名字在总线里面查找驱动,如果没有同名驱动的话则将驱动注册到总线,创建属性组,生成ueventADD事件。

/** * driver_register: *   ├── driver_find:查找同名驱动 *   ├── bus_add_driver: *     └── kobject_uevent:生成ADD事件*/int driver_register(struct device_driver *drv){    int ret;struct device_driver *other;  /* 查找是否有同名驱动 */    other = driver_find(drv->name, drv->bus);    if (other) {        return -EBUSY;    }    ret = bus_add_driver(drv);    if (ret)        return ret;    ret = driver_add_groups(drv, drv->groups);    if (ret) {        return ret;    }    kobject_uevent(&drv->p->kobj, KOBJ_ADD);    return ret;}

上面注册总线时提到一个函数bus_add_driver 是将驱动注册到总线的核心功能实现。

int bus_add_driver(struct device_driver *drv){struct bus_type *bus;struct driver_private *priv;    int error = 0;  /* 总线引用计数+1 */    bus = bus_get(drv->bus);    priv = kzalloc(sizeof(*priv), GFP_KERNEL);    klist_init(&priv->klist_devices, NULL, NULL);    priv->driver = drv;    drv->p = priv;    /* 创建/sys/bus/[bus->name]/drivers/[drv->name]节点 */    priv->kobj.kset = bus->p->drivers_kset;    error = kobject_init_and_add(&priv->kobj, &driver_ktype, NULL,                     "%s", drv->name);  /* 加入链表管理 */    klist_add_tail(&priv->knode_bus, &bus->p->klist_drivers);    if (drv->bus->p->drivers_autoprobe) {      /* 判断驱动的probe能不能放到异步线程中执行,而不是在同步路径里阻塞内核初始化流程 */        if (driver_allows_async_probing(drv)) {          /* 异步遍历device,调用match函数匹配 */            async_schedule(driver_attach_async, drv);        } else {          /* 同步遍历device,调用match函数匹配 */            error = driver_attach(drv);            if (error)                goto out_unregister;        }    }    module_add_driver(drv->owner, drv);  /* 创建uevent文件 */    error = driver_create_file(drv, &driver_attr_uevent);  /* 创建属性组 */    error = driver_add_groups(drv, bus->drv_groups);    return 0;}

3.4 驱动和设备的探测

当添加设备时,会通过bus总线去探测驱动,如果设备指定了驱动,那么直接和它绑定;如果设备未指定驱动,那么遍历驱动链表查找,如果找到则调用probe函数执行。

static int __device_attach(struct device *dev, bool allow_async){    device_lock(dev);    if (dev->driver) { /* 指定了驱动程序 */        /* 设备绑定驱动 */        ret = device_bind_driver(dev);    } else { /* 未指定驱动程序 */        ret = bus_for_each_drv(dev->bus, NULL, &data,                    __device_attach_driver);    }}

设备指定驱动时会调用device_bind_driver 函数,加入链表节点,发送bind事件。

static void driver_bound(struct device *dev){  /* 将dev加入到klist_devices链表进行管理 */    klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices);  /* 发送BIND事件 */    kobject_uevent(&dev->kobj, KOBJ_BIND);}

设备探测驱动时,如果通过match函数找到匹配的驱动,那么则会调用probe函数

static int __device_attach_driver(struct device_driver *drv, void *_data){    ret = driver_match_device(drv, dev);    return driver_probe_device(drv, dev);}

当添加驱动时,driver_attach会去匹配设备,如果匹配成功则调用probe函数

int driver_attach(struct device_driver *drv){    return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);}static int __driver_attach(struct device *dev, void *data){struct device_driver *drv = data;    driver_match_device(drv, dev);    driver_probe_device(drv, dev);    return 0;

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 02:50:26 HTTP/2.0 GET : https://f.mffb.com.cn/a/467495.html
  2. 运行时间 : 0.227958s [ 吞吐率:4.39req/s ] 内存消耗:4,447.95kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=f331814cff28cae8de353e8f4465f925
  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.000748s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000984s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003877s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.010092s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000982s ]
  6. SELECT * FROM `set` [ RunTime:0.002328s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001262s ]
  8. SELECT * FROM `article` WHERE `id` = 467495 LIMIT 1 [ RunTime:0.001282s ]
  9. UPDATE `article` SET `lasttime` = 1770490226 WHERE `id` = 467495 [ RunTime:0.014182s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000416s ]
  11. SELECT * FROM `article` WHERE `id` < 467495 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.007791s ]
  12. SELECT * FROM `article` WHERE `id` > 467495 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.021808s ]
  13. SELECT * FROM `article` WHERE `id` < 467495 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.025558s ]
  14. SELECT * FROM `article` WHERE `id` < 467495 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.009249s ]
  15. SELECT * FROM `article` WHERE `id` < 467495 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.027545s ]
0.230750s