当前位置:首页>Linux>Linux 6.6内核字符设备驱动全解析

Linux 6.6内核字符设备驱动全解析

  • 2026-02-09 08:57:57
Linux 6.6内核字符设备驱动全解析

字符设备驱动是Linux内核驱动开发的基础与核心,贯穿嵌入式、物联网、服务器等各类场景,从简单的LED灯控制到复杂的串口通信,都离不开字符设备驱动的支撑。Linux 6.6内核作为2023年发布的重大更新版本,在字符设备驱动领域虽未进行颠覆性重构,但在安全性、兼容性和性能上做了诸多优化,同时完善了对新架构(如LoongArch)的支持。本文将结合附件中的经典驱动结构,搭配Linux 6.6内核最新特性,从零到一梳理字符设备驱动的核心知识点,助力开发者快速适配新版本内核开发。

一、核心基础:字符设备驱动的核心结构体

无论Linux内核如何迭代,字符设备驱动的核心骨架始终围绕3个核心结构体展开:cdev结构体(描述字符设备)、dev_t结构体(设备号管理)、file_operations结构体(用户空间与内核空间接口)。Linux 6.6内核中,这三个结构体的核心定义未发生本质变化,但部分细节优化需重点关注。三者构成字符设备驱动的基础框架,具体关联如下:

graph LR    A[字符设备驱动整体框架] --> B[cdev结构体- 描述字符设备核心信息- 关联file_operations与dev_t]    A --> C[dev_t结构体- 设备号管理(主+次设备号)- 唯一标识字符设备]    A --> D[file_operations结构体- 用户/内核交互接口- 实现read/write/ioctl等核心操作]    B --> E[核心操作函数cdev_init/cdev_add/cdev_del等Linux 6.6优化安全性与效率]    C --> F[设备号操作MAJOR/MINOR/MKDEV宏分配:静态+动态(Linux 6.6优化)]    D --> G[核心接口函数read/write/unlocked_ioctl等Linux 6.6新增异步I/O接口]    B --> H[内核设备模型内嵌kobject对象参与内核统一管理]    D --> I[用户态-内核态交互copy_from_user/copy_to_userLinux 6.6新增安全校验]

上图清晰展示了三个核心结构体的关联关系及各自核心功能,后续将逐一拆解每个结构体的定义、操作方法及Linux 6.6内核的优化点。

1.1 cdev结构体:字符设备的“身份凭证”

cdev结构体是Linux内核描述字符设备的核心载体,用于封装设备的所有关键信息,其定义在Linux 6.6内核中与经典版本保持一致,但内核对其操作函数做了安全性增强。

经典定义:

structcdev {structkobjectkobj;/* 内嵌的kobject对象,用于内核设备模型管理 */structmodule *owner;/* 所属模块,防止模块被意外卸载 */structfile_operations *ops;/* 文件操作结构体,关联驱动核心接口 */structlist_headlist;/* 用于将多个cdev结构体链接起来 */dev_t dev;                       /* 设备号,唯一标识字符设备 */unsignedint count;              /* 设备数量,支持多个次设备号 */};

Linux 6.6内核关键优化点:

  • cdev_alloc()函数优化:在Linux 6.6中,cdev_alloc()内部调用的kzalloc()函数增加了对GFP_KERNEL标志的安全校验,避免内存分配异常导致的内核崩溃,同时优化了内存分配效率,适配大并发场景下的设备注册需求。

  • cdev_del()函数兼容性提升:新增对未完全初始化cdev结构体的判断,防止误调用cdev_del()导致的内核Oops,尤其适配了模块化驱动快速卸载的场景,减少驱动调试过程中的异常问题。

核心操作函数:

内核提供一套标准API用于操作cdev结构体,开发者无需手动修改结构体成员,直接调用即可完成设备的初始化、注册与注销:

  • cdev_init():初始化cdev结构体,建立cdev与file_operations的关联,核心是将文件操作结构体指针赋值给cdev->ops。

  • cdev_alloc():动态申请cdev内存,自动初始化内嵌的kobject和list成员,无需手动调用memset()。

  • cdev_add():向系统注册字符设备,将cdev结构体添加到内核管理链表,需在模块加载函数中调用。

  • cdev_del():从系统注销字符设备,释放cdev占用的内核资源,需在模块卸载函数中调用。

  • cdev_put():释放cdev结构体占用的内存,与cdev_alloc()配套使用,避免内存泄漏。

1.2 dev_t结构体:设备号的“分配与管理”

设备号是字符设备的唯一标识,Linux内核中使用dev_t(32位)表示,其中12位为主设备号(标识设备类型),20位为次设备号(标识同一类型下的多个设备),这一规则在Linux 6.6中完全延续。

设备号操作宏:

  • MAJOR(dev_t dev):从dev_t中提取主设备号。

  • MINOR(dev_t dev):从dev_t中提取次设备号。

  • MKDEV(int major, int minor):通过主设备号和次设备号生成dev_t。

Linux 6.6内核设备号分配优化:

设备号的分配分为静态分配(已知设备号)和动态分配(未知设备号)两种方式,Linux 6.6对动态分配函数alloc_chrdev_region()做了重点优化,同时完善了设备号冲突检测机制:

  • 静态分配:register_chrdev_region(),适用于已知起始设备号的场景,Linux 6.6中新增了设备号合法性校验,若申请的设备号已被占用,会返回更详细的错误信息(如“Device number already in use by xxx”),便于调试。

  • 动态分配:alloc_chrdev_region(),适用于未知设备号的场景,Linux 6.6中优化了设备号分配算法,能更快地检索未被占用的设备号,同时支持批量分配多个设备号,提升驱动开发效率。此外,该函数新增了对设备名长度的限制(最大64字符),避免非法设备名导致的内核异常。

  • 设备号释放:unregister_chrdev_region(),与分配函数配套使用,Linux 6.6中优化了资源释放逻辑,即使驱动异常卸载,也能确保设备号被正确释放,避免设备号泄漏。

注意点(Linux 6.6新增):

在嵌入式场景中,若使用杂项设备驱动(字符设备的特殊形式),Linux 6.6延续了杂项设备主设备号固定为10的规则,无需手动分配主设备号,进一步简化了小型设备的驱动开发流程。

1.3 file_operations结构体:用户与内核的“交互接口”

file_operations结构体是字符设备驱动的核心,定义了用户空间调用open()、read()、write()等系统调用时,内核对应的执行函数,是用户空间与内核空间交互的桥梁。Linux 6.6内核中,file_operations结构体新增了部分成员,同时优化了部分原有成员的性能。

Linux 6.6中file_operations结构体核心变化:

