当前位置:首页>Linux>告别重复造轮子:一次讲清 Linux 驱动 regmap 框架

告别重复造轮子:一次讲清 Linux 驱动 regmap 框架

  • 2026-03-27 13:16:17
告别重复造轮子:一次讲清 Linux 驱动 regmap 框架

在 Linux 驱动开发工作里,不少开发者总会碰到重复做同样事的情况。比如在处理寄存器访问和管理功能时,常常要自己从头写代码,这不仅浪费时间,还容易出错。Linux 驱动 regmap 框架的出现,就能很好地解决这个问题。它提供了统一的方法来操作寄存器,开发者不用再重复做类似工作。

regmap 框架具体是怎样的呢?它把寄存器操作相关的功能集中在一起,不管是读寄存器数值,还是写数据进去,又或是管理缓存、处理错误,都有相应的办法。理解并运用好 regmap 框架,能大大提高开发效率。下面,我们就来详细讲讲 regmap 框架,帮你彻底弄明白它。

一、没有regmap,要写多少重复代码?

面试题写作模版

在regmap出现之前,我们写外设驱动,只要涉及寄存器操作,就必须手动实现底层总线的读写逻辑。举个最常见的例子:同样是读取一个8位寄存器,SPI外设和I2C外设的代码完全不同。

1.1 I2C外设的寄存器读取(重复代码1)

#include <linux/i2c.h>// I2C读取寄存器:addr是寄存器地址,val是读取到的值inti2c_read_reg(struct i2c_client *client, u8 addr, u8 *val){    return i2c_smbus_read_byte_data(client, addr);}// I2C写入寄存器inti2c_write_reg(struct i2c_client *client, u8 addr, u8 val){    return i2c_smbus_write_byte_data(client, addr, val);}

1.2 SPI外设的寄存器读取(重复代码2)

#include <linux/spi/spi.h>// SPI读取寄存器:addr是寄存器地址,val是读取到的值intspi_read_reg(struct spi_device *spi, u8 addr, u8 *val){    u8 tx_buf[2] = {addr | 0x800x00}; // 0x80表示读操作    u8 rx_buf[2] = {0};    struct spi_message msg;    struct spi_transfer t = {        .tx_buf = tx_buf,        .rx_buf = rx_buf,        .len = 2,    };    spi_message_init(&msg);    spi_message_add_tail(&t, &msg);    return spi_sync(spi, &msg);    *val = rx_buf[1];}// SPI写入寄存器intspi_write_reg(struct spi_device *spi, u8 addr, u8 val){    u8 tx_buf[2] = {addr & 0x7F, val}; // 0x7F表示写操作    return spi_write(spi, tx_buf, 2);}

可以看到,同样是“读写寄存器”这个简单操作,I2C和SPI的代码逻辑完全不同,需要我们分别实现。如果系统中有多个外设,每个外设都要写一套对应的读写函数,代码冗余度极高,而且一旦总线逻辑有修改,所有相关驱动都要同步修改,维护成本翻倍。

而regmap框架的核心,就是把这些“总线相关的重复操作”全部封装起来,提供统一的API接口,不管是I2C、SPI还是MMIO,我们都用一套代码操作寄存器,彻底告别重复造轮子。

二、初识 regmap 框架

面试题写作模版

2.1 什么是regmap?

regmap(Register Map,寄存器映射)是Linux内核提供的一套寄存器操作封装框架,本质是“中间层”——它位于总线驱动(I2C、SPI等)和外设驱动之间,对外设驱动提供统一的寄存器读写API,对内封装不同总线的底层操作逻辑。

简单说:regmap帮我们做好了“和总线打交道”的所有重复工作,我们写外设驱动时,只需要告诉regmap“寄存器地址、读写长度、总线类型”,就能直接调用统一的API读写寄存器,不用再关心I2C/SPI的底层通信细节。

2.2 为什么要用regmap?(核心优势)

结合驱动开发实战,regmap的优势非常明显,也是我们必须使用它的原因,新手可以直接记下来:

  • 减少重复代码:统一封装总线读写逻辑,不管是哪种总线,都用一套API,不用为每个外设、每种总线重复写读写函数。
  • 降低开发难度:屏蔽总线底层细节,开发者不用熟悉I2C/SPI的通信协议,专注于外设本身的功能(比如寄存器配置、中断处理)。
  • 提升代码可维护性:总线逻辑集中管理,一旦总线驱动有修改,只需修改regmap底层,所有使用regmap的外设驱动都无需改动。
  • 自带优化机制:regmap支持缓存、批量读写、字节序转换等功能,能减少总线通信次数,提升驱动效率,还能避免手动处理缓存的麻烦。
  • 适配多种总线:支持I2C、SP

