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

浏览源代码.

函数

int CheckRegion (const LosVmSpace *space, VADDR_T ptr, size_t len)
 
voidDupUserMem (const void *ptr, size_t len, int needCopy)
 
int GetFullpath (int fd, const char *path, char **fullpath)
 
int UserPathCopy (const char *userPath, char **pathBuf)
 

函数说明

◆ CheckRegion()

int CheckRegion ( const LosVmSpace space,
VADDR_T  ptr,
size_t  len 
)

在文件 syscall_pub.c33 行定义.

34{
35 LosVmMapRegion *region = LOS_RegionFind((LosVmSpace *)space, ptr);
36 if (region == NULL) {
37 return -1;
38 }
39 if (ptr + len <= region->range.base + region->range.size) {
40 return 0;
41 }
42 return CheckRegion(space, region->range.base + region->range.size,
43 (ptr + len) - (region->range.base + region->range.size));
44}
LosVmMapRegion * LOS_RegionFind(LosVmSpace *vmSpace, VADDR_T addr)
查找线性区 根据起始地址在进程空间内查找是否存在
Definition: los_vm_map.c:414
UINT32 size
Definition: los_vm_map.h:85
VADDR_T base
Definition: los_vm_map.h:84
LosVmMapRange range
Definition: los_vm_map.h:123
虚拟空间,每个进程都有一个属于自己的虚拟内存地址空间
Definition: los_vm_map.h:146
int CheckRegion(const LosVmSpace *space, VADDR_T ptr, size_t len)
Definition: syscall_pub.c:33
函数调用图:
这是这个函数的调用关系图:

◆ DupUserMem()

void * DupUserMem ( const void ptr,
size_t  len,
int  needCopy 
)

在文件 syscall_pub.c46 行定义.

47{
48 void *p = LOS_MemAlloc(OS_SYS_MEM_ADDR, len);
49
50 if (p == NULL) {
51 set_errno(ENOMEM);
52 return NULL;
53 }
54
55 if (needCopy && LOS_ArchCopyFromUser(p, ptr, len) != 0) {
56 LOS_MemFree(OS_SYS_MEM_ADDR, p);
57 set_errno(EFAULT);
58 return NULL;
59 }
60
61 return p;
62}
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
Definition: los_memory.c:1123
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
Definition: los_memory.c:1369
size_t LOS_ArchCopyFromUser(void *dst, const void *src, size_t len)
Definition: user_copy.c:58
函数调用图:

◆ GetFullpath()

int GetFullpath ( int  fd,
const char *  path,
char **  fullpath 
)

在文件 syscall_pub.c64 行定义.

65{
66 int ret = 0;
67 char *pathRet = NULL;
68 struct file *file = NULL;
69 struct stat bufRet = {0};
70
71 if (path != NULL) {
72 ret = UserPathCopy(path, &pathRet);
73 if (ret != 0) {
74 goto OUT;
75 }
76 }
77
78 if ((pathRet != NULL) && (*pathRet == '/')) {
79 *fullpath = pathRet;
80 pathRet = NULL;
81 } else {
82 if (fd != AT_FDCWD) {
83 /* Process fd convert to system global fd */
84 fd = GetAssociatedSystemFd(fd);
85 }
86 ret = fs_getfilep(fd, &file);
87 if (file) {
88 ret = stat(file->f_path, &bufRet);
89 if (!ret) {
90 if (!S_ISDIR(bufRet.st_mode)) {
91 set_errno(ENOTDIR);
92 ret = -ENOTDIR;
93 goto OUT;
94 }
95 }
96 }
97 ret = vfs_normalize_pathat(fd, pathRet, fullpath);
98 }
99
100OUT:
101 PointerFree(pathRet);
102 return ret;
103}
int vfs_normalize_pathat(int dirfd, const char *filename, char **pathname)
Definition: fullpath.c:309
char * f_path
int UserPathCopy(const char *userPath, char **pathBuf)
Definition: syscall_pub.c:105
int GetAssociatedSystemFd(int procFd)
获取绑定的系统描述符
Definition: vfs_procfd.c:133
函数调用图:
这是这个函数的调用关系图:

◆ UserPathCopy()

int UserPathCopy ( const char *  userPath,
char **  pathBuf 
)

在文件 syscall_pub.c105 行定义.

106{
107 int ret;
108
109 *pathBuf = (char *)LOS_MemAlloc(OS_SYS_MEM_ADDR, PATH_MAX + 1);
110 if (*pathBuf == NULL) {
111 return -ENOMEM;
112 }
113
114 ret = LOS_StrncpyFromUser(*pathBuf, userPath, PATH_MAX + 1);
115 if (ret < 0) {
116 (void)LOS_MemFree(OS_SYS_MEM_ADDR, *pathBuf);
117 *pathBuf = NULL;
118 return ret;
119 } else if (ret > PATH_MAX) {
120 (void)LOS_MemFree(OS_SYS_MEM_ADDR, *pathBuf);
121 *pathBuf = NULL;
122 return -ENAMETOOLONG;
123 }
124 (*pathBuf)[ret] = '\0';
125
126 return 0;
127}
INT32 LOS_StrncpyFromUser(CHAR *dst, const CHAR *src, INT32 count)
ARG_NUM_3 ARG_NUM_1 ARG_NUM_2 ARG_NUM_2 ARG_NUM_3 ARG_NUM_1 ARG_NUM_4 ARG_NUM_2 ARG_NUM_2 ARG_NUM_5 ARG_NUM_2 void
函数调用图:
这是这个函数的调用关系图: