linux系统移植过程中挂死问题分析
1,场景分析
设备有一个硬件寄存器,用于存储一个 32 位的状态码。我们编写了一个函数来读取这个状态码,现在需要将这部分代码运行在aarch64位系统上,但是移植后会出现系统挂死的问题。
第一步:在 ARM32 上“正常”运行的代码
首先,是共享给用户空间的头文件和驱动代码。
// my_dma.h - 用户空间和内核空间共用
struct dma_config {unsigned int status_code; // 4字节,用于返回操作状态void* user_buffer; // 在ARM32上是4字节指针,指向用户缓冲区
};
// my_dma_driver.c - 内核驱动代码
#include "my_dma.h"long my_dma_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {struct dma_config cfg;// 从用户空间复制结构体if (copy_from_user(&cfg, (void __user *)arg, sizeof(cfg))) {return -EFAULT;}// ... 启动DMA硬件 ...// *** BUGGY CODE START ***// DMA完成后,硬件返回一个64位的状态码(虽然ARM32只有32位寄存器)// 程序员想把这个状态码写入status_code,他错误地认为应该按64位写入// 他没有创建新指针,而是直接对结