当前位置:首页>Linux>TSI721 Linux 驱动源码分析1:驱动处理port write 和门铃事务中断处理过程

TSI721 Linux 驱动源码分析1:驱动处理port write 和门铃事务中断处理过程

  • 2026-02-05 01:04:54
TSI721 Linux 驱动源码分析1:驱动处理port write 和门铃事务中断处理过程

一、 驱动初始化

当系统启动并识别到 TSI721 硬件后,驱动的初始化过程 (tsi721_probe 函数) 开始,为后续通信准备好所有必要的硬件和软件资源。

  1. PCIe 基础配置:驱动首先使能 PCIe 设备,申请并映射设备的 BAR 空间。这些内存窗口是主机与 TSI721 芯片寄存器通信的通道。

  2. DMA 引擎初始化:TSI721 驱动利用芯片的 BDMA 通道来高效生成 RapidIO 维护请求(包括对配置空间的访问)。驱动会初始化 DMA 描述符环等数据结构,为后续操作做准备。

  3. 中断系统设置:驱动使能 MSI 中断并注册中断服务程序。这是主机能够及时响应来自 RapidIO 网络事件的关键一步。

  4. 功能模块初始化:驱动会分别初始化 Port-Write 和门铃处理所需的特定资源,例如为 Port-Write 消息创建内核 FIFO 和工作队列。

二、事务处理全景图

下图直观地展示了 Port-Write 和门铃事务在 TSI721 驱动中从硬件中断到软件处理的完整路径:

三、Port-Write 事务的驱动处理

Port-Write 主要用于系统级的事件和错误报告,其处理流程强调可靠性和及时性。

  1. 中断触发:当 TSI721 从 RapidIO 端口收到一个 Port-Write 报文时,会生成一个 PCIe 中断。

  2. 中断服务程序:驱动注册的中断处理函数 tsi721_irqhandler 被调用。它会检查中断状态寄存器,识别出是 Port-Write 事件,然后调用专用的 tsi721_pw_handler

  3. 捕获与排队:在 tsi721_pw_handler 中,驱动从 TSI721 的 Port-Write 捕获寄存器中读取完整的报文数据(通常是 4 个 32 位字)。然后,使用 kfifo_in 操作将这个报文存入一个预先分配好的内核 FIFO 中。如果 FIFO 已满,报文可能会被丢弃并计数。

  4. 延迟处理:为避免在中断上下文中执行耗时操作,驱动通过 schedule_work 函数调度一个延迟工作(如 tsi721_pw_dpc)。这个工作队列函数会在合适的时机运行,从 FIFO 中取出报文,解析出源设备 ID、端口信息以及 32 位的载荷数据,并最终通过内核事件机制或字符设备上报给等待的应用程序。

硬件初始化阶段

// 分配Port-Write消息FIFO和工作队列staticinttsi721_port_write_init(struct tsi721_device *priv){    priv->pw_discard_count = 0;    INIT_WORK(&priv->pw_work, tsi721_pw_dpc);  // 延迟处理工作队列    spin_lock_init(&priv->pw_fifo_lock);    // 创建内核FIFO用于缓存Port-Write消息    if (kfifo_alloc(&priv->pw_fifo, TSI721_RIO_PW_MSG_SIZE * 32, GFP_KERNEL)) {        tsi_err(&priv->pdev->dev, "PW FIFO allocation failed");        return -ENOMEM;    }    // 配置可靠Port-Write捕获模式    iowrite32(TSI721_RIO_PW_CTL_PWC_REL, priv->regs + TSI721_RIO_PW_CTL);    return 0;}

中断触发与处理

