You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux-xlnx内核3.17升5.15 ARM下get_fs/set_fs报错咨询

核心结论
  • ARM架构在5.x内核版本中已经完全废弃get_fs()/set_fs()/get_ds()这套地址空间覆写接口,5.15版本下没有合规方式可以通过引用通用头文件重新启用这组宏。强行引入<asm-generic/uaccess.h>会直接和ARM架构专属的uaccess实现冲突,引发大量重定义错误,完全不可行。
  • 这套宏本身就是内核历史遗留的不安全hack:原本作用是临时修改线程的地址空间校验边界,让内核态可以直接传入内核指针调用原本只接受用户态指针的函数,存在大量越权访问、内存破坏的安全隐患。内核社区从4.12版本开始就在全架构推进移除这套机制,ARM是较早完成移除的架构之一,不存在“合规访问线程地址空间做校验覆写”的说法,社区删除接口的核心目的就是禁止这种不安全的编码模式。
适配方案(针对你贴出的文件操作代码)

你原有代码的逻辑是内核态打开文件做操作,靠set_fs(get_ds())绕过VFS层的用户指针校验,这个场景在5.15内核下有明确的官方替代实现,完全不需要操作地址空间:

  1. 删除所有get_fs()/set_fs()/get_ds()相关的代码,不需要保存、恢复线程地址空间状态。
  2. 打开、关闭文件仍然可以使用filp_open()/filp_close()接口,不需要额外修改逻辑,注意filp_open的第三个权限参数类型是umode_t不是int,改对类型避免隐式类型转换警告。
  3. 后续如果要对打开的文件做读写操作,不要再用vfs_read()/vfs_write()(这两个接口仍然会做用户指针校验),替换为内核专门提供的kernel_read()/kernel_write()接口,这两个接口直接接受内核态缓冲区指针,内部已经完成了地址空间适配,不需要手动绕过校验。

适配完成后的参考代码如下:

#include <linux/uaccess.h>
#include <linux/fs.h>

struct file *file_open(const char *path, int flags, umode_t rights)
{
    struct file *filptr = filp_open(path, flags, rights);
    if (IS_ERR(filptr)) {
        return NULL;
    }
    return filptr;
}

void file_close(struct file *file)
{
    int retval = filp_close(file, NULL);
    printk("file_close retval: %d\n", retval);
}

// 替换原有vfs_read调用
ssize_t file_read(struct file *file, void *kern_buf, size_t count, loff_t offset)
{
    return kernel_read(file, kern_buf, count, &offset);
}

// 替换原有vfs_write调用
ssize_t file_write(struct file *file, const void *kern_buf, size_t count, loff_t offset)
{
    return kernel_write(file, kern_buf, count, &offset);
}
适配排查注意事项
  • 所有需要绕过用户指针校验的场景,都不要尝试自己手动实现地址空间覆写逻辑,内核已经为绝大多数常见场景提供了专用接口:除了文件读写外,如果需要在内核态操作内核缓冲区,直接用普通内存拷贝函数即可,不需要调用copy_from_user()/copy_to_user()。
  • 头文件引用严格遵循规范:5.15版本下所有uaccess相关接口只需要包含<linux/uaccess.h>即可,不要手动引入<asm/uaccess.h>或者<asm-generic/uaccess.h>,内核会自动加载对应架构的正确实现,避免重定义错误。
  • 针对Xilinx 5.15定制内核的特殊情况:可以先在内核源码的fs/read_write.c文件中确认kernel_read/kernel_write的符号导出状态,官方维护的linux-xlnx 5.15分支默认已经正确导出了这两个接口,驱动可以直接调用。
  • 不要使用网上流传的手动重定义get_fs/set_fs宏的偏方:这类实现要么直接跳过所有地址校验存在严重安全漏洞,要么因为ARM架构的thread_info结构体已经移除了地址空间字段,直接触发内存访问异常,生产环境绝对不能用。

内容的提问来源于stack exchange,提问作者selim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:30:59