2.3 regmap的核心原理(极简理解)

regmap的工作原理很简单,分为3步,不用深入内核源码,记住这个逻辑就能理解:

  1. 初始化regmap:告诉regmap“总线类型(I2C/SPI)、总线设备指针、寄存器配置(地址宽度、数据宽度等)”;
  2. 调用regmap统一API:使用regmap提供的regmap_read/regmap_write等函数,传入寄存器地址和数据,完成读写;
  3. regmap底层适配:regmap根据初始化时的总线类型,自动调用对应的总线驱动函数(比如I2C的i2c_smbus_read_byte_data),完成实际的硬件通信。

相当于regmap给我们提供了一个“统一的寄存器操作接口”,底层的总线差异全部由它处理,我们只需要关注“读哪个寄存器、写什么值”。

三、regmap 核心架构模型(一次看懂)

面试题写作模版

regmap的框架模型最核心的就是“三层架构”,自上而下分为:外设驱动层、regmap核心层、总线适配层。这三层各司其职、协同工作,既实现了总线与外设的解耦,又保证了接口的统一性。我们结合实际驱动开发场景,逐一拆解每一层的功能、作用,以及层与层之间的交互逻辑。

3.1 上层:外设驱动层(开发者直接接触)

这一层就是我们日常写的外设驱动(比如传感器、ADC、DAC、时钟芯片等需要操作寄存器的外设),也是开发者唯一需要直接接触的一层。

核心特点:不关心底层总线细节,只需要调用regmap提供的统一API(regmap_read、regmap_write、regmap_update_bits等),实现外设的功能逻辑(比如配置寄存器、读取设备数据)。

举个实战例子:不管是I2C接口的传感器,还是SPI接口的传感器,只要用了regmap,读取设备ID的代码完全一样,不用再分别写I2C和SPI的读写逻辑:

// 读取设备ID(不管I2C还是SPI,代码完全一致)u8 dev_id;regmap_read(dev_regmap, 0x00, &dev_id); // 统一API调用

这一层的核心作用,就是“提出寄存器操作需求”,把具体的读写请求交给regmap核心层处理,不用关注请求如何传递到底层总线。

3.2 中层:regmap核心层(框架核心,承上启下)

这一层是regmap框架的“大脑”,也是整个模型的核心,负责接收上层外设驱动的请求,进行统一处理,再转发到底层总线适配层。它的核心功能的有4个,也是regmap能“告别重复造轮子”的关键:

  1. 统一API管理:对外提供统一的寄存器读写API,屏蔽底层总线差异,让上层外设驱动不用区分总线类型;
  2. 寄存器配置管理:管理regmap的核心配置(寄存器地址宽度、数据宽度、读写掩码、缓存设置等),确保读写操作符合外设要求;
  3. 数据处理与优化:处理字节序转换、数据校验、批量读写、缓存管理等,减少总线通信次数,提升驱动效率;
  4. 请求转发:将上层的读写请求,转换成底层总线适配层能识别的格式,转发到对应总线的适配接口。

简单说:这一层就是“中间转换器”,把上层的“统一请求”转换成底层“总线专属请求”,同时做了很多优化,让寄存器操作更高效、更安全。

核心结构体:struct regmap,这是regmap核心层的“核心载体”,存储了所有配置信息(regmap_config参数)、总线指针、缓存数据、读写锁等,我们初始化regmap,本质就是创建并配置这个结构体。

3.3 下层:总线适配层(对接底层总线)

这一层是regmap框架与底层总线驱动的“桥梁”,负责将regmap核心层的请求,转换成对应总线的实际通信指令,完成硬件层面的寄存器读写。

核心特点:与具体总线强关联,regmap为每种常见总线(I2C、SPI、MMIO、I3C等)都提供了专属的适配接口和驱动,开发者不用手动实现总线通信逻辑。常见的总线适配接口(新手必记):

  • I2C总线:devm_regmap_init_i2c,对接I2C总线驱动,调用I2C的smbus函数完成通信;
  • SPI总线:devm_regmap_init_spi,对接SPI总线驱动,调用SPI的transfer函数完成通信;
  • MMIO总线:devm_regmap_init_mmio,对接内存映射总线,通过读写内存地址完成寄存器操作。

这一层的核心作用,就是“执行具体的总线通信”,把regmap核心层的请求,落地到硬件层面,让寄存器读写真正生效。

3.4 三层架构交互流程(一次看懂)

