如何访问物理内存的值并通过在 linux 内核中创建文件来存储该值

how to access value of physical memory and store the value via making file in linux kernel

我是内核新手,英语不好

我有一块STM32板。 STM32板子有唯一的Id。

我想访问存储唯一 Id 的物理内存地址,并获取该地址的值。

然后我想将值存储到缓冲区,因为使文件由唯一 ID 组成。

我的最终目标是制作一个包含板的唯一 ID 的文件。

下面是我的代码。

u8 buf_uniqueId[12];
void __iomem *Unique_Id = ioremap(0x5C005234, 12);

if(Unique_Id == NULL){
    printk(KERN_INFO "count not found UniqueId\n");
    return 1;
}

printk(KERN_INFO "This is UniqueId\n");


struct file *unique = filp_open("/Unique_Id", O_WRONLY|O_CREAT, 0644);

if(unique == -1){
    printk("[!] Can't crate the dstfile");
    return 2;
}
else{
    fs = get_fs();
    set_fs(get_ds());
    for(i=0;i<12;i++){
        buf_uniqueId[i]=readb(Unique_Id+i);
        
        printk(KERN_DEBUG "value of buffer is %02x\n", buf_uniqueId[i]);
        printk("%02x ", readb(Unique_Id+i));
    }
    vfs_write(unique, buf_uniqueId, strlen(buf_uniqueId), &unique->f_pos);
}

物理内存读取值正常

但是将值存储到缓冲区失败。

请多多指教

谢谢。

虽然缺少 buf_uniqueId 的定义,但存储到至少包含 12 个元素的有效数组应该可以正常工作。考虑 readb() 可能 return 零。不是调用 strlen() 并期望 NULL-terminated 字符串,写入大小应该是 sizeof() 之一或固定为 12,具体取决于 buf_uniqueId 分配。您可以用 #define 符号替换每个 12。

建议删除 get_fs()set_fs() 行,同时将 vfs_write() 替换为对 kernel_write() 的调用并检查结果;还要注意 kernel_write()

内的 old_fs 恢复

编译器应该抱怨比较指针和整数:(unique == -1)filp_open() 可以return 各种错误代码;按照 filp_open() 的源代码查看各种与错误相关的宏,例如 IS_ERR()