【标题描述】
任何带uaddr的系统调用,内核在使用前,都需要检测是否是有效的用户态va。在arm64删除set_fs()和UAO支持后,uaddr的有效范围改为使用#define TASK_SIZE_MAX (UL(1) << VA_BITS)判断。但ILP32的用户态指针为32位,验证其地址有效性需使用UL(0x100000000)。为区分是否是32位用户态程序发起的syscall,使用is_compat_task()进行判断。is_compat_task()包含两个函数:is_a32_compat_task()和is_ilp32_compat_task()。前者受选项CONFIG_AARCH32_EL0控制,这是一个只使用32位寄存器的用户态,因此系统调用不可能传高32位非零的地址,即场景仍可使用(UL(1) << VA_BITS)生成mask。对于非有效的用户态地址,会在实际访问的时候产生缺页异常,在那里基于task->mm精确判断。后者受CONFIG_ARM64_ILP32控制,为自研特性,暂无人使用,关闭之。
access_ok()更主要的用途是用于区分USER_DS/KERNEL_DS,在set_fs()删除后,显然已没有这方面的需求。
【环境信息】
硬件信息:All
软件信息:OLK5.10
【问题复现步骤】执行benchmark测试
【预期结果】功能正常
【实际结果】功能正常,性能指标下降
【附件信息】无
Hi thundertown, welcome to the openEuler Community.
I'm the Bot here serving you. You can find the instructions on how to interact with me at Here.
If you have any questions, please contact the SIG: Kernel, and any of the maintainers: @YangYingliang , @pi3orama , @成坚 (CHENG Jian) , @Qiuuuuu , @zhengzengkai , @gogooo , @Xie XiuQi
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
补丁修改相当于:
从而去除了__uaccess_mask_ptr()的判断和处理。
另一个引用点__clear_user(),也先做了access_ok()判断。
v3修改变更为:TASK_SIZE_MAX只判断is_ilp32_compat_task(),并在openeuler_defconfig中默认关闭。开关CONFIG_ARM64_ILP32,不影响KABI。
参见
arm64: fix current_thread_info()->addr_limit setup
Revert "arm64: fix current_thread_info()->addr_limit setup"
arm64: fix address limit problem with TASK_SIZE_MAX
对于 is_a32_compat_task() 类型的进程,只能使用 32 位寄存器,所以高 32位全为 0,那么使用 UL(0x100000000) 或者 (UL(1) << VA_BITS)) 来检验都可以。
但是对于 is_ilp32_compat_task() 类型的进程,可以使用 64 位的寄存器,因为必须要用 UL(0x100000000) 校验(保证高32 位为全 0)。
为了关闭 ILP32,这个补丁其实不是必须的,只是不合入以后,对于 is_compat_
登录 后才可以发表评论