【发布时间】:2021-01-17 06:29:05
【问题描述】:
我正在编写我的第一个普通设备驱动程序,但遇到了一些问题:
-
我正在关注这本书,但在执行
copy_(to|from)_user()API(或任何在用户和内核空间之间传输数据的 API)时,它似乎没有详细介绍工作细节。有些东西不是很详细,但是在内核上工作时必须知道的东西。 -
copy_from_user()的实现到底是什么样的?我遇到了以下 sn-ps,但它只是归结为汇编级别。我可能导航不正确。我已经看到了这个函数的一些引用,看起来如果它返回 0 以外的任何值,就会出错。
// https://elixir.bootlin.com/linux/latest/source/include/linux/uaccess.h#L189
static __always_inline unsigned long __must_check
copy_from_user(void *to, const void __user *from, unsigned long n)
{
if (likely(check_copy_size(to, n, false)))
n = _copy_from_user(to, from, n);
return n;
}
__copy_from_user(void *to, const void __user *from, unsigned long n)
{
might_fault();
if (should_fail_usercopy())
return n;
instrument_copy_from_user(to, from, n);
check_object_size(to, n, false);
return raw_copy_from_user(to, from, n);
}
// https://elixir.bootlin.com/linux/latest/source/arch/arm64/include/asm/uaccess.h#L385
#define raw_copy_from_user(to, from, n) \
({ \
unsigned long __acfu_ret; \
uaccess_enable_not_uao(); \
__acfu_ret = __arch_copy_from_user((to), \
__uaccess_mask_ptr(from), (n)); \
uaccess_disable_not_uao(); \
__acfu_ret; \
})
// https://elixir.bootlin.com/linux/latest/source/arch/nds32/lib/copy_from_user.S#L34
.text
ENTRY(__arch_copy_from_user)
add $r5, $r0, $r2
#include "copy_template.S"
move $r0, $r2
ret
.section .fixup,"ax"
.align 2
9001:
sub $r0, $r5, $r0
ret
.previous
ENDPROC(__arch_copy_from_user)
【问题讨论】:
-
每个问题一个问题!你真的有 2 个不相关的话题
-
第一个公告点与标题不匹配所以删除它并单独询问
-
好的,完成.....
标签: c linux-kernel kernel