structfile_operations {structmodule *owner;/* 所属模块,必须设置为THIS_MODULE */loff_t (*llseek) (struct file *, loff_tint); /* 优化:支持更大的文件偏移量 */ssize_t (*read) (struct file *, char __user *, size_tloff_t *); /* 兼容原有逻辑 */ssize_t (*write) (struct file *, constchar __user *, size_tloff_t *); /* 兼容原有逻辑 */// 新增:适配异步I/O优化,提升高并发场景下的读写性能ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);// 原有成员优化:提升迭代效率,适配大目录场景int (*iterate) (struct file *, struct dir_context *);int (*iterate_shared) (struct file *, struct dir_context *);// 安全优化:新增对ioctl命令的合法性校验钩子long (*unlocked_ioctl) (struct file *, unsignedintunsignedlong);long (*compat_ioctl) (struct file *, unsignedintunsignedlong);// 其他成员保持兼容,新增部分小众成员(适配特殊设备)  ...} __randomize_layout; /* 内核地址空间布局随机化,提升安全性 */

核心成员解析:

  • owner:必须设置为THIS_MODULE,用于内核管理模块引用计数,防止模块在被使用时被卸载,Linux 6.6中强化了引用计数的校验,避免引用计数异常导致的内核崩溃。

  • read/write:用户空间与内核空间的数据读写接口,Linux 6.6中优化了数据传输效率,尤其在小批量数据读写场景下,减少了内核态与用户态的切换开销。需注意,用户空间地址不能直接在内核空间访问,必须使用copy_from_user()/copy_to_user()函数进行数据拷贝。

  • unlocked_ioctl:提供设备控制命令的实现(非读写操作),Linux 6.6中新增了对ioctl命令的合法性校验,若传入非法命令,会直接返回-EINVAL,提升驱动安全性。

  • read_iter/write_iter:新增的异步I/O接口,适配高并发场景,Linux 6.6中优化了这两个函数的执行逻辑,支持批量数据传输,比传统的read/write函数更高效,适合大文件、高吞吐设备(如串口、传感器)。

  • __randomize_layout:内核地址空间布局随机化,Linux 6.6中默认开启,用于防止缓冲区溢出攻击,提升驱动的安全性,开发者无需手动修改,直接继承即可。

补充:用户态与内核态数据拷贝

Linux 6.6中,copy_from_user()、copy_to_user()函数新增了更严格的安全性校验,内部会自动调用access_ok()函数检查用户空间缓冲区的合法性,避免非法指针导致的内核漏洞。同时,简化了简单类型数据的拷贝方式,使用put_user()/get_user()函数时,无需手动调用access_ok(),内核会自动完成校验,提升开发效率。

二、实战核心:Linux 6.6字符设备驱动的组成与开发模板

字符设备驱动的核心组成的是“模块加载/卸载函数”+“file_operations接口实现”,Linux 6.6内核中,开发流程与经典版本基本一致,但需适配内核的最新优化点,以下是结合Linux 6.6特性的实战模板。

2.1 模块加载与卸载函数(核心入口/出口)

模块加载函数(xxx_init)的核心功能是申请设备号、初始化cdev结构体、注册字符设备;模块卸载函数(xxx_exit)的核心功能是注销字符设备、释放设备号、释放内核资源。Linux 6.6中,模块生命周期管理进一步完善,新增了模块版本兼容校验(MODULE_VERSION),确保驱动与内核版本匹配。

Linux 6.6驱动模板(模块加载/卸载):

#include<linux/module.h>#include<linux/cdev.h>#include<linux/fs.h>#include<linux/uaccess.h>// 设备结构体:封装cdev、设备号、私有数据(Linux内核编码规范)structxxx_dev_t {structcdevcdev;/* 内嵌cdev结构体 */dev_t dev_no;             /* 设备号 */int private_data;         /* 私有数据,用于存储设备状态等信息 */} xxx_dev;#define DEV_NAME "xxx_char_dev"/* 设备名,Linux 6.6限制最大64字符 */#define DEV_COUNT 1              /* 设备数量 */// 模块加载函数(入口)staticint __init xxx_init(void){int ret;// 1. 分配设备号(动态分配,推荐使用)  ret = alloc_chrdev_region(&xxx_dev.dev_no, 0, DEV_COUNT, DEV_NAME);if (ret < 0) {    printk(KERN_ERR "alloc_chrdev_region failed: %d\n", ret);return ret;  }// 2. 初始化cdev结构体  cdev_init(&xxx_dev.cdev, &xxx_fops);  xxx_dev.cdev.owner = THIS_MODULE;  /* 绑定所属模块 */// 3. 注册字符设备到内核  ret = cdev_add(&xxx_dev.cdev, xxx_dev.dev_no, DEV_COUNT);if (ret < 0) {    printk(KERN_ERR "cdev_add failed: %d\n", ret);    unregister_chrdev_region(xxx_dev.dev_no, DEV_COUNT);  /* 失败回滚,释放设备号 */return ret;  }  printk(KERN_INFO "xxx_char_dev init success\n");return0;}// 模块卸载函数(出口)staticvoid __exit xxx_exit(void){// 1. 注销字符设备  cdev_del(&xxx_dev.cdev);// 2. 释放设备号  unregister_chrdev_region(xxx_dev.dev_no, DEV_COUNT);  printk(KERN_INFO "xxx_char_dev exit success\n");}// 注册模块入口/出口函数,Linux 6.6兼容module_init(xxx_init);module_exit(xxx_exit);// 模块信息(Linux 6.6新增版本校验,可选)MODULE_VERSION("1.0.0");MODULE_LICENSE("GPL");  /* 必须声明GPL协议,否则内核会报警告 */MODULE_AUTHOR("Developer");MODULE_DESCRIPTION("Linux 6.6 Character Device Driver Template");

Linux 6.6重点注意点:

  • 失败回滚:模块加载过程中,若某一步骤失败(如cdev_add失败),必须回滚之前的操作(如释放设备号),避免内核资源泄漏,Linux 6.6中对资源泄漏的检测更严格,未回滚会触发内核警告。

  • 模块版本:MODULE_VERSION宏用于声明驱动版本,Linux 6.6中modprobe工具会自动校验驱动与内核版本的兼容性,避免版本不兼容导致的驱动加载失败。

  • 打印信息:使用printk()函数打印调试信息时,推荐使用KERN_ERR、KERN_INFO等日志级别,Linux 6.6中优化了日志输出机制,便于开发者定位问题。

2.2 file_operations接口实现(核心功能)

file_operations接口是驱动与用户空间交互的核心,大多数字符设备驱动只需实现read()、write()、unlocked_ioctl()、open()、release()这5个核心函数,Linux 6.6中,这些函数的实现逻辑与经典版本兼容,但需适配新增的安全校验和性能优化。

Linux 6.6实战模板(file_operations接口):

// 打开设备函数staticintxxx_open(struct inode *inode, struct file *filp){// 将设备结构体指针赋值给filp->private_data,便于后续函数访问  filp->private_data = &xxx_dev;  printk(KERN_INFO "xxx_char_dev opened\n");return0;  /* 无需额外操作,直接返回0表示成功 */}// 关闭设备函数staticintxxx_release(struct inode *inode, struct file *filp){  printk(KERN_INFO "xxx_char_dev closed\n");return0;}// 读设备函数(用户空间从内核空间读取数据)staticssize_txxx_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos){structxxx_dev_t *dev = filp->private_data;char kernel_buf[32] = "hello from kernel";  /* 内核空间数据 */size_t data_len = strlen(kernel_buf);int ret;// 校验读取长度(避免越界)if (count > data_len - *f_pos) {    count = data_len - *f_pos;  }// 内核空间数据拷贝到用户空间(Linux 6.6自动校验用户空间地址合法性)  ret = copy_to_user(buf, kernel_buf + *f_pos, count);if (ret != 0) {    printk(KERN_ERR "copy_to_user failed: %d\n", ret);return -EFAULT;  /* 拷贝失败,返回错误码 */  }// 更新读写偏移量  *f_pos += count;return count;  /* 返回实际读取的字节数 */}// 写设备函数(用户空间向内核空间写入数据)staticssize_txxx_write(struct file *filp, constchar __user *buf, size_t count, loff_t *f_pos){structxxx_dev_t *dev = filp->private_data;char kernel_buf[32];int ret;// 校验写入长度(避免缓冲区溢出)if (count > sizeof(kernel_buf)) {return -EINVAL;  /* 长度非法,返回错误码 */  }// 用户空间数据拷贝到内核空间  ret = copy_from_user(kernel_buf, buf, count);if (ret != 0) {    printk(KERN_ERR "copy_from_user failed: %d\n", ret);return -EFAULT;  }// 处理写入的数据(示例:打印用户写入的数据)  printk(KERN_INFO "received data from user: %.*s\n", (int)count, kernel_buf);// 更新读写偏移量  *f_pos += count;return count;  /* 返回实际写入的字节数 */}// 设备控制函数(实现自定义控制命令)staticlongxxx_unlocked_ioctl(struct file *filp, unsignedint cmd, unsignedlong arg){structxxx_dev_t *dev = filp->private_data;// 校验cmd命令(Linux 6.6新增推荐做法,提升安全性)switch (cmd) {case CMD_SET_DATA:  /* 自定义命令:设置私有数据 */if (arg < 0 || arg > 100) {return -EINVAL;  /* 参数非法 */      }      dev->private_data = arg;      printk(KERN_INFO "set private_data: %d\n", dev->private_data);break;case CMD_GET_DATA:  /* 自定义命令:获取私有数据 */if (copy_to_user((void __user *)arg, &dev->private_data, sizeof(dev->private_data))) {return -EFAULT;      }break;default:return -ENOTTY;  /* 不支持的命令 */  }return0;  /* 成功返回0 */}// 定义file_operations结构体实例(绑定接口函数)structfile_operationsxxx_fops = {  .owner = THIS_MODULE,  .open = xxx_open,  .release = xxx_release,  .read = xxx_read,  .write = xxx_write,  .unlocked_ioctl = xxx_unlocked_ioctl,// 适配Linux 6.6异步I/O,可选实现  .read_iter = NULL,  .write_iter = NULL,};

三、Linux 6.6内核字符设备驱动关键更新汇总

结合前文讲解,此处汇总Linux 6.6内核中字符设备驱动的核心更新点,便于开发者快速适配和排查问题:

3.1 安全性优化

  • file_operations结构体默认开启__randomize_layout,实现内核地址空间布局随机化,防止缓冲区溢出攻击。

  • copy_from_user()/copy_to_user()函数新增自动地址合法性校验,避免非法指针导致的内核漏洞,同时优化了校验效率。

  • unlocked_ioctl()函数新增命令合法性校验钩子,非法命令直接返回错误,提升驱动安全性。

  • cdev_del()函数新增未初始化结构体判断,防止误调用导致的内核Oops。

3.2 性能优化

  • alloc_chrdev_region()函数优化设备号分配算法,提升批量设备号分配效率,适配高并发设备注册场景。

  • read()/write()函数优化内核态与用户态切换逻辑,提升小批量数据读写性能。

  • 新增read_iter()/write_iter()异步I/O接口,优化高并发场景下的批量数据传输效率。

  • cdev_alloc()函数优化内存分配逻辑,减少内存碎片,提升驱动运行稳定性。

3.3 兼容性与易用性优化

  • 完善对LoongArch架构的支持,KASAN、KCOV等内核工具可正常调试LoongArch平台的字符设备驱动。

  • 设备号分配/释放函数新增详细错误信息,便于开发者定位设备号冲突等问题。

  • 模块版本校验机制完善,MODULE_VERSION宏可确保驱动与内核版本匹配,避免版本不兼容问题。

  • 杂项设备驱动(字符设备特殊形式)的管理逻辑优化,进一步简化小型设备的驱动开发流程。

3.4 废弃与不推荐使用的接口

  • deprecated_ioctl()函数被正式废弃,Linux 6.6中不再支持,推荐使用unlocked_ioctl()替代。

  • register_chrdev()/unregister_chrdev()函数(旧版设备号注册/注销接口)不推荐使用,推荐使用register_chrdev_region()/alloc_chrdev_region()替代,避免设备号管理混乱。

四、实战调试:Linux 6.6驱动加载与问题排查

结合前面的模板,此处补充Linux 6.6内核中字符设备驱动的加载、卸载与调试方法,帮助开发者快速验证驱动正确性。

4.1 驱动编译(Makefile模板)

# Linux 6.6内核源码路径(根据实际情况修改)KERNELDIR ?= /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)# 驱动模块名obj-m += xxx_char_dev.o# 编译规则all:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:$(MAKE) -C $(KERNELDIR) M=$(PWD) clean

4.2 驱动加载与卸载

# 加载驱动模块(需root权限)insmod xxx_char_dev.ko# 查看驱动是否加载成功lsmod | grep xxx_char_dev# 查看设备号(主设备号、次设备号)cat /proc/devices | grep xxx_char_dev# 创建设备节点(用户空间访问驱动的入口)mknod /dev/xxx_char_dev c 主设备号 次设备号# 卸载驱动模块rmmod xxx_char_dev

4.3 常见问题排查

  • 驱动加载失败,提示“version magic 'xxx SMP preempt mod_unload ' should be 'xxx SMP preempt mod_unload modversions '”:未声明MODULE_VERSION宏,或驱动编译时使用的内核源码与系统运行内核版本不一致,需确保两者一致。

  • 设备号分配失败,提示“Device number already in use”:设备号已被其他驱动占用,推荐使用动态分配(alloc_chrdev_region()),或更换主设备号。

  • copy_to_user()/copy_from_user()返回-EFAULT:用户空间地址非法,Linux 6.6中会自动打印详细错误信息,可检查用户空间传入的缓冲区地址是否合法。

  • 驱动卸载时内核报警告:未回滚模块加载过程中的操作,需确保cdev_del()和unregister_chrdev_region()配套调用。

五、总结与展望

Linux 6.6内核中,字符设备驱动的核心架构未发生颠覆性变化,但其在安全性、性能和兼容性上的优化,进一步提升了驱动的稳定性和开发效率。对于开发者而言,无需重构现有驱动代码,只需重点适配以下几点,即可快速迁移至Linux 6.6内核:

  1. 替换废弃接口,使用unlocked_ioctl()替代deprecated_ioctl(),使用动态设备号分配接口替代旧版接口。

  2. 适配安全性优化,在ioctl命令中增加合法性校验,确保数据拷贝函数的正确使用。

  3. 新增MODULE_VERSION宏,确保驱动与内核版本匹配,避免兼容性问题。

  4. 对于高并发场景,可实现read_iter()/write_iter()异步I/O接口,提升驱动性能。

随着Linux内核的不断迭代,字符设备驱动的开发会越来越注重安全性和性能,后续内核版本可能会进一步优化异步I/O和设备管理逻辑。掌握本文讲解的基础架构和Linux 6.6最新特性,无论是传统嵌入式设备还是新架构平台的驱动开发,都能快速上手、高效排查问题。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-09 13:40:04 HTTP/2.0 GET : https://f.mffb.com.cn/a/474463.html
  2. 运行时间 : 0.104333s [ 吞吐率:9.58req/s ] 内存消耗:4,986.90kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=aecd059c7a9674b7340e7fcb1924b7c6
  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.000373s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000606s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000268s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000917s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000508s ]
  6. SELECT * FROM `set` [ RunTime:0.000208s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000746s ]
  8. SELECT * FROM `article` WHERE `id` = 474463 LIMIT 1 [ RunTime:0.000772s ]
  9. UPDATE `article` SET `lasttime` = 1770615604 WHERE `id` = 474463 [ RunTime:0.003721s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000475s ]
  11. SELECT * FROM `article` WHERE `id` < 474463 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001256s ]
  12. SELECT * FROM `article` WHERE `id` > 474463 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001564s ]
  13. SELECT * FROM `article` WHERE `id` < 474463 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.012046s ]
  14. SELECT * FROM `article` WHERE `id` < 474463 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.008699s ]
  15. SELECT * FROM `article` WHERE `id` < 474463 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.006586s ]
0.106210s