乐于分享
好东西不私藏

《Linux-0.12 源码篇》- 11 数学协处理器模拟

《Linux-0.12 源码篇》- 11 数学协处理器模拟

字数 3143,阅读大约需 16 分钟

第十一章:数学协处理器模拟:软件实现的浮点运算

80386 CPU本身不包含浮点运算单元,浮点运算由独立的80387数学协处理器完成。但并非所有系统都配备了协处理器,因此Linux 0.12实现了协处理器模拟,通过软件模拟浮点指令的执行,让没有协处理器的系统也能运行浮点程序。

11.1 协处理器架构

80387协处理器有8个80位浮点寄存器(ST0-ST7),组织为栈结构。浮点指令从内存或寄存器栈加载操作数,执行运算,将结果压入栈。协处理器还有控制字寄存器(设置舍入模式、精度、异常屏蔽)和状态字寄存器(记录异常标志、栈指针、条件码)。

80387寄存器与状态

80387的完整状态保存在i387_state结构中,包含控制字CW(舍入模式、精度、异常屏蔽位)、状态字SW(异常标志、栈顶指针TOP、条件码)、标签字TW(标记每个寄存器的类型),以及8个80位扩展精度浮点寄存器ST0-ST7。每个进程的task_struct中保存一份i387状态,支持上下文切换时保存和恢复。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

/* include/linux/math_emu.h - 协处理器状态结构 */

/* 80位扩展精度浮点数: bit79=符号, bit78-64=指数(偏置16383), bit63-0=尾数 */
typedefstruct {
    unsigned short exp;         /* 符号+指数 */
    unsigned long hi;           /* 尾数高32位 */
    unsigned long lo;           /* 尾数低32位 */
} FP_REG;

struct i387_state {
    unsigned short control_word;    /* CW: 舍入/精度/异常屏蔽 */
    unsigned short status_word;     /* SW: 异常标志/栈指针TOP/条件码 */
    unsigned short tag_word;        /* TW: 每个寄存器类型(有效/零/特殊/空) */
    unsigned long  fip;             /* 指令指针 */
    unsigned short fcs;             /* 指令段选择符 */
    unsigned short opcode;          /* 操作码 */
    unsigned long  foo;             /* 操作数偏移 */
    unsigned short fos;             /* 操作数段选择符 */
    FP_REG        st[8];           /* ST0-ST7浮点寄存器栈 */
};


协处理器指令以ESC转义前缀(0xD8-0xDF)开头,后跟操作码和操作数。例如FADD指令(浮点加法)、FMUL指令(浮点乘法)、FSQRT指令(平方根)。协处理器与主CPU协同工作:主CPU执行到ESC指令时,将指令和操作数传递给协处理器,协处理器执行浮点运算,主CPU继续执行下一条指令(异步并行)。

如果系统没有协处理器,主CPU执行ESC指令时会触发device_not_available异常(INT 7)。Linux 0.12的异常处理程序检测到这是浮点指令,就调用协处理器模拟器math_emulate()来软件模拟指令执行。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

                        ┌─────────────┐
                        │ 执行FADD指令       │
                        └──────┬──────┘
                                        │
                                       ▼
                   ┌──────────────────┐
                   │           有协处理器?            │
                   └────────┬─────────┘
                                       │
         ┌────────────┴──────────────┐
         │ 是                                                        │ 否
         ▼                                                           ▼
   ┌────────┐                           ┌─────────────┐
   │ 硬件执行     │                           │ 软件模拟执行         │
   │ (快速)         │                           │ (慢速,透明)          │
   └────────┘                           └─────────────┘


11.2 协处理器模拟器

math_emulate.c是协处理器模拟器的入口。它接收异常时保存的指令地址和操作数,解析浮点指令的操作码,根据指令类型调用相应的处理函数。

device_not_available异常处理

当CPU执行浮点指令时,如果CR0的TS位(任务切换时置1)或EM位(无协处理器时置1)被设置,就触发INT 7异常。处理程序先清除TS位,然后根据情况恢复或初始化当前进程的浮点状态。Linux采用"延迟保存"策略——只在进程实际使用浮点时才保存/恢复协处理器状态,避免无谓的开销。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

/* kernel/traps.c - 设备不可用异常处理 */
/* CR0: TS位(位3)=任务切换标志, EM位(位2)=协处理器模拟标志 */

void device_not_available(void)
{
    __asm__("clts");            /* 清除CR0.TS位 */

    if (current->flags & PF_USEDFPU) {
        /* 进程曾使用浮点: 恢复其协处理器状态 */
        math_state_restore();
        return;
    }
    /* 第一次使用: 初始化浮点状态 */
    current->flags |= PF_USEDFPU;
    init_i387(&current->i387);
}


math_state_restore与延迟保存

Linux采用"延迟保存"策略处理协处理器状态,即只有当新任务第一次使用浮点运算时才恢复状态,而不是在每次任务切换时保存/恢复。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

/* kernel/math/math_emulate.c - 协处理器状态恢复 */
struct task_struct *last_task_used_math = NULL;

void math_state_restore(void)
{
    if (last_task_used_math == current) return;  /* 同一进程,无需操作 */

    if (last_task_used_math)
        save_i387(&last_task_used_math->i387);  /* 保存上一个任务的FPU状态 */

    if (current->used_math)
        restore_i387(&current->i387);            /* 恢复当前任务的FPU状态 */
    else {
        init_i387(&current->i387);               /* 首次使用,初始化 */
        current->used_math = 1;
    }
    last_task_used_math = current;               /* 更新FPU拥有者 */
}


math_emulate入口

当CR0.EM=1时,所有浮点指令都会产生INT 7。math_emulate()从触发异常的eip处读取ESC前缀字节(0xD8-0xDF)确定指令组,再读取ModR/M字节解析寻址模式,然后分派到do_esc0~do_esc7八个处理函数。每个处理函数再根据Reg字段确定具体操作(加法、乘法、比较等)。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

/* kernel/math/math_emulate.c - 模拟器入口 */
void math_emulate(long edi, long esi, long ebp, long esp, long ebx,
                  long edx, long ecx, long eax,
                  unsigned short ds, es, fs, gs,
                  unsigned long eip, unsigned short cs, unsigned long eflags)
{
    unsigned char opcode = get_fs_byte((unsigned char *)eip);
    unsigned char modrm = get_fs_byte((unsigned char *)(eip + 1));
    unsigned long addr;
    decode_ea(modrm, &addr);        /* 解析ModR/M计算有效地址 */

    switch (opcode) {
    case 0xD8: do_esc0(modrm, addr); break;  /* 单精度运算 */
    case 0xD9: do_esc1(modrm, addr); break;  /* 控制/状态/常数 */
    case 0xDC: do_esc4(modrm, addr); break;  /* 双精度运算 */
    /* 0xDA, 0xDB, 0xDD, 0xDE, 0xDF 类似处理 */
    default:
        printk("math_emulate: unknown ESC %02x\n", opcode);
        do_exit(SIGFPE);
    }
    /* 根据指令长度调整eip */
}

/* ModR/M字节: bit7-6=Mod(寻址模式), bit5-3=Reg(子操作码), bit2-0=R/M */


模拟器维护一个模拟的协处理器状态,保存在进程的task_struct->i387字段中。这个字段包含8个浮点寄存器、控制字、状态字、标志字等,与真实的80387状态完全对应。

浮点指令的模拟分为几个步骤:首先解析指令获取操作码和地址模式,然后从内存或寄存器栈加载操作数(可能需要格式转换,80387支持单精度、双精度、扩展精度等多种格式),调用相应的运算函数(加减乘除、开方、三角函数等),将结果写回寄存器栈或内存,更新状态字(异常标志、栈指针、条件码)。

