更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
user_copy.h 文件参考

浏览源代码.

函数

size_t LOS_ArchCopyFromUser (void *dst, const void *src, size_t len)
 
size_t LOS_ArchCopyToUser (void *dst, const void *src, size_t len)
 从内核空间拷贝到用户空间 更多...
 
INT32 LOS_CopyFromKernel (VOID *dest, UINT32 max, const VOID *src, UINT32 count)
 将内核数据拷贝到用户空间 更多...
 
INT32 LOS_CopyToKernel (VOID *dest, UINT32 max, const VOID *src, UINT32 count)
 将用户空间的数据拷贝到内核空间 更多...
 
INT32 LOS_UserMemClear (unsigned char *buf, UINT32 len)
 清除用户空间数据 更多...
 

函数说明

◆ LOS_ArchCopyFromUser()

size_t LOS_ArchCopyFromUser ( void dst,
const void src,
size_t  len 
)

在文件 user_copy.c58 行定义.

59{
60 if (!LOS_IsUserAddressRange((VADDR_T)(UINTPTR)src, len)) {//[src,src+len]在内核空间
61 return len;
62 }
63
64 return _arm_user_copy(dst, src, len);//完成从用户空间到内核空间的拷贝
65}
size_t _arm_user_copy(void *dst, const void *src, size_t len)
unsigned long VADDR_T
Definition: los_typedef.h:208
unsigned long UINTPTR
Definition: los_typedef.h:68
STATIC INLINE BOOL LOS_IsUserAddressRange(VADDR_T vaddr, size_t len)
虚拟地址[vaddr,vaddr + len]是否在用户空间
Definition: los_vm_map.h:281
函数调用图:
这是这个函数的调用关系图:

◆ LOS_ArchCopyToUser()

size_t LOS_ArchCopyToUser ( void dst,
const void src,
size_t  len 
)

从内核空间拷贝到用户空间

参数
dst必须在用户空间
src必须在内核空间
len
返回
size_t

在文件 user_copy.c79 行定义.

80{//先判断地址是不是在用户空间
81 if (!LOS_IsUserAddressRange((VADDR_T)(UINTPTR)dst, len)) {//[dest,dest+count] 不在用户空间
82 return len;//必须在用户空间
83 }
84
85 return _arm_user_copy(dst, src, len);//完成从内核空间到用户空间的拷贝
86}
函数调用图:

◆ LOS_CopyFromKernel()

INT32 LOS_CopyFromKernel ( VOID *  dest,
UINT32  max,
const VOID *  src,
UINT32  count 
)

将内核数据拷贝到用户空间

在文件 user_copy.c88 行定义.

89{
90 INT32 ret;
91
92 if (!LOS_IsUserAddressRange((VADDR_T)(UINTPTR)dest, count)) {//[dest,dest+count] 不在用户空间
93 ret = memcpy_s(dest, max, src, count);
94 } else {//[dest,dest+count] 在用户空间
95 ret = ((max >= count) ? _arm_user_copy(dest, src, count) : ERANGE_AND_RESET);//用户空间copy
96 }
97
98 return ret;
99}
signed int INT32
Definition: los_typedef.h:60
函数调用图:
这是这个函数的调用关系图:

◆ LOS_CopyToKernel()

INT32 LOS_CopyToKernel ( VOID *  dest,
UINT32  max,
const VOID *  src,
UINT32  count 
)

将用户空间的数据拷贝到内核空间

在文件 user_copy.c101 行定义.

102{
103 INT32 ret;
104
105 if (!LOS_IsUserAddressRange((vaddr_t)(UINTPTR)src, count)) {//[src,src+count] 在内核空间的情况
106 ret = memcpy_s(dest, max, src, count);
107 } else {//[src,src+count] 在内核空间的情况
108 ret = ((max >= count) ? _arm_user_copy(dest, src, count) : ERANGE_AND_RESET);
109 }
110
111 return ret;
112}
unsigned long vaddr_t
Definition: los_typedef.h:206
函数调用图:
这是这个函数的调用关系图:

◆ LOS_UserMemClear()

INT32 LOS_UserMemClear ( unsigned char *  buf,
UINT32  len 
)

清除用户空间数据

在文件 user_copy.c114 行定义.

115{
116 INT32 ret = 0;
117 if (!LOS_IsUserAddressRange((vaddr_t)(UINTPTR)buf, len)) {//[buf,buf+len] 不在用户空间
118 (VOID)memset_s(buf, len, 0, len);//清0
119 } else {//在用户空间
120 if (_arm_clear_user(buf, len)) {
121 return -EFAULT;
122 }
123 }
124 return ret;
125}
size_t _arm_clear_user(void *addr, size_t bytes)
函数调用图:
这是这个函数的调用关系图: