当前位置:首页>Linux>点灯也要有仪式感!从单片机寄存器到Linux设备树的降维解析

点灯也要有仪式感!从单片机寄存器到Linux设备树的降维解析

  • 2026-03-26 15:27:37
点灯也要有仪式感!从单片机寄存器到Linux设备树的降维解析

导读:在 51 单片机或 STM32 上,3 行 C 代码就能点亮一盏 LED。但当你在 i.MX6UL 或 RK3288 上用同样的方式写代码时,终端会无情地弹出一行“Segmentation fault”。为什么点个灯需要面对平台总线、设备树、字符设备驱动甚至虚拟文件系统?这篇文章将带你一层一层剥开“底层驱动”这颗洋葱,从最微观的单片机硬件寄存器,一路向上打通到宏观的 Linux 系统架构与设备树。


引言:一段让人怀疑人生的“段错误”

如果你是一名电子工程或计算机相关专业的学生,或者是刚踏入嵌入式大门的初学者,你的职业生涯绝对是从“点亮一盏 LED 灯”开始的。在经典的 51 单片机或者 STM32 上,点灯是一件极具“直男美学”的事情——查阅数据手册,找到 GPIO 的物理地址,通过 C 语言指针直接给寄存器赋值为 1 或 0,灯就亮了。整个过程简单、粗暴、所见即所得。

然而,当你带着这种自信,跨入嵌入式 Linux 的世界,准备在一块 i.MX6UL 或 RK3288 开发板上重温点灯的成就感时,绝望往往会如影随形。

你按照老习惯,写了一段包含绝对地址指针赋值的 C 代码,在 Linux 终端里用 GCC 编译通过。当你满怀期待地敲下。/led_test 回车运行时,终端上无情地弹出一行刺眼的英文字母:

Segmentation fault (core dumped) —— 段错误(核心已转储)

那一刻,你可能懵了:“数据手册上明明写着 GPIO1_DR 寄存器的物理地址就是 0x0209C000,我直接写入数据,为什么系统直接把我的程序杀死了?为什么在单片机上只要 3 行代码就能点亮的 LED,到了 Linux 里却要面对平台总线、设备树、字符设备驱动甚至是虚拟文件系统?”

为什么点个灯需要这么强的“仪式感”?

今天,我们就来玩一场降维解析。我将带你一层一层剥开这颗名为“底层驱动”的洋葱,从最微观的单片机硬件寄存器,一路向上打通到宏观的 Linux 系统架构与设备树。无论你是对底层逻辑一知半解的在校生,还是看内核代码感到头晕目眩的初级工程师,这篇文章都将帮你彻底打通软硬结合的任督二脉。


单片机点灯的物理本质

要理解 Linux 为什么复杂,我们必须先彻底看透单片机为什么简单。在单片机(裸机)环境下,软件和硬件处于一种零距离的裸奔状态

什么是寄存器?

我们常说操作芯片就是操作寄存器。从微观电路来看,寄存器本质上是多个触发器组成的锁存电路。当你用软件向寄存器的某一位写 1 时,其实就是给那个触发器的输入端施加了一个高电平脉冲,触发器翻转,并持续输出高电平。这个高电平经过芯片内部的推挽放大电路,最终出现在了芯片外部的物理引脚上。外接的 LED 灯两端一旦产生电压差,电流流过,灯就亮了。

CPU 是如何找到这个寄存器的?

CPU 是一个只懂算术和逻辑运算的“瞎子”,它根本不知道外面有没有接 LED。CPU 唯一能做的事情,就是通过总线向某个特定的地址发送数据。

这就引出了嵌入式硬件体系中最重要的概念:内存映射 I/O

芯片设计工程师在设计 SoC 时,会将 CPU 的寻址空间划分成不同的区块。比如一个 32 位的 CPU,它的寻址范围是 0x00000000 到 0xFFFFFFFF(共 4GB)。工程师规定:

前面的一部分地址空间留给内部的 SRAM(运行内存)。

中间的一部分地址空间留给 Flash(存储代码)。

专门划出一块地址空间(例如 0x40000000 起始),将外设(如 GPIO、串口、定时器)的控制电路硬连线到总线的这片地址上。

这就是为什么我们在 STM32 的数据手册上能查到一个叫 GPIOA_ODR(输出数据寄存器)的地址比如是 0x4001080C。

C 语言指针的极致压榨:裸机点灯代码本质

在裸机 C 语言中,我们是如何操作这个硬件地址的?靠的就是 C 语言的灵魂——指针

// 宏定义:将物理地址强制转换为 volatile 类型的指针,并解引用

#define GPIOA_ODR *((volatile unsigned int *)(0x4001080C))