由于浮点运算的复杂性,模拟器的实现非常庞大。Linux 0.12的math子目录包含多个C文件:add.c实现加法,mul.c实现乘法,div.c实现除法,compare.c实现比较,get_put.c实现加载和存储,convert.c实现格式转换。每个文件都有数百行代码,处理各种精度、舍入模式、特殊值(无穷大、NaN)。

11.3 浮点数表示

80387使用IEEE 754浮点标准。扩展精度格式(80位)包含1位符号、15位指数、64位尾数。双精度格式(64位)包含1位符号、11位指数、52位尾数。单精度格式(32位)包含1位符号、8位指数、23位尾数。

IEEE 754浮点标准

IEEE 754格式细节

IEEE 754定义了三种浮点格式。单精度32位(1位符号+8位指数+23位尾数,偏置127)、双精度64位(1位符号+11位指数+52位尾数,偏置1023)、扩展精度80位(1位符号+15位指数+64位尾数,偏置16383)。特殊值通过指数全0或全1编码:零、非规格化数、无穷大、NaN。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

/* 单精度浮点数(32位) */
typedefunion {
    float f;
struct {
        unsigned int mantissa:23;  /* 尾数 */
        unsigned int exponent:8;   /* 指数(偏置127) */
        unsigned int sign:1;       /* 符号 */
    } parts;
} float32;

/* 双精度浮点数(64位) */
typedefunion {
    double d;
struct {
        unsigned long mantissa:52;
        unsigned long exponent:11;  /* 偏置1023 */
        unsigned long sign:1;
    } parts;
} float64;

/* 特殊值编码:
 * 指数全0+尾数全0 = ±0    指数全0+尾数非0 = 非规格化数
 * 指数全1+尾数全0 = ±∞    指数全1+尾数非0 = NaN
 * 其他 = 规格化数(隐含最高位1) */


模拟器中的浮点表示

模拟器内部使用80位扩展精度运算以保证精度。加载单精度数到扩展精度寄存器时,需要处理零、非规格化数(需规范化)、无穷大/NaN等特殊情况,并调整指数偏置(127→16383)和尾数对齐。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

/* 将单精度数加载到扩展精度寄存器中 */
void load_single(FP_REG *st, float32 src)
{
    int e = src.parts.exponent;
    unsigned int m = src.parts.mantissa;

    if (e == 0 && m == 0) {
        st->exp = 0; st->hi = st->lo = 0;          /* 零 */
    } else if (e == 0) {
        /* 非规格化数: 规范化 */
        while (!(m & 0x400000)) { m <<= 1; e--; }
        e++;
        st->exp = (e - 127 + 16383) | (src.parts.sign << 15);
        st->hi = (unsigned long)m << 8; st->lo = 0;
    } else if (e == 255) {
        st->exp = 0x7FFF | (src.parts.sign << 15);  /* ∞/NaN */
        st->hi = st->lo = 0xFFFFFFFF;
    } else {
        m |= 0x800000;                               /* 隐含的1 */
        st->exp = (e - 127 + 16383) | (src.parts.sign << 15);
        st->hi = (unsigned long)m << 8; st->lo = 0;
    }
}


浮点运算需要处理这些特殊情况。例如正数除以零得正无穷,零除以零得NaN,无穷大加无穷大得无穷大,无穷大减无穷大得NaN。模拟器必须正确实现这些语义,保证与硬件协处理器的行为一致。

11.4 舍入与精度

浮点运算结果可能无法精确表示(例如1/3),需要舍入。80387支持四种舍入模式:向最近舍入(默认,四舍五入)、向零舍入(截断)、向正无穷舍入(向上)、向负无穷舍入(向下)。控制字寄存器的RC字段设置舍入模式。

舍入模式与精度控制

控制字的RC字段(bit10-11)控制舍入方向,PC字段(bit8-9)控制运算精度(24/53/64位)。模拟器在运算后根据这两个设置调整结果尾数,处理舍入引起的精度异常。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