结合一个“读取寄存器”的场景,梳理三层架构的交互流程,一看就懂:

  1. 外设驱动层:调用regmap_read,传入regmap指针、寄存器地址,提出读取请求;
  2. regmap核心层:接收请求,检查寄存器配置(地址宽度、数据宽度等),处理数据格式,然后将请求转发到总线适配层;
  3. 总线适配层:根据总线类型(比如I2C),调用对应的总线驱动函数(比如i2c_smbus_read_byte_data),完成实际的硬件通信;
  4. 总线适配层:将读取到的数据返回给regmap核心层,核心层做数据校验、格式转换后,再返回给外设驱动层;
  5. 外设驱动层:拿到数据,完成后续的外设功能逻辑。

整个流程中,外设驱动层完全不用关心底层是I2C还是SPI总线,所有总线相关的操作,都由regmap核心层和总线适配层处理——这就是regmap框架模型的精髓。

四、regmap框架核心组件

面试题写作模版

除了三层架构,regmap框架还有两个核心组件,支撑整个模型的运行,也是我们理解regmap底层逻辑的关键,分别是:regmap配置结构体、总线适配接口。

4.1 regmap配置结构体(struct regmap_config)

这个结构体是regmap的“配置文件”,定义了寄存器的核心参数,决定了regmap如何操作寄存器,必须和外设 datasheet 完全一致,否则会导致读写失败。

实战常用配置(新手必记),结合代码示例说明:

static const struct regmap_config dev_regmap_config = {    .reg_bits = 8,          // 寄存器地址宽度(8位/16位,必配)    .val_bits = 8,          // 寄存器数据宽度(8位/16位/32位,必配)    .writeable_reg = 0xFF,  // 可写寄存器掩码(0xFF表示所有8位地址可写)    .readable_reg = 0xFF,   // 可读寄存器掩码(0xFF表示所有8位地址可读)    .volatile_reg = 0x00,   // 易失性寄存器掩码(无易失性则设为0)    .cache_type = REGCACHE_NONE, // 缓存类型(新手先禁用,避免踩坑)    .reg_format_endian = REGMAP_ENDIAN_LITTLE, // 字节序(根据外设配置)};
  • reg_bits/val_bits:最核心的两个参数,必须和外设一致,比如外设寄存器地址是16位,却设为8位,会导致读写地址错误;
  • cache_type:缓存类型,新手建议先设为REGCACHE_NONE(禁用缓存),如果启用缓存,当外设寄存器被中断修改时,会出现缓存与实际值不一致的问题;
  • writeable_reg/readable_reg:用于权限控制,避免误写/误读不可操作的寄存器,提升驱动安全性。

4.2 总线适配接口(regmap总线驱动)

总线适配接口是regmap对接底层总线的关键,本质是regmap为每种总线实现的“专属驱动”,封装了该总线的寄存器读写逻辑。

核心原理:每种总线的适配接口,都会实现一套统一的“regmap总线操作函数”(比如read、write、update_bits等),regmap核心层调用这些函数,就能完成对应总线的通信,不用关心函数内部的总线协议细节。举个I2C总线适配的极简逻辑(不用深入源码):

// I2C总线的regmap适配函数(内核底层实现,开发者不用写)static const struct regmap_bus i2c_regmap_bus = {    .read = i2c_regmap_read,  // 封装I2C读取逻辑    .write = i2c_regmap_write,// 封装I2C写入逻辑};// 初始化I2C regmap(开发者调用)struct regmap *devm_regmap_init_i2c(struct i2c_client *client,                                   const struct regmap_config *config) {    return devm_regmap_init(&client->dev, &i2c_regmap_bus, client, config);}

可以看到,开发者调用devm_regmap_init_i2c时,regmap会自动关联I2C总线的适配函数,后续的读写请求,都会通过这些适配函数落地到I2C总线。

五、regmap框架实战:从初始化到使用

面试题写作模版

这部分是重点,结合I2C外设驱动实例,一步步讲解regmap的初始化、寄存器读写、注销,代码可直接复用,新手也能快速上手。

先明确前提:我们要写一个I2C外设驱动,通过regmap操作外设的寄存器,实现“读取设备ID”和“配置设备工作模式”的功能。

5.1 第一步:包含头文件+定义全局变量

#include <linux/module.h>#include <linux/i2c.h>#include <linux/regmap.h> // regmap核心头文件// 全局regmap指针,用于后续调用APIstatic struct regmap *dev_regmap;// I2C客户端指针,保存I2C设备信息static struct i2c_client *dev_i2c_client;

5.2 第二步:配置regmap参数(关键)

regmap初始化前,需要配置寄存器的核心参数,比如寄存器地址宽度、数据宽度、读写掩码等,这些参数要和外设 datasheet 一致。

// regmap配置参数(以8位地址、8位数据为例)static const struct regmap_config dev_regmap_config = {    .reg_bits = 8,          // 寄存器地址宽度:8位    .val_bits = 8,          // 寄存器数据宽度:8位    .writeable_reg = 0xFF,  // 所有8位地址的寄存器都可写(根据外设调整)    .readable_reg = 0xFF,   // 所有8位地址的寄存器都可读(根据外设调整)    .volatile_reg = 0x00,   // 无易失性寄存器(根据外设调整)    .cache_type = REGCACHE_NONE, // 不使用缓存(新手先禁用,避免踩坑)};
  1. reg_bits:寄存器地址的位数(常见8位、16位);
  2. val_bits:寄存器数据的位数(常见8位、16位、32位);
  3. writeable_reg/readable_reg:可写/可读寄存器的掩码,0xFF表示所有8位地址都可写/可读;
  4. cache_type:缓存类型,新手建议先设为REGCACHE_NONE(禁用缓存),避免缓存导致的读写异常。

5.3 第三步:初始化regmap(I2C总线为例)

在I2C设备的probe函数中,初始化regmap,关联I2C客户端和regmap配置。

// I2C设备probe函数(设备匹配成功后执行)staticintdev_i2c_probe(struct i2c_client *client, conststruct i2c_device_id *id) {    int ret;    // 保存I2C客户端指针    dev_i2c_client = client;    // 初始化regmap(I2C总线专用接口)    dev_regmap = devm_regmap_init_i2c(client, &dev_regmap_config);    if (IS_ERR(dev_regmap)) {        ret = PTR_ERR(dev_regmap);        dev_err(&client->dev, "regmap初始化失败: %d\n", ret);        return ret;    }    dev_info(&client->dev, "regmap初始化成功\n");    return 0;}

注意:不同总线的regmap初始化接口不同,常用的有3种:

  • I2C总线:devm_regmap_init_i2c(client, config);
  • SPI总线:devm_regmap_init_spi(spi, config);
  • MMIO总线:devm_regmap_init_mmio(dev, base, config);

其中devm_开头的函数,会自动管理内存,不用我们手动释放,降低内存泄漏风险。

5.4 第四步:使用regmap读写寄存器(核心操作)

regmap提供了统一的API,不管是哪种总线,读写逻辑完全一样,常用的API如下(新手重点记这4个):

  • regmap_read(regmap, reg, val):读取指定寄存器的值;
  • regmap_write(regmap, reg, val):向指定寄存器写入值;
  • regmap_update_bits(regmap, reg, mask, val):修改寄存器的指定位(不用读取再写入,更高效);
  • regmap_bulk_read/regmap_bulk_write:批量读写多个寄存器(减少总线通信次数)。

实战代码(读取设备ID+配置工作模式):

// 读取设备ID(假设设备ID寄存器地址为0x00)u8 dev_id;ret = regmap_read(dev_regmap, 0x00&dev_id);if (ret) {    dev_err(&dev_i2c_client->dev, "读取设备ID失败: %d\n", ret);else {    dev_info(&dev_i2c_client->dev, "设备ID: 0x%x\n", dev_id);}// 配置工作模式(假设工作模式寄存器地址为0x01,bit0设为1表示开启工作模式)// 方法1:直接写入regmap_write(dev_regmap, 0x010x01);// 方法2:修改指定位(更推荐,不影响其他位)regmap_update_bits(dev_regmap, 0x010x010x01); // mask=0x01,只修改bit0

对比之前的I2C/SPI手动读写代码,不难发现:使用regmap后,读写逻辑变得极其简单,不用再写复杂的总线通信代码,只需调用统一API即可。

5.5 第五步:注销regmap(自动释放)

因为我们使用了devm_开头的初始化函数,所以在驱动卸载时,不需要手动注销regmap,内核会自动释放regmap占用的资源,只需在remove函数中做一些自定义清理即可。

// I2C设备remove函数(驱动卸载时执行)staticintdev_i2c_remove(struct i2c_client *client) {    dev_info(&client->dev, "驱动卸载成功\n");    return 0;}

完整驱动框架(整合所有代码)如下:

#include <linux/module.h>#include <linux/i2c.h>#include <linux/regmap.h>static struct regmap *dev_regmap;static struct i2c_client *dev_i2c_client;static const struct regmap_config dev_regmap_config = {    .reg_bits = 8,    .val_bits = 8,    .writeable_reg = 0xFF,    .readable_reg = 0xFF,    .cache_type = REGCACHE_NONE,};staticintdev_i2c_probe(struct i2c_client *client, conststruct i2c_device_id *id){    int ret;    u8 dev_id;    dev_i2c_client = client;    // 初始化regmap    dev_regmap = devm_regmap_init_i2c(client, &dev_regmap_config);    if (IS_ERR(dev_regmap)) {        ret = PTR_ERR(dev_regmap);        dev_err(&client->dev, "regmap初始化失败: %d\n", ret);        return ret;    }    // 读取设备ID    ret = regmap_read(dev_regmap, 0x00, &dev_id);    if (ret) {        dev_err(&client->dev, "读取设备ID失败: %d\n", ret);        return ret;    }    dev_info(&client->dev, "设备ID: 0x%x\n", dev_id);    // 配置工作模式    ret = regmap_update_bits(dev_regmap, 0x010x010x01);    if (ret) {        dev_err(&client->dev, "配置工作模式失败: %d\n", ret);        return ret;    }    dev_info(&client->dev, "驱动初始化成功\n");    return 0;}staticintdev_i2c_remove(struct i2c_client *client){    dev_info(&client->dev, "驱动卸载成功\n");    return 0;}// I2C设备ID表(匹配设备)static const struct i2c_device_id dev_i2c_id[] = {    {"my_dev"0},    {},};MODULE_DEVICE_TABLE(i2c, dev_i2c_id);// I2C驱动结构体static struct i2c_driver dev_i2c_driver = {    .probe = dev_i2c_probe,    .remove = dev_i2c_remove,    .id_table = dev_i2c_id,    .driver = {        .name = "my_dev_i2c",        .owner = THIS_MODULE,    },};module_i2c_driver(dev_i2c_driver);MODULE_LICENSE("GPL");MODULE_DESCRIPTION("Linux驱动regmap框架实战");MODULE_AUTHOR("Linux驱动博主");

新手使用 regmap 时,因对框架分层及核心组件理解不足,易踩以下几个坑:

  1. 配置参数与外设不匹配:reg_bits、val_bits、字节序等参数若与外设 datasheet 不一致,会致寄存器读写地址错误、数据错乱。排查时应先核对 regmap_config 配置。
  2. 缓存使用不当致数据异常:启用缓存后,外设寄存器被中断或其他驱动修改,regmap 缓存数据无法同步更新,易读到旧数据。新手可先禁用缓存,后续依需求启用并处理同步。
  3. 总线初始化顺序错误:需先初始化总线设备(如 I2C 客户端、SPI 设备),再初始化 regmap,否则 regmap 无法关联总线适配层致初始化失败,因其需总线设备指针才能工作。
  4. 忽略 API 返回值检查:regmap_read、regmap_write 等 API 返回值反映总线通信状况,忽略会使通信失败后难以排查问题,建议调用所有 API 时检查返回值。

总结:新手使用 regmap,关键在于深入理解框架分层与核心组件。在实际操作中,务必仔细核对配置参数与外设的一致性,谨慎处理缓存使用,遵循正确的总线初始化顺序,并重视 API 返回值检查。这些要点是避免 regmap 使用过程中常见错误的关键,有助于新手高效且准确地运用 regmap,减少不必要的弯路,提升开发效率与代码稳定性。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 19:19:14 HTTP/2.0 GET : https://f.mffb.com.cn/a/483280.html
  2. 运行时间 : 0.160185s [ 吞吐率:6.24req/s ] 内存消耗:5,234.95kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=92dc22b3c30c140b512bc395bd02ea5c
  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.000618s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000749s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000277s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000281s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000650s ]
  6. SELECT * FROM `set` [ RunTime:0.000203s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000502s ]
  8. SELECT * FROM `article` WHERE `id` = 483280 LIMIT 1 [ RunTime:0.004202s ]
  9. UPDATE `article` SET `lasttime` = 1774610354 WHERE `id` = 483280 [ RunTime:0.003382s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000245s ]
  11. SELECT * FROM `article` WHERE `id` < 483280 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000860s ]
  12. SELECT * FROM `article` WHERE `id` > 483280 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.010219s ]
  13. SELECT * FROM `article` WHERE `id` < 483280 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003662s ]
  14. SELECT * FROM `article` WHERE `id` < 483280 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.032426s ]
  15. SELECT * FROM `article` WHERE `id` < 483280 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.035023s ]
0.161681s