voidled_on(void) {

// 读-改-写操作

// 将 GPIOA 的第 5 位置 1,其余位保持不变

    GPIOA_ODR |= (1 << 5); 

}

在这段看似简单的代码中,有三个极其关键的底层细节,也是面试官最爱考的:

第一个细节:强制类型转换。告诉编译器,把 0x4001080C 这个普通数字当成一个内存地址,并且这个地址里存放的是一个 32 位的数据。

第二个细节:解引用。这是向该地址对应的硬件写入数据的实质动作。

第三个细节:volatile 关键字。这是防坑神器!它是告诉编译器的优化器:“不要对我做任何自作聪明的优化,我指向的这个内存地址是硬件外设,它的值可能会在 CPU 不知情的情况下发生改变。你每次操作它,都必须老老实实地通过总线去读写物理地址!”

在单片机时代,你写的这个地址 0x4001080C,就是总线上真实的物理地址。没有任何人阻拦你。


Linux 的“叹息之墙”

当我们来到可以运行 Linux 的高端处理器(如 ARMCortex-A 系列)时,情况发生了翻天覆地的变化。

回到引言中那个让你崩溃的 Segmentation fault。为什么同样的指针绝对地址操作,在 Linux 中会被无情杀死?原因在于,在 Linux 的世界里,横亘着一堵叹息之墙——MMU(内存管理单元)

为什么我们需要 MMU?

在没有 MMU 的单片机上,所有程序共用同一个物理内存空间。如果程序 A 出现一个野指针,不小心写了程序 B 的内存,系统直接崩溃。这种极度脆弱的架构对于一个要同时跑图形界面、网络协议栈、多线程应用的复杂操作系统来说,是不可接受的。

为了解决这个问题,硬件工程师在 CPU 和物理内存总线之间,塞入了一个硬件模块:MMU。

Linux 开启 MMU 后,所有的应用程序能看到的、能使用的地址,全都是虚拟地址

打个比方:物理内存就像是现实中的酒店房间(如 402 房间)。你在用户态写的 C 语言程序,拿到的房卡上写着“虚拟房间号 0x08048000”。当你拿着这张卡去开门时,MMU 这个“酒店前台”会截获你的请求,查阅一本叫做页表的账本,然后把你悄悄引导到真正的物理房间。

什么是段错误?

如果你在 Linux 用户态程序中,强行定义一个指针指向真实的硬件物理地址 0x0209C000 并尝试写入,MMU 这个“前台”一查页表,发现这个虚拟地址根本没有被分配,或者你没有权限访问。MMU 会立即向 CPU 发出一个硬件异常信号。Linux 内核捕获到这个异常,发现你是个越界的“危险分子”,于是毫不留情地向你的进程发送 SIGSEGV 信号,你的程序就此暴毙,留下“段错误”的遗言。

用户态与内核态的隔离

为了绝对的安全,Linux 将系统分为了两个世界:

用户态:运行普通应用程序,权限极低,绝对不允许直接接触物理硬件。

内核态:运行 Linux 内核代码和底层驱动程序,拥有最高权限,可以配置硬件。

结论:在 Linux 下点灯,你的应用程序绝不可能直接操作硬件。你必须写一个运行在内核态的驱动程序作为中间人。应用程序通过标准的系统调用(如 open、write)向驱动程序发请求,驱动程序再在内核态帮去操作寄存器硬件。


剥洋葱第三层:设备树的降维打击

现在我们知道,点灯需要写 Linux 内核驱动。在早期的 Linux 时代,驱动工程师依然面临着巨大的痛苦。

混乱的硬编码时代

想象一下,公司有 10 款不同的开发板,虽然都用了同一款主控芯片,但有的板子把 LED 接在 GPIO1,有的接在 GPIO5。

在 2011 年之前,Linux 内核工程师是怎么做的?他们会在内核源码的 arch/arm/mach-xxx 目录下,用 C 语言建立一个个冗长结构体,把每一块板子的硬件信息硬编码死在内核里。

这导致 Linux 内核源码里充斥着成千上万行没有任何逻辑价值的“垃圾代码”。每一次新出一块破板子,就要修改一次 Linux 内核源码并重新编译整个内核。

终于,Linux 的祖师爷 LinusTorvalds 忍无可忍。在 2011 年的 ARMLinux 邮件列表中,他发出了那句著名的怒吼:

“This whole ARM thing is a f*cking pain in the ass.”

设备树:硬件与软件的彻底解耦

为了平息祖师爷的怒火,ARMLinux 社区引入了从 PowerPC 架构借鉴来的神器:Device Tree(设备树)

设备树的本质是一种降维打击:它将“硬件配置信息”从“C 语言可执行代码”中彻底剥离出来,变成了一种纯文本配置文件

DTS(Device Tree Source):人类可读的文本文件。它像一棵树一样,用节点和属性描述了板子上所有的硬件。

DTC(Device Tree Compiler):设备树编译器。把 DTS 文本编译成机器能读懂的二进制文件 DTB。

DTB(Device Tree Blob):在系统上电启动时,U-Boot 会将 DTB 文件加载到内存中,并把它的首地址传给 Linux 内核。

Linux 内核在启动时,会去解析这棵“树”,然后根据树上的信息,自动去匹配并加载相应的驱动程序。这意味着:无论硬件怎么改,你的 C 语言驱动代码一行都不用变!你只需要修改 DTS 文本文件即可!这就是“机制与策略分离”的最高哲学。

设备树里如何描述一个 LED?

让我们来看一个真实的 DTS 节点写法,体会一下它的优雅:

/ {

    my_board_leds {

        compatible = "my-company,red-led";

        // 寄存器地址空间

        reg = <0x0209C000 0x04>;

        default-state = "off";

    };

};

发现了吗?这简直就是一份机器可读的数据手册!没有任何复杂的逻辑,全是描述性的键值对。


保姆级代码实战:软硬结合的终极展现

理论全打通,是时候上刺刀了。接下来我们要写一段真实的、运行在内核态的 Linux 字符设备/平台驱动代码。这部分代码是初中级工程师必须掌握的硬核技能。

#include<linux module.h="">

#include<linux platform_device.h="">

#include<linux of.h="">

#include<linux io.h="">

// 1. 定义一个指向虚拟地址的全局指针,用来操作硬件

staticvoid __iomem *led_reg_base;

// 2. probe 函数:当内核发现设备树中的设备与本驱动匹配时,会自动调用此函数!

staticintmy_led_probe(struct platform_device *pdev) {

structdevice_node *node = pdev->dev.of_node;

structresource *res;

    u32 val;

    printk(KERN_INFO "LED driver probe triggered!");

if (!node) {

        printk(KERN_ERR "No device tree node found!");

return -ENODEV;

    }

// 步骤一:从设备树节点中提取内存资源

    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

if (!res) {

        printk(KERN_ERR "Failed to get memory resource");

return -EINVAL;

    }

// 步骤二:神圣的 ioremap(降维打击的核心)

// 此时拿到的是物理地址,内核态不能直接用物理地址!

// ioremap 作用:请求内核内部的 MMU 为这段物理内存分配一块虚拟地址

    led_reg_base = ioremap(res->start, resource_size(res));

if (!led_reg_base) {

        printk(KERN_ERR "Failed to ioremap");

return -ENOMEM;

    }

    printk(KERN_INFO "Mapped Physical Addr 0x%llx to Virtual Addr %p"

           (unsignedlonglong)res->start, led_reg_base);

// 步骤三:操作寄存器点亮 LED!

// 注意:内核编程严禁直接用指针赋值,必须用内核提供的专属宏 readl/writel

    val = readl(led_reg_base);

    val |= (1 << 5);

    writel(val, led_reg_base);

    printk(KERN_INFO "LED is ON now!");

return0;

}

// 3. remove 函数:当驱动被卸载或设备被移除时调用

staticintmy_led_remove(struct platform_device *drv) {

    u32 val;

    val = readl(led_reg_base);

    val &= ~(1 << 5);

    writel(val, led_reg_base);

    iounmap(led_reg_base);

    printk(KERN_INFO "LED driver removed, unmapped memory.");

return0;

}

// 4. of_match_table:相亲名单

staticconststructof_device_idmy_led_of_match[] = {

    { .compatible = "my-company,red-led", }, 

    { }

};

MODULE_DEVICE_TABLE(of, my_led_of_match);

// 5. 定义 platform_driver 结构体

staticstructplatform_drivermy_led_driver = {

    .probe  = my_led_probe,

    .remove = my_led_remove,

    .driver = {

        .name = "my_custom_led_driver",

        .of_match_table = my_led_of_match,

    },

};

// 6. 模块入口和出口宏

module_platform_driver(my_led_driver);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("微信公众号技术博主");

MODULE_DESCRIPTION("A simple LED driver showing DTS to Register Mapping");

</linux></linux></linux></linux>

在这段代码中,最核心的灵魂就是 ioremap()。它就像一座桥梁,成功地将单片机思维和 Linux 高级思维连接在了一起。你拿到的 led_reg_base 依然是一个指针,但它已经是一个被内核加持过的“安全”的虚拟指针。之后使用的 readl()和 writel()宏,底层其实封装了安全的内存屏障操作,防止编译器和 CPU 的乱序执行打乱你的配置顺序。


避坑指南与 Debug 思维

在实际工程项目中,即使你完全照抄了上面的代码,灯也不一定能亮。作为一名“掉过无数坑”的老鸟,我给你总结三个最致命、面试中最容易被问到的天坑。

天坑一:时钟未使能

症状:代码跑到了 writel 这一行,系统瞬间卡死,或者终端弹出一大串 KernelPanic 寄存器堆栈报错。

排查思路:很多单片机转过来的新手会忽略一个极其重要的硬件限制:在现代 SoC 芯片中,为了降低功耗,所有外设(包括 GPIO 控制器)的时钟默认都是关闭的!如果没有在寄存器中打开 GPIO 的时钟总线,当你强行通过总线去读写它的寄存器时,总线会因为没有响应而触发硬件级的总线错误。

解法:在 Linux 中,你应该在 probe 函数中使用 CCF(Common Clock Framework)时钟子系统,先获取并使能时钟,再操作寄存器。

天坑二:设备树匹配失败

症状:驱动用 insmod 加载进去了,没有任何报错,但是 probe 函数根本没有执行。

排查思路:内核是一个“被动”响应的框架。如果 probe 没执行,99% 的概率是你的驱动里的 compatible 和设备树(DTS)里的写得不一样。哪怕多了一个空格、大小写错了一个字母,内核都会认为你们不合适。

解法:检查设备树编译出来的系统路径,进入板子的/sys/firmware/devicetree/base/目录,用 cat compatible 确认系统真正在跑的设备树属性到底是什么。

天坑三:并发竞态导致的“闪烁不均”

症状:点灯代码如果放在一个会被多个应用程序高频调用的接口里,偶尔写入了指令,灯的状态却没有按预期改变。

排查思路:仔细看我们的代码:val = readl(); val |= (1 << 5); writel();这是一个典型的读-改-写操作,分为三条汇编指令。如果在这三条指令中间,CPU 发生了中断或线程切换,其他程序也修改了这个寄存器的其他位,等你切回来执行 writel 时,就会把别人的修改覆盖掉!

解法:在内核开发中,操作共享的硬件寄存器,必须加上同步保护机制!如果是中断上下文,应该使用自旋锁将这三行代码包裹起来,保证操作的原子性。


结语

从单片机的一行指针赋值,到 Linux 里的 MMU、虚拟地址、设备树解析、平台总线和驱动模型。为了点亮同一盏灯,Linux 绕了巨大的一圈。

但这种“复杂”和“仪式感”,绝不是吃饱了撑的。它是成千上万顶尖程序员为了应对万物互联时代庞大而碎片化的硬件生态,在血与泪的 Bug 中进化出的终极抽象艺术。

当你不仅能熟练地写出花里胡哨的应用层代码,更能深深潜入内核,理解电流是如何跨越虚拟和物理的边界最终点亮那盏微弱的红灯时,你才真正具备了底层工程师的核心竞争力。

你目前的开发工作是停留在单片机阶段还是已经涉足 Linux 内核了呢?针对今天提到的设备树语法,你希望我为你输出一份专门的 DTS 节点实战解析文章吗

写在后面
还不知道如何下手学习单片机?信盈达精心整理《STM32全能学习包》,学习书籍、软件工具包、课件教案、项目原理图、芯片手册、例程代码、视频教程等一次性全部送上!助你快速升级打BOSS。大家可以添加下方小助手领取~

 添加小助手   领取学习包  

添加后回复 “单片机” 更快领取哦

 - END - 

点击下方视频,关注我们视频号,精彩视频享不停!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 10:05:53 HTTP/2.0 GET : https://f.mffb.com.cn/a/480620.html
  2. 运行时间 : 0.173194s [ 吞吐率:5.77req/s ] 内存消耗:4,858.78kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=99c522deebb958cc4ce9982404f74adc
  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.000997s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001657s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.001353s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.003448s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001380s ]
  6. SELECT * FROM `set` [ RunTime:0.004835s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001830s ]
  8. SELECT * FROM `article` WHERE `id` = 480620 LIMIT 1 [ RunTime:0.001186s ]
  9. UPDATE `article` SET `lasttime` = 1774577153 WHERE `id` = 480620 [ RunTime:0.007118s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000791s ]
  11. SELECT * FROM `article` WHERE `id` < 480620 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.002150s ]
  12. SELECT * FROM `article` WHERE `id` > 480620 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.009848s ]
  13. SELECT * FROM `article` WHERE `id` < 480620 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.008460s ]
  14. SELECT * FROM `article` WHERE `id` < 480620 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003485s ]
  15. SELECT * FROM `article` WHERE `id` < 480620 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.003436s ]
0.177435s