// 主中断处理函数 - 检测Port-Write事件staticirqreturn_ttsi721_irqhandler(int irq, void *ptr){    struct tsi721_device *priv = (struct tsi721_device *)ptr;    u32 dev_int = ioread32(priv->regs + TSI721_DEV_INT);    if (dev_int & TSI721_DEV_INT_SRIO) {        // 检查SRIO MAC中断状态        u32 intval = ioread32(priv->regs + TSI721_RIO_EM_INT_STAT);        if (intval & TSI721_RIO_EM_INT_STAT_PW_RX)            tsi721_pw_handler(priv);  // 处理Port-Write        if (intval & TSI721_RIO_EM_INT_STAT_PORT)            tsi721_port_err_handler(priv);  // 处理端口错误    }    // ... 其他中断处理    return IRQ_HANDLED;}
Port-Write消息捕获
staticinttsi721_pw_handler(struct tsi721_device *priv){    u32 pw_stat;    u32 pw_buf[TSI721_RIO_PW_MSG_SIZE/sizeof(u32)];    // 读取Port-Write状态寄存器    pw_stat = ioread32(priv->regs + TSI721_RIO_PW_RX_STAT);    // 检查Port-Write接收异常    if (pw_stat & 0x0000000E)        tsi_err(&priv->pdev->dev, "PW_STAT: 0x%x\n", pw_stat);    if (pw_stat & TSI721_RIO_PW_RX_STAT_PW_VAL) {        // 从硬件捕获寄存器读取完整的Port-Write消息(4个32位字)        pw_buf[0] = ioread32(priv->regs + TSI721_RIO_PW_RX_CAPT(0));        pw_buf[1] = ioread32(priv->regs + TSI721_RIO_PW_RX_CAPT(1));        pw_buf[2] = ioread32(priv->regs + TSI721_RIO_PW_RX_CAPT(2));        pw_buf[3] = ioread32(priv->regs + TSI721_RIO_PW_RX_CAPT(3));        // 线程安全地将消息存入FIFO        spin_lock(&priv->pw_fifo_lock);        if (kfifo_avail(&priv->pw_fifo) >= TSI721_RIO_PW_MSG_SIZE)            kfifo_in(&priv->pw_fifo, pw_buf, TSI721_RIO_PW_MSG_SIZE);        else            priv->pw_discard_count++;  // FIFO满时丢弃消息        spin_unlock(&priv->pw_fifo_lock);    }    // 清除中断状态    iowrite32(TSI721_RIO_PW_RX_STAT_PW_DISC | TSI721_RIO_PW_RX_STAT_PW_VAL,              priv->regs + TSI721_RIO_PW_RX_STAT);    // 调度工作队列进行异步处理    schedule_work(&priv->pw_work);    return 0;}

异步消息处理

// 工作队列处理函数 - 在进程上下文中安全处理消息staticvoidtsi721_pw_dpc(struct work_struct *work){    struct tsi721_device *priv = container_of(work, struct tsi721_device, pw_work);    union rio_pw_msg pwmsg;    // 从FIFO中取出所有待处理消息    while (kfifo_out_spinlocked(&priv->pw_fifo, (unsigned char *)&pwmsg,             TSI721_RIO_PW_MSG_SIZE, &priv->pw_fifo_lock)) {        // 传递给RapidIO核心层进行进一步处理        rio_inb_pwrite_handler(&priv->mport, &pwmsg);    }}

四、门铃事务的驱动处理

门铃事务更侧重于设备间的轻量级通信和同步,例如通知远端设备 DMA 数据传输已完成。

  1. 中断触发:当 TSI721 收到一个目标地址为本机的门铃事务时,会产生中断。

  2. 中断服务程序:中断处理函数同样先定位中断源。如果是一个入向门铃中断,它会读取 TSI721 的门铃状态寄存器,以确定是哪个门铃号被触发,并获取相关的 16 位信息码。

  3. 消息分发:驱动根据门铃号和信息码,执行预先注册的回调函数。例如,应用层可能为门铃号 1 注册了一个函数,用于处理“数据就绪”通知。驱动负责将这一硬件事件精准地传递给正确的处理逻辑。

  4. 应用层响应:在回调函数中,应用程序可以执行相应操作,比如开始处理一块已经通过 DMA 传输过来的数据。

门铃发送机制

// 发送门铃事务staticinttsi721_dsend(struct rio_mport *mport, int index, u16 destid, u16 data){    struct tsi721_device *priv = mport->priv;    u32 offset, rval = 0;    int i, rtry_cnt = 100;    // 构建门铃事务包:目标设备ID + 16位信息码    offset = (((mport->sys_size) ? RIO_TT_CODE_16 : RIO_TT_CODE_8) << 18) | (destid << 2);    // 写入门铃数据到ODB(Outbound Doorbell)寄存器    iowrite16be(data, priv->odb_base + offset);    // 等待硬件确认传输完成    for (i = 0; i < 1000; i++) {        udelay(1);        if (ioread32(priv->regs + TSI721_ODB_CNT(0)) & TSI721_ODB_CNT_OK)            return 0;  // 成功发送    }    // 错误处理和重试机制    // ... (省略错误处理代码)    return -EAGAIN;}

门铃接收机制

硬件初始化
staticinttsi721_doorbell_init(struct tsi721_device *priv){    // 分配DMA一致性内存用于门铃队列    priv->idb_base = dma_alloc_coherent(&priv->pdev->dev,                IDB_QSIZE * TSI721_IDB_ENTRY_SIZE,                &priv->idb_dma, GFP_KERNEL);    // 配置Inbound Doorbell队列    iowrite32(TSI721_IDQ_SIZE_VAL(IDB_QSIZE),        priv->regs + TSI721_IDQ_SIZE(IDB_QUEUE));    iowrite32(((u64)priv->idb_dma >> 32),        priv->regs + TSI721_IDQ_BASEU(IDB_QUEUE));    iowrite32(((u64)priv->idb_dma & TSI721_IDQ_BASEL_ADDR),        priv->regs + TSI721_IDQ_BASEL(IDB_QUEUE));    // 使能所有门铃中断    iowrite32(0, priv->regs + TSI721_IDQ_MASK(IDB_QUEUE));    iowrite32(TSI721_IDQ_INIT, priv->regs + TSI721_IDQ_CTL(IDB_QUEUE));    return 0;}
中断处理
staticinttsi721_dbell_handler(struct tsi721_device *priv){    struct rio_mport *mport;    struct rio_dbell *dbell;    u32 wr_ptr, rd_ptr;    u64 *idb_entry;    union {        u64 msg;        u8  bytes[8];    } idb;    mport = &priv->mport;    rd_ptr = ioread32(priv->regs + TSI721_IDQ_RP(IDB_QUEUE)) % IDB_QSIZE;    // 清除中断状态    iowrite32(TSI721_SR_CHINT_IDBQRCV,              priv->regs + TSI721_SR_CHINT(IDB_QUEUE));    // 处理队列中所有待处理门铃    wr_ptr = ioread32(priv->regs + TSI721_IDQ_WP(IDB_QUEUE)) % IDB_QSIZE;    while (wr_ptr != rd_ptr) {        // 从队列中读取门铃消息        idb_entry = (u64 *)(priv->idb_base + (TSI721_IDB_ENTRY_SIZE * rd_ptr));        idb.msg = *idb_entry;        *idb_entry = 0;  // 清空队列条目        // 在注册的门铃列表中查找匹配项        list_for_each_entry(dbell, &mport->dbells, node) {            if ((dbell->res->start <= DBELL_INF(idb.bytes)) &&                (dbell->res->end >= DBELL_INF(idb.bytes))) {                // 调用上层注册的回调函数                dbell->dinb(mport, dbell->dev_id, DBELL_SID(idb.bytes),                           DBELL_TID(idb.bytes), DBELL_INF(idb.bytes));                break;            }        }        rd_ptr = (rd_ptr + 1) % IDB_QSIZE;    }    // 更新读指针    iowrite32(rd_ptr, priv->regs + TSI721_IDQ_RP(IDB_QUEUE));    return 0;}

门铃处理注册流程

1. 用户空间初始化阶段

用户通过 ioctl 调用注册门铃过滤器:

case RIO_ENABLE_DOORBELL_RANGE:    return rio_mport_add_db_filter(data, (void __user *)arg);
2. 驱动层过滤器注册

rio_mport_add_db_filter函数完成核心注册:

staticintrio_mport_add_db_filter(struct mport_cdev_priv *priv, void __user *arg){    // 从用户空间获取过滤器参数(门铃范围 low/high)    // 调用底层 RapidIO 驱动注册门铃处理程序    ret = rio_request_inb_dbell(md->mport, md, filter.low, filter.high,                   rio_mport_doorbell_handler);    // ...}

关键注册调用:rio_request_inb_dbell()将 rio_mport_doorbell_handler注册为门铃中断处理函数。

3. 硬件中断处理链

当硬件收到门铃时触发中断处理:

static void rio_mport_doorbell_handler(struct rio_mport *mport, void *dev_id,                   u16 src, u16 dst, u16 info){    // 遍历所有注册的门铃过滤器    list_for_each_entry(db_filter, &data->doorbells, data_node) {        if (((db_filter->filter.rioid == RIO_INVALID_DESTID ||              db_filter->filter.rioid == src)) &&              info >= db_filter->filter.low &&              info <= db_filter->filter.high) {            // 匹配成功,将事件加入对应客户端的事件队列            priv = db_filter->priv;            rio_mport_add_event(priv, &event);            handled = 1;        }    }}
4. 事件队列管理

事件添加到 FIFO 并唤醒等待进程:

staticintrio_mport_add_event(struct mport_cdev_priv *priv, struct rio_event *event){    // 检查事件掩码权限    if (!(priv->event_mask & event->header))        return -EACCES;    spin_lock(&priv->fifo_lock);    // 将事件存入环形缓冲区    overflow = kfifo_avail(&priv->event_fifo) < sizeof(*event)        || kfifo_in(&priv->event_fifo, (unsigned char *)eventsizeof(*event)) != sizeof(*event);    spin_unlock(&priv->fifo_lock);    // 关键:唤醒等待队列中的进程    wake_up_interruptible(&priv->event_rx_wait);    return overflow ? -EBUSY : 0;}
5. 用户空间事件读取机制

通过 poll 机制监控事件可用性:

static unsigned intmport_cdev_poll(structfile *filp, poll_table *wait){    struct mport_cdev_priv *priv = filp->private_data;    // 注册等待队列到 poll_table    poll_wait(filp, &priv->event_rx_wait, wait);    // 检查是否有待读取事件    if (kfifo_len(&priv->event_fifo))        return POLLIN | POLLRDNORM;  // 有数据可读    return 0;}
6. 文件操作接口集成

完整的 VFS 接口支持:

static const struct file_operations mport_fops = {    .owner      = THIS_MODULE,    .open       = mport_cdev_open,    .release    = mport_cdev_release,    .poll       = mport_cdev_poll,      // 支持 poll/select    .read       = mport_read,           // 读取事件数据    .write      = mport_write,    .mmap       = mport_cdev_mmap,    .fasync     = mport_cdev_fasync,    // 支持异步通知    .unlocked_ioctl = mport_cdev_ioctl  // 包括门铃注册 ioctl};

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-07 18:29:59 HTTP/2.0 GET : https://f.mffb.com.cn/a/473277.html
  2. 运行时间 : 0.090179s [ 吞吐率:11.09req/s ] 内存消耗:4,432.19kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=d27887e6fc26ea291bf33890ae8928ea
  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.000604s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000925s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000347s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000296s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000493s ]
  6. SELECT * FROM `set` [ RunTime:0.000199s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000603s ]
  8. SELECT * FROM `article` WHERE `id` = 473277 LIMIT 1 [ RunTime:0.000485s ]
  9. UPDATE `article` SET `lasttime` = 1770460200 WHERE `id` = 473277 [ RunTime:0.003087s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000277s ]
  11. SELECT * FROM `article` WHERE `id` < 473277 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000475s ]
  12. SELECT * FROM `article` WHERE `id` > 473277 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.004484s ]
  13. SELECT * FROM `article` WHERE `id` < 473277 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002010s ]
  14. SELECT * FROM `article` WHERE `id` < 473277 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000734s ]
  15. SELECT * FROM `article` WHERE `id` < 473277 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.005183s ]
0.092810s