当前位置:首页>Linux>嵌入式Linux--字符设备驱动开发实验

嵌入式Linux--字符设备驱动开发实验

  • 2026-06-30 11:12:39
嵌入式Linux--字符设备驱动开发实验
chrdevbase 字符设备驱动开发实验全解析:
一、实验概述
chrdevbase 是专为教学设计的虚拟字符设备,它没有真实硬件支撑,核心目标是帮我们系统掌握 Linux 字符设备驱动的开发逻辑。这个虚拟设备内置两个 100 字节的缓冲区——读缓冲区和写缓冲区,应用程序可以通过标准文件操作(open、read、write、close)实现对缓冲区的数据读写,虽然功能极简,却完整覆盖了字符设备的核心基础能力,是入门 Linux 驱动的绝佳载体。
二、实验环境搭建:从工程创建到配置
1. 搭建专属开发目录
所有实验文件必须统一收纳,避免混乱。先在 Ubuntu 系统创建一个集中存放驱动的根目录,比如`Linux_Drivers`,再在其下新建子目录`1_chrdevbase`,专门存放本次实验的所有文件,结构清晰便于管理。
2. 配置 VSCode 工程
进入`1_chrdevbase`目录后,搭建 VSCode 工程,并新建核心驱动文件`chrdevbase.c`。配置完成后,目录下会自动生成工程配置文件,整个工程的基础框架就已成型,为后续编码做好准备。
3. 配置头文件路径(关键步骤)
编写 Linux 驱动时,大量依赖 Linux 内核源码中的头文件,因此必须手动配置头文件路径,让编辑器能正确识别函数声明和内核数据结构。
1. 打开 VSCode,按 Ctrl+Shift+P 调出控制台,输入`C/C++: Edit configurations (JSON)`,打开配置文件。
2. 此时会自动生成`c_cpp_properties.json`文件,该文件的`includePath`字段就是头文件路径的核心配置。
3. 将 Linux 内核源码的关键路径添加到`includePath`中,包括通用的`include`目录、ARM 架构专用的`arch/arm/include`目录,以及 ARM 架构的生成头文件目录`arch/arm/include/generated`,且需使用绝对路径(路径需根据实际的内核源码存放位置替换,确保路径正确)。配置完成后,编辑器就能正确解析内核头文件,避免出现语法错误。
三、核心代码编写:内核驱动与用户测试程序
1. 内核空间:chrdevbase.c 驱动实现
驱动的核心是定义操作集合与实现操作函数,同时完成模块的初始化和退出逻辑,具体代码设计围绕设备的基础功能展开:
```c
// 基础配置:设备号、名称、缓冲区
#define CHRDEVBASE_MAJOR 200 // 静态主设备号,唯一标识设备
#define CHRDEVBASE_NAME "chrdevbase" // 设备名称
static char readbuf[100]; // 内核读缓冲区,用于向用户空间传递数据
static char writebuf[100]; // 内核写缓冲区,用于接收用户空间的数据
static char kerneldata[] = "kernel data!"; // 内核预设的读数据
// 打开设备:空操作,仅完成初始化验证
static int chrdevbase_open(struct inode *inode, struct file *filp) {
// 可在此添加设备初始化逻辑,本实验无需额外操作
return 0; // 返回0表示打开成功
}
// 读取数据:将内核数据发送到用户空间
static ssize_t chrdevbase_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt) {
int retvalue = 0;
// 先将内核预设数据复制到读缓冲区
memcpy(readbuf, kerneldata, sizeof(kerneldata));
// 核心:通过copy_to_user安全将数据从内核复制到用户空间
retvalue = copy_to_user(buf, readbuf, cnt);
if (retvalue == 0) {
printk("kernel senddata ok!\n"); // 内核日志,打印在系统后台
} else {
printk("kernel senddata failed!\n");
}
return 0;
}
// 写入数据:接收用户数据并输出到内核日志
static ssize_t chrdevbase_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt) {
int retvalue = 0;
// 核心:通过copy_from_user安全将数据从用户空间复制到内核
retvalue = copy_from_user(writebuf, buf, cnt);
if (retvalue == 0) {
printk("kernel recevdata: %s\n", writebuf); // 打印接收到的用户数据
} else {
printk("kernel recevdata failed!\n");
}
return 0;
}
// 关闭设备:空操作,仅完成资源清理验证
static int chrdevbase_release(struct inode *inode, struct file *filp) {
return 0;
}
// 设备操作集合:绑定所有操作函数
static struct file_operations chrdevbase_fops = {
.owner = THIS_MODULE, // 所属模块,防止模块被卸载时仍有操作残留
.open = chrdevbase_open,
.read = chrdevbase_read,
.write = chrdevbase_write,
.release = chrdevbase_release,
};
// 模块初始化:注册字符设备
static int __init chrdevbase_init(void) {
int retvalue = 0;
// 注册字符设备,绑定主设备号、设备名和操作集合
retvalue = register_chrdev(CHRDEVBASE_MAJOR, CHRDEVBASE_NAME, &chrdevbase_fops);
if (retvalue < 0) {
printk("register_chrdev failed!\n");
return retvalue;
}
printk("chrdevbase init!\n"); // 初始化成功日志
return 0;
}
// 模块退出:注销字符设备
static void __exit chrdevbase_exit(void) {
unregister_chrdev(CHRDEVBASE_MAJOR, CHRDEVBASE_NAME);
printk("chrdevbase exit!\n"); // 退出成功日志
}
// 模块注册
module_init(chrdevbase_init);
module_exit(chrdevbase_exit);
MODULE_LICENSE("GPL"); // 遵循GPL协议
核心规范:用户空间和内核空间的内存相互隔离,严禁直接用指针访问对方内存,必须通过`copy_to_user`(内核→用户)和`copy_from_user`(用户→内核)完成数据交互,确保内存安全。
2. 用户空间:chrdevbaseApp.c 测试程序
测试程序是验证驱动功能的关键,它通过标准库函数模拟用户对设备的操作,逻辑围绕参数判断、文件操作和数据处理展开:
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
static char usrdata[] = "usr data!"; // 用户预设的写入数据
int main(int argc, char *argv[]) {
int fd, retvalue;
char *filename;
char readbuf[100], writebuf[100];
// 参数校验:必须输入设备路径和操作类型两个参数
if (argc != 3) {
printf("Error Usage!\n");
return -1;
}
filename = argv[1]; // 要打开的设备路径,如/dev/chrdevbase
// 打开设备:以可读写模式打开
fd = open(filename, O_RDWR);
if (fd < 0) {
printf("Can't open file %s\n", filename);
return -1;
}
// 处理操作类型:1为读,2为写
if (atoi(argv[2]) == 1) {
// 读取数据:读取50字节到readbuf
retvalue = read(fd, readbuf, 50);
if (retvalue < 0) {
printf("read file %s failed!\n", filename);
} else {
printf("read data: %s\n", readbuf); // 打印读取到的数据
}
} else if (atoi(argv[2]) == 2) {
// 写入数据:将usrdata复制到writebuf,再写入50字节
memcpy(writebuf, usrdata, sizeof(usrdata));
retvalue = write(fd, writebuf, 50);
if (retvalue < 0) {
printf("write file %s failed!\n", filename);
}
}
// 关闭设备:释放资源
retvalue = close(fd);
if (retvalue < 0) {
printf("Can't close file %s\n", filename);
return -1;
}
return 0;
}
```
操作规则:运行程序时需传入两个参数,第一个是设备路径,第二个是操作类型——1代表读操作,2代表写操作,参数缺失会直接报错。
四、编译流程:驱动模块与测试程序
1. 编译内核驱动模块(生成 .ko 文件)
驱动必须编译为内核模块(.ko)才能被系统加载,核心是编写正确的 Makefile:
```makefile
# 第1行:指定内核源码路径,替换为实际的内核绝对路径
KERNELDIR := /home/zuozhongkai/linux/IMX6ULL/linux/temp/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
# 第2行:获取当前工作目录的绝对路径
CURRENT_PATH := $(shell pwd)
# 第3行:指定要编译的模块为chrdevbase.o
obj-m := chrdevbase.o
# 编译规则:执行make modules指令,切换到内核目录编译当前目录的模块
build: kernel_modules
kernel_modules:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
# 清理规则:清理编译生成的临时文件
clean:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
```
配置好 Makefile 后,执行 `make -j32` 命令,系统会调用内核的编译环境,自动完成模块编译,最终生成 `chrdevbase.ko` 模块文件
2. 编译测试程序(生成 ARM 可执行文件)
测试程序需要运行在 ARM 开发板上,因此必须用交叉编译器编译,不能用 Ubuntu 的默认 gcc:
```bash
# 交叉编译,生成ARM架构的可执行文件
arm-linux-gnueabihf-gcc chrdevbaseApp.c -o chrdevbaseApp
# 验证文件类型,确认是32位ARM可执行文件
file chrdevbaseApp
```
编译后会生成 `chrdevbaseApp` 可执行文件,执行 `file` 命令会提示“ELF 32-bit LSB executable, ARM”,说明文件只能在 ARM 开发板上运行,适配实验目标平台。
五、运行与测试:完整的驱动验证流程
1. 环境准备与文件部署
开发板需通过 TFTP 加载内核镜像,通过 NFS 挂载根文件系统,确保内核版本与驱动编译时的内核一致。然后将编译好的 `chrdevbase.ko` 和 `chrdevbaseApp` 复制到开发板的 `/lib/modules/4.1.15/` 目录下,方便后续加载。
2. 加载驱动模块
- 优先使用 modprobe(推荐):它会自动处理依赖关系,但加载前需要生成依赖文件。先执行 `depmod` 命令,系统会自动生成 `modules.dep` 等依赖文件,再执行 `modprobe chrdevbase`,加载成功会输出驱动里的 `chrdevbase init!` 日志。
- 也可使用 insmod:直接加载模块,无需依赖处理,命令为 `insmod chrdevbase.ko`,同样能完成加载。
加载完成后,用 `lsmod` 查看当前已加载的模块,会显示 `chrdevbase`,证明模块已成功挂入内核。
3. 确认设备注册与创建节点
- 查看设备注册情况:执行 `cat /proc/devices`,在字符设备列表中能找到主设备号为 200 的 `chrdevbase`,说明设备已在内核中成功注册,与驱动中指定的主设备号一致。
- 手动创建设备节点:内核注册了设备,但用户空间无法直接访问,必须通过 `/dev` 下的设备节点映射。执行命令 `mknod /dev/chrdevbase c 200 0`,其中`c`代表字符设备,`200`是主设备号,`0`是次设备号。创建后用 `ls /dev/chrdevbase -l` 可看到设备节点,之后应用程序就能通过这个节点操作设备。
4. 功能测试:读写验证
- 读操作测试:执行命令 `./chrdevbaseApp /dev/chrdevbase 1`,系统后台会先输出驱动的 `kernel senddata ok!` 日志,终端会打印用户侧接收到的 `read data: kernel data!`,说明读功能正常,内核数据成功传递到用户空间。
- 写操作测试:执行命令 `./chrdevbaseApp /dev/chrdevbase 2`,系统后台会输出驱动的 `kernel recevdata: usr data!` 日志,说明用户空间的数据已成功传递给内核,写功能正常。
5. 卸载驱动模块
驱动使用完毕后,用 `rmmod chrdevbase` 命令卸载,再用 `lsmod` 查看,模块已从列表中消失,证明卸载成功。若使用 `modprobe` 加载的模块,卸载时执行 `modprobe -r chrdevbase` 同样可行。
六、实验核心收获与进阶思考
1. 核心收获
- 掌握字符设备驱动的完整生命周期:从模块注册、设备操作函数实现,到加载、测试、卸载的全流程,清晰理解驱动与内核、用户空间的交互逻辑。
- 理解“一切皆文件”的核心思想:在 Linux 中,设备通过设备节点文件暴露给用户空间,用户用标准的文件操作函数就能控制设备,统一了硬件和普通文件的操作方式。
- 掌握内存安全交互规范:深刻理解内核与用户空间的内存隔离特性,牢记 `copy_to_user` 和 `copy_from_user` 是两者数据交互的唯一安全途径。
2. 进阶优化方向
- 升级驱动框架:当前使用老旧的 `register_chrdev`,仅支持静态主设备号,推荐改用现代驱动框架——通过 `alloc_chrdev_region` 动态分配设备号,再搭配 `cdev_init` 和 `cdev_add` 注册设备,避免设备号冲突,适配更复杂的设备场景。
- 自动创建设备节点:手动 `mknod` 操作繁琐且重启失效,可在驱动中加入 `class_create` 创建设备类,再用 `device_create` 自动生成 `/dev` 下的设备节点,实现驱动加载时自动创建,免去手动操作,提升实用性。
- 保障并发安全:当前驱动无并发保护,多进程同时读写会导致缓冲区数据混乱,后续需引入互斥锁(mutex)或自旋锁,确保数据操作的原子性,适配多任务环境。
- 完善错误处理与日志:当前驱动的错误处理较简单,可细化错误码返回,优化日志的日志级别(如使用 `KERN_ERR` 标记错误,`KERN_INFO` 标记信息),让驱动调试和运维更便捷。
总结
chrdevbase 实验虽基于虚拟设备,却完整覆盖了 Linux 字符设备驱动开发的核心环节,是入门驱动开发的必经之路。通过本次实验,我们不仅掌握了驱动的编写、编译、加载和测试方法,更构建了驱动开发的核心思维框架。后续的复杂设备驱动,均是在此基础上扩展优化而来,打好这一基础,就能更高效地深入 Linux 驱动开发领域。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 09:46:02 HTTP/2.0 GET : https://f.mffb.com.cn/a/489761.html
  2. 运行时间 : 0.160744s [ 吞吐率:6.22req/s ] 内存消耗:4,577.16kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=b2a8842150d21cc0b6420a63be6aa916
  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.000388s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000543s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000281s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000268s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000483s ]
  6. SELECT * FROM `set` [ RunTime:0.000202s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000510s ]
  8. SELECT * FROM `article` WHERE `id` = 489761 LIMIT 1 [ RunTime:0.000559s ]
  9. UPDATE `article` SET `lasttime` = 1783043162 WHERE `id` = 489761 [ RunTime:0.019830s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000311s ]
  11. SELECT * FROM `article` WHERE `id` < 489761 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000457s ]
  12. SELECT * FROM `article` WHERE `id` > 489761 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.008026s ]
  13. SELECT * FROM `article` WHERE `id` < 489761 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.010339s ]
  14. SELECT * FROM `article` WHERE `id` < 489761 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.012538s ]
  15. SELECT * FROM `article` WHERE `id` < 489761 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.038736s ]
0.162275s