当前位置:首页>Linux>Linux设备IO端口与IO内存访问实战指南

Linux设备IO端口与IO内存访问实战指南

  • 2026-03-15 04:31:39
Linux设备IO端口与IO内存访问实战指南

在Linux设备驱动开发中,IO端口与IO内存是驱动程序与硬件设备交互的核心入口。无论是传统的字符设备、块设备,还是当下热门的物联网外设、显示设备,都离不开对这两种IO资源的精准操作。Linux 6.6内核在保留传统接口兼容性的同时,对IO访问机制进行了性能优化和安全性增强,尤其在资源管理、缓存一致性、用户空间映射等方面做出了诸多改进。本文将基于Linux 6.6内核,结合实操案例,详细拆解IO端口与IO内存的访问原理、核心API、实操流程及避坑要点,助力开发者快速掌握驱动开发中的IO操作精髓。

一、核心概念:IO端口与IO内存的本质区别

设备通常会提供控制寄存器、数据寄存器、状态寄存器三类核心寄存器,用于实现设备控制、数据读写和状态获取。根据这些寄存器所处的地址空间不同,分为IO端口和IO内存两种形态,这也是Linux内核区分管理的核心依据:

  • IO端口:寄存器位于CPU的IO地址空间(独立于内存地址空间),采用专门的IO指令进行访问,适用于传统低速外设(如串口、并行口),Linux内核通过专门的IO端口操作API隔离访问细节,避免直接操作硬件地址带来的风险。

  • IO内存:寄存器位于系统内存地址空间,本质是一段被硬件占用的内存区域,适用于高速外设(如I2C、SPI、USB控制器、显存等)。访问前需将物理地址映射到内核虚拟地址,通过内存访问指令间接操作硬件寄存器,效率更高,是当前驱动开发的主流方式。

补充说明:Linux 6.6内核对两种IO资源的管理逻辑未发生根本性变化,但强化了资源申请的合法性校验,同时优化了devm_*系列托管接口的性能,减少资源泄漏风险,这也是本文重点讲解的实操优化点。

二、Linux 6.6 IO端口访问:接口、流程与实操

Linux内核禁止驱动程序直接使用CPU的IO指令(如x86的in/out指令),而是提供了标准化的API封装,确保跨平台兼容性和系统稳定性。Linux 6.6完全兼容传统IO端口操作接口,同时完善了错误处理机制,下面从接口解析、资源申请、实操案例三个维度展开。

2.1 核心访问接口(Linux 6.6兼容版)

IO端口的访问按数据宽度分为8位、16位、32位,同时支持批量读写,核心API如下(均定义在<asm/io.h>头文件中):

数据宽度
读操作API
写操作API
说明
8位(字节)
unsigned inb(unsigned port);
void outb(unsigned char byte, unsigned port);
单次读写1字节,适用于8位寄存器
16位(字)
unsigned inw(unsigned port);
void outw(unsigned short word, unsigned port);
单次读写2字节,适用于16位寄存器
32位(长字)
unsigned inl(unsigned port);
void outl(unsigned long word, unsigned port);
单次读写4字节,适用于32位寄存器
批量字节
void insb(unsigned port, void *addr, unsigned long count);
void outsb(unsigned port, void *addr, unsigned long count);
从port开始,批量读写count个字节到addr指向的内存
批量字/长字
insw() / insl()
outsw() / outsl()
用法同insb/outsb,对应16位/32位批量读写

注意:Linux 6.6中,port参数的类型仍依赖具体硬件平台(如x86为unsigned short,ARM为unsigned int),内核统一声明为unsigned,驱动开发中需根据硬件手册确认端口号范围,避免越界访问。

2.2 资源申请与释放(Linux 6.6优化点)

Linux内核中,IO端口是系统共享资源,驱动程序在访问前必须向内核申请,使用完成后释放,否则会导致资源冲突。Linux 6.6推荐使用devm_*系列托管接口,基于RAII思想将资源生命周期与设备对象绑定,无需手动释放,大幅降低资源泄漏风险。

1. 传统接口(兼容保留)

// 申请IO端口:从first开始,申请n个端口,name为设备名称struct resource *request_region(unsignedlong first, unsignedlong n, constchar *name);// 释放IO端口:释放从start开始的n个端口voidrelease_region(unsignedlong start, unsignedlong n);

返回值说明:request_region()申请成功返回非NULL指针,失败返回NULL(需在驱动中添加失败处理,避免后续访问崩溃)。

2. Linux 6.6推荐接口(devm_托管版)

// 托管式申请IO端口,无需手动释放struct resource *devm_request_region(struct device *dev, unsignedlong first, unsignedlong n, constchar *name);

优势:当设备被移除、驱动卸载或probe失败时,内核会自动遍历设备的devres链表,调用释放函数归还IO端口资源,无需在remove()函数中手动调用release_region(),简化驱动代码,提升稳定性。

2.3 实操案例:Linux 6.6 IO端口读写(串口为例)

以串口设备的IO端口访问为例,演示Linux 6.6驱动中IO端口的完整操作流程,包含资源申请、端口读写、资源释放(采用devm_托管接口):

#include<linux/module.h>#include<linux/platform_device.h>#include<asm/io.h>// 假设串口IO端口起始地址为0x3F8,共8个端口#define UART_PORT_START 0x3F8#define UART_PORT_NUM 8staticintuart_port_probe(struct platform_device *pdev){structresource *res;unsignedchar data;// 1. 申请IO端口(托管式,无需手动释放)    res = devm_request_region(&pdev->dev, UART_PORT_START, UART_PORT_NUM, "uart_port");if (!res) {        dev_err(&pdev->dev, "IO端口申请失败\n");return -EBUSY;    }// 2. 读写IO端口(以读取串口状态寄存器、写入数据寄存器为例)// 读取状态寄存器(0x3F8+5为串口状态寄存器)    data = inb(UART_PORT_START + 5);    dev_info(&pdev->dev, "串口状态:0x%x\n", data);// 写入数据寄存器(0x3F8为数据寄存器)    outb('A', UART_PORT_START);    dev_info(&pdev->dev, "向串口写入字符:A\n");return0;}staticintuart_port_remove(struct platform_device *pdev){// 无需手动释放IO端口,devm机制自动处理    dev_info(&pdev->dev, "驱动卸载,IO端口自动释放\n");return0;}staticstructplatform_driveruart_port_driver = {    .probe = uart_port_probe,    .remove = uart_port_remove,    .driver = {        .name = "uart_port_driver",        .owner = THIS_MODULE,    },};module_platform_driver(uart_port_driver);MODULE_LICENSE("GPL");MODULE_DESCRIPTION("Linux 6.6 IO端口访问示例");MODULE_AUTHOR("Driver Developer");

三、Linux 6.6 IO内存访问:映射、操作与缓存优化

IO内存是当前高速外设的主流访问方式,与IO端口不同,IO内存位于系统内存地址空间,访问前必须将物理地址映射到内核虚拟地址(避免直接操作物理地址带来的安全风险和地址冲突)。Linux 6.6在IO内存映射、读写接口、缓存一致性等方面进行了优化,尤其提升了高并发场景下的访问效率。

3.1 核心流程:物理地址→虚拟地址映射

IO内存访问的核心是“物理地址映射→虚拟地址操作→映射释放”,Linux 6.6提供了完整的API封装,其中devm_ioremap()是推荐使用的托管接口,无需手动调用iounmap()释放映射。

1. 映射接口(Linux 6.6重点优化)

// 传统映射接口:需手动调用iounmap()释放void *ioremap(unsignedlong offset, unsignedlong size);voidiounmap(void *addr);// Linux 6.6推荐:托管式映射接口,自动释放void __iomem *devm_ioremap(struct device *dev, resource_size_t offset,unsignedlong size);// 扩展接口:直接获取并映射IO内存资源(Linux 6.6新增优化)void __iomem *devm_platform_ioremap_resource(struct platform_device *pdev, unsignedint index);

参数说明:

  • offset:IO内存的物理起始地址(需从硬件手册获取);

  • size:IO内存的大小(字节数);

  • dev:设备指针,用于绑定资源生命周期;

  • 返回值:成功返回映射后的虚拟地址(__iomem修饰,表明是IO内存虚拟地址),失败返回NULL。

Linux 6.6优化点:devm_platform_ioremap_resource()可直接从platform_device的资源列表中获取IO内存资源并完成映射,无需手动解析resource结构体,简化代码开发,同时增加了资源合法性校验,避免映射非法地址。

2. 虚拟地址读写接口

映射获得虚拟地址后,Linux内核禁止直接通过指针读写(可能导致缓存不一致、地址越界等问题),推荐使用标准化的读写API,分为带内存屏障和不带内存屏障(_relaxed后缀)两种,适配不同场景:

操作类型
带内存屏障(推荐)
不带内存屏障(_relaxed)
适用场景
8位读
readb(void __iomem *addr);
readb_relaxed(void __iomem *addr);
读取8位IO内存寄存器
16位读
readw(void __iomem *addr);
readw_relaxed(void __iomem *addr);
读取16位IO内存寄存器
32位读
readl(void __iomem *addr);
readl_relaxed(void __iomem *addr);
读取32位IO内存寄存器
8位写
writeb(u8 value, void __iomem *addr);
writeb_relaxed(u8 value, void __iomem *addr);
写入8位IO内存寄存器
16位/32位写
writew() / writel()
writew_relaxed() / writel_relaxed()
对应16位/32位寄存器写入

关键说明:带内存屏障的接口(如readb、writeb)会插入内存屏障指令(__iormb()、__iowmb()),确保IO操作的顺序性,避免CPU指令重排导致的IO操作异常,适用于对时序要求严格的场景(如SPI、I2C控制器);不带内存屏障的接口效率更高,适用于时序要求不严格的场景(如显存读写)。Linux 6.6中,这两组接口均保持兼容,且优化了内存屏障的执行效率,减少性能损耗。

3.2 资源申请与释放

与IO端口类似,IO内存也需要先向内核申请资源(表明驱动要访问该区域),再进行映射操作。Linux 6.6同样推荐使用devm_托管接口,简化资源管理。

// 传统接口:申请IO内存资源struct resource *request_mem_region(unsignedlong start, unsignedlong len, constchar *name);// 释放IO内存资源voidrelease_mem_region(unsignedlong start, unsignedlong len);// Linux 6.6推荐:托管式申请接口struct resource *devm_request_mem_region(struct device *dev, unsignedlong start,unsignedlong len, constchar *name);

注意:request_mem_region()仅用于申请资源(类似“占位”),不会进行地址映射;映射操作需通过ioremap()或devm_ioremap()完成。Linux 6.6中,若未申请资源直接映射IO内存,内核会打印警告信息,部分场景下会拒绝映射,提升系统安全性。

3.3 实操案例:Linux 6.6 IO内存读写(SPI控制器为例)

以SPI控制器的IO内存访问为例,演示Linux 6.6中IO内存的完整操作流程,包含资源申请、地址映射、寄存器读写、资源自动释放:

#include<linux/module.h>#include<linux/platform_device.h>#include<asm/io.h>// 假设SPI控制器IO内存物理地址:0x10000000,大小:0x100#define SPI_PHYS_ADDR 0x10000000#define SPI_MEM_SIZE 0x100// 寄存器偏移量(示例)#define SPI_CTRL_REG 0x00  // 控制寄存器#define SPI_DATA_REG 0x04  // 数据寄存器staticvoid __iomem *spi_base;  // 映射后的虚拟地址staticintspi_mem_probe(struct platform_device *pdev){structresource *res;    u32 ctrl_val;    u8 data_val;// 1. 申请IO内存资源(托管式)    res = devm_request_mem_region(&pdev->dev, SPI_PHYS_ADDR, SPI_MEM_SIZE, "spi_mem");if (!res) {        dev_err(&pdev->dev, "IO内存资源申请失败\n");return -EBUSY;    }// 2. 映射IO内存物理地址到虚拟地址(托管式,自动释放)    spi_base = devm_ioremap(&pdev->dev, SPI_PHYS_ADDR, SPI_MEM_SIZE);if (!spi_base) {        dev_err(&pdev->dev, "IO内存映射失败\n");return -ENOMEM;    }// 3. 读写IO内存寄存器(带内存屏障,保证时序)// 读取控制寄存器    ctrl_val = readl(spi_base + SPI_CTRL_REG);    dev_info(&pdev->dev, "SPI控制寄存器初始值:0x%x\n", ctrl_val);// 修改控制寄存器(使能SPI控制器)    ctrl_val |= 0x01;  // 假设bit0为使能位    writel(ctrl_val, spi_base + SPI_CTRL_REG);    dev_info(&pdev->dev, "SPI控制器已使能\n");// 写入数据寄存器    data_val = 0x55;    writeb(data_val, spi_base + SPI_DATA_REG);    dev_info(&pdev->dev, "向SPI写入数据:0x%x\n", data_val);// 读取数据寄存器(验证写入)    data_val = readb(spi_base + SPI_DATA_REG);    dev_info(&pdev->dev, "从SPI读取数据:0x%x\n", data_val);return0;}staticintspi_mem_remove(struct platform_device *pdev){// 无需手动释放IO内存资源和映射,devm机制自动处理    dev_info(&pdev->dev, "驱动卸载,IO内存资源自动释放\n");return0;}staticstructplatform_driverspi_mem_driver = {    .probe = spi_mem_probe,    .remove = spi_mem_remove,    .driver = {        .name = "spi_mem_driver",        .owner = THIS_MODULE,    },};module_platform_driver(spi_mem_driver);MODULE_LICENSE("GPL");MODULE_DESCRIPTION("Linux 6.6 IO内存访问示例");MODULE_AUTHOR("Driver Developer");

四、进阶:Linux 6.6 设备地址映射到用户空间(mmap实操)

默认情况下,用户空间无法直接访问设备的IO端口或IO内存,需通过系统调用(如read/write)与内核交互,存在内存拷贝开销。对于显示设备、视频采集设备等对性能要求极高的场景,Linux 6.6支持通过mmap()函数将设备地址映射到用户空间,实现用户空间直接访问设备,消除内存拷贝,提升效率。

4.1 mmap核心原理与Linux 6.6优化

mmap()的核心是将用户空间的一段虚拟内存与设备的物理地址(IO内存)建立关联,用户访问这段虚拟内存时,内核会自动将访问转化为对设备的IO操作。Linux 6.6中,mmap()机制的优化点主要有:

  • 优化VMA(虚拟内存区域)的分配与管理,提升映射效率;

  • 完善pgprot_noncached()、pgprot_writecombine()宏的跨平台兼容性,优化IO内存映射的缓存设置;

  • 增强vm_iomap_memory()接口的稳定性,简化驱动中mmap()的实现代码。

关键注意点:mmap()必须以PAGE_SIZE(通常为4KB)为单位进行映射,非整数倍地址范围需先进行页对齐;IO内存映射时,通常需要设置为nocache模式,避免缓存导致的数据不一致问题(尤其适用于DMA传输场景)。

4.2 驱动中mmap()实现实操(LCD显存映射为例)

以LCD设备的显存(IO内存)映射到用户空间为例,演示Linux 6.6中mmap()的实现流程,包含VMA操作、页表建立、缓存设置:

#include<linux/module.h>#include<linux/fs.h>#include<linux/platform_device.h>#include<asm/io.h>#include<linux/mm.h>#define LCD_DEV_NAME "lcd_mem"#define LCD_PHYS_ADDR 0x20000000  // 显存物理地址#define LCD_MEM_SIZE 0x800000    // 显存大小(8MB)#define PAGE_SIZE 4096staticvoid __iomem *lcd_base;staticint lcd_major;// VMA操作结构体(定义mmap后的打开、关闭操作)staticvoidlcd_vma_open(struct vm_area_struct *vma){    dev_info(NULL"LCD VMA打开,虚拟地址范围:0x%lx - 0x%lx\n",             vma->vm_start, vma->vm_end);}staticvoidlcd_vma_close(struct vm_area_struct *vma){    dev_info(NULL"LCD VMA关闭\n");}staticstructvm_operations_structlcd_vm_ops = {    .open = lcd_vma_open,    .close = lcd_vma_close,};// 驱动mmap函数实现staticintlcd_mmap(struct file *filp, struct vm_area_struct *vma){unsignedlong pfn;unsignedlong size = vma->vm_end - vma->vm_start;// 1. 校验映射大小(不超过显存大小)if (size > LCD_MEM_SIZE) {        dev_err(NULL"映射大小超出显存范围\n");return -EINVAL;    }// 2. 设置显存映射为nocache模式(避免缓存不一致)    vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);// 3. 计算物理地址的页帧号(物理地址右移PAGE_SHIFT位)    pfn = LCD_PHYS_ADDR >> PAGE_SHIFT;// 4. 建立页表,完成映射(Linux 6.6推荐使用remap_pfn_range)if (remap_pfn_range(vma, vma->vm_start, pfn, size, vma->vm_page_prot)) {        dev_err(NULL"页表建立失败\n");return -EAGAIN;    }// 5. 绑定VMA操作结构体    vma->vm_ops = &lcd_vm_ops;return0;}// 文件操作结构体staticconststructfile_operationslcd_fops = {    .owner = THIS_MODULE,    .mmap = lcd_mmap,};staticintlcd_mmap_probe(struct platform_device *pdev){structresource *res;// 申请IO内存资源并映射    res = devm_request_mem_region(&pdev->dev, LCD_PHYS_ADDR, LCD_MEM_SIZE, LCD_DEV_NAME);if (!res) {        dev_err(&pdev->dev, "IO内存资源申请失败\n");return -EBUSY;    }    lcd_base = devm_ioremap(&pdev->dev, LCD_PHYS_ADDR, LCD_MEM_SIZE);if (!lcd_base) {        dev_err(&pdev->dev, "IO内存映射失败\n");return -ENOMEM;    }// 注册字符设备    lcd_major = register_chrdev(0, LCD_DEV_NAME, &lcd_fops);if (lcd_major < 0) {        dev_err(&pdev->dev, "字符设备注册失败\n");return lcd_major;    }    dev_info(&pdev->dev, "LCD驱动注册成功,主设备号:%d\n", lcd_major);return0;}staticintlcd_mmap_remove(struct platform_device *pdev){    unregister_chrdev(lcd_major, LCD_DEV_NAME);    dev_info(&pdev->dev, "LCD驱动卸载成功\n");return0;}staticstructplatform_driverlcd_mmap_driver = {    .probe = lcd_mmap_probe,    .remove = lcd_mmap_remove,    .driver = {        .name = "lcd_mmap_driver",        .owner = THIS_MODULE,    },};module_platform_driver(lcd_mmap_driver);MODULE_LICENSE("GPL");MODULE_DESCRIPTION("Linux 6.6 设备地址映射到用户空间示例");MODULE_AUTHOR("Driver Developer");

用户空间测试代码(简化版):通过mmap()映射LCD显存,直接写入数据修改屏幕显示:

#include<stdio.h>#include<fcntl.h>#include<sys/mman.h>#include<unistd.h>#define LCD_DEV "/dev/lcd_mem"#define LCD_MEM_SIZE 0x800000intmain(){int fd;char *buf;// 打开设备文件    fd = open(LCD_DEV, O_RDWR);if (fd < 0) {        perror("打开设备失败");return-1;    }// 映射设备地址到用户空间    buf = mmap(NULL, LCD_MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (buf == MAP_FAILED) {        perror("mmap映射失败");        close(fd);return-1;    }// 直接操作用户空间地址(修改显存,实现屏幕点亮)    buf[0] = 0xFF;  // 假设第一个像素点设为白色    buf[1] = 0xFF;    buf[2] = 0xFF;// 解除映射    munmap(buf, LCD_MEM_SIZE);    close(fd);return0;}

五、Linux 6.6 IO访问避坑要点与最佳实践

结合Linux 6.6内核特性和实际开发经验,总结以下IO端口与IO内存访问的避坑要点,帮助开发者减少调试成本,提升驱动稳定性:

  1. 优先使用devm_*托管接口:无论是IO端口/内存的资源申请,还是地址映射,优先使用devm_request_region()、devm_ioremap()等托管接口,避免手动释放资源导致的泄漏,尤其适合复杂驱动场景。

  2. 严格校验API返回值:所有IO操作相关API(request_region()、ioremap()、remap_pfn_range()等)的返回值必须进行校验,避免NULL指针解引用、非法地址访问等崩溃问题。

  3. 区分内存屏障接口的使用场景:对时序要求严格的外设(如SPI、I2C),使用带内存屏障的读写接口(readb、writeb);对效率要求高、时序宽松的场景(如显存),使用_relaxed后缀接口。

  4. IO内存映射必设缓存属性:映射IO内存时,根据场景设置nocache(pgprot_noncached())或writecombine(pgprot_writecombine())模式,避免缓存导致的数据不一致,尤其在DMA传输场景中需特别注意缓存一致性问题。

  5. 避免跳过资源申请步骤:即使是独占设备,也需通过request_mem_region()/devm_request_mem_region()申请IO内存资源,否则Linux 6.6内核会打印警告,甚至拒绝映射,影响驱动兼容性。

  6. mmap映射注意页对齐:mmap()映射的地址范围必须是PAGE_SIZE的整数倍,非对齐地址需先进行页对齐处理,否则会导致映射失败或地址越界。

六、总结

IO端口与IO内存访问是Linux设备驱动开发的核心基础,Linux 6.6内核在保留传统接口兼容性的同时,通过托管式资源管理、缓存优化、VMA管理优化等,大幅提升了IO操作的稳定性和效率。本文详细讲解了IO端口与IO内存的概念、核心API、实操流程,并通过具体案例演示了Linux 6.6下的最佳实践,同时总结了常见避坑要点。

对于驱动开发者而言,掌握IO访问的核心逻辑,熟练运用devm_*托管接口、内存屏障接口、mmap映射机制,不仅能提升驱动开发效率,还能避免常见的资源泄漏、数据不一致等问题。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 19:10:53 HTTP/2.0 GET : https://f.mffb.com.cn/a/480096.html
  2. 运行时间 : 0.193284s [ 吞吐率:5.17req/s ] 内存消耗:4,738.11kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=d90a4c47b1003575cf23eec2e5dfe74a
  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.000383s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000700s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000266s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000262s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000477s ]
  6. SELECT * FROM `set` [ RunTime:0.000221s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000600s ]
  8. SELECT * FROM `article` WHERE `id` = 480096 LIMIT 1 [ RunTime:0.003762s ]
  9. UPDATE `article` SET `lasttime` = 1774609853 WHERE `id` = 480096 [ RunTime:0.010436s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000270s ]
  11. SELECT * FROM `article` WHERE `id` < 480096 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000459s ]
  12. SELECT * FROM `article` WHERE `id` > 480096 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000962s ]
  13. SELECT * FROM `article` WHERE `id` < 480096 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.022580s ]
  14. SELECT * FROM `article` WHERE `id` < 480096 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.020181s ]
  15. SELECT * FROM `article` WHERE `id` < 480096 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.019960s ]
0.194977s