/* 控制字中的舍入模式(RC)和精度控制(PC) */
#define RC_NEAR   0x0000   /* 向最近舍入(默认) */
#define RC_DOWN   0x0400   /* 向负无穷 */
#define RC_UP     0x0800   /* 向正无穷 */
#define RC_CHOP   0x0C00   /* 向零截断 */

#define PC_24     0x0000   /* 单精度(24位) */
#define PC_53     0x0200   /* 双精度(53位) */
#define PC_64     0x0300   /* 扩展精度(64位) */

/* 舍入流程(伪代码):
 * 1. 根据PC确定保留位数(24/53/64)
 * 2. 分析尾数多余低位和舍入位/粘滞位
 * 3. 根据RC选择舍入方向
 * 4. 检查是否触发精度/溢出/下溢异常 */


11.5 性能考虑

软件模拟浮点运算比硬件协处理器慢得多,大约慢100倍甚至更多。一条简单的FADD指令,硬件协处理器几个时钟周期即可完成,而软件模拟需要成千上万条指令。因此对于浮点密集型程序(如科学计算、图形渲染),没有协处理器的系统性能会严重下降。

Linux 0.12在实现时尽量优化模拟器性能,例如使用查表法加速某些运算,使用整数运算模拟浮点运算(因为整数运算快得多)。但即使如此,软件模拟仍然是性能瓶颈。好在到90年代中期,浮点单元已经集成到CPU内部(如Pentium),协处理器模拟逐渐不再需要。

Linux 0.12的协处理器模拟展示了操作系统的适应性:通过软件补偿硬件的不足,让系统能在各种配置下运行。虽然性能不佳,但总比完全无法运行浮点程序要好。这种权衡在早期计算机时代非常常见。

通过本章的学习,我们理解了Linux 0.12的协处理器模拟实现:从80387架构到模拟器工作原理,从浮点数表示到舍入和精度,以及性能考虑。协处理器模拟虽然复杂且性能不佳,但它让Linux能够在没有浮点硬件的系统上运行,体现了操作系统的兼容性设计。

11.6 参考资料

本章内容基于以下资料编写:

Intel官方文档

  • • Intel 80387 Programmer's Reference Manual (1987)
    • • 详细描述了80387协处理器架构、指令集、浮点格式

IEEE标准

  • • IEEE 754-1985 Standard for Binary Floating-Point Arithmetic
    • • 定义了浮点数表示和运算语义

Linux 0.12源代码文件

  • • kernel/math/math_emulate.c - 协处理器模拟器入口
  • • kernel/math/add.c - 浮点加法
  • • kernel/math/mul.c - 浮点乘法
  • • kernel/math/div.c - 浮点除法
  • • kernel/math/compare.c - 浮点比较
  • • kernel/math/get_put.c - 加载和存储
  • • kernel/math/convert.c - 格式转换
  • • kernel/math/ea.c - 有效地址计算
  • • kernel/traps.c - device_not_available异常处理
  • • include/linux/math_emu.h - 协处理器模拟器数据结构

"精诚所至,金石为开。" —— 《后汉书》

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-31 01:07:33 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/684229.html
  2. 运行时间 : 0.150582s [ 吞吐率:6.64req/s ] 内存消耗:4,728.58kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=0b37f910cbf061c843ce9e18383a0271
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000633s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000820s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000298s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000229s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000507s ]
  6. SELECT * FROM `set` [ RunTime:0.000195s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000488s ]
  8. SELECT * FROM `article` WHERE `id` = 684229 LIMIT 1 [ RunTime:0.001050s ]
  9. UPDATE `article` SET `lasttime` = 1780160853 WHERE `id` = 684229 [ RunTime:0.016108s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000799s ]
  11. SELECT * FROM `article` WHERE `id` < 684229 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001274s ]
  12. SELECT * FROM `article` WHERE `id` > 684229 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001214s ]
  13. SELECT * FROM `article` WHERE `id` < 684229 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002097s ]
  14. SELECT * FROM `article` WHERE `id` < 684229 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.009921s ]
  15. SELECT * FROM `article` WHERE `id` < 684229 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.006950s ]
0.155785s