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

浏览源代码.

函数

int SysUname (struct utsname *name)
 
int SysInfo (struct sysinfo *info)
 系统信息 更多...
 
int SysReboot (int magic, int magic2, int type)
 重启系统 更多...
 
int SysShellExec (const char *msgName, const char *cmdString)
 执行 shell 命令 更多...
 
static void ConvertClocks (struct timeval *time, clock_t clk)
 
int SysGetrusage (int what, struct rusage *ru)
 
long SysSysconf (int name)
 系统配置 更多...
 
int SysUgetrlimit (int resource, unsigned long long k_rlim[2])
 
int SysSetrlimit (int resource, unsigned long long k_rlim[2])
 

函数说明

◆ ConvertClocks()

static void ConvertClocks ( struct timeval *  time,
clock_t  clk 
)
static

在文件 misc_syscall.c152 行定义.

153{
154 time->tv_usec = (clk % CLOCKS_PER_SEC) * USEC_PER_SEC / CLOCKS_PER_SEC;
155 time->tv_sec = (clk) / CLOCKS_PER_SEC;
156}
time_t time(time_t *t)
Definition: time.c:1224
函数调用图:
这是这个函数的调用关系图:

◆ SysGetrusage()

int SysGetrusage ( int  what,
struct rusage *  ru 
)

在文件 misc_syscall.c158 行定义.

159{
160 int ret;
161 struct tms time;
162 clock_t usec, sec;
163 struct rusage kru;
164
165 ret = LOS_ArchCopyFromUser(&kru, ru, sizeof(struct rusage));
166 if (ret != 0) {
167 return -EFAULT;
168 }
169
170 if (times(&time) == -1) {
171 return -EFAULT;
172 }
173
174 switch (what) {
175 case RUSAGE_SELF: {
176 usec = time.tms_utime;
177 sec = time.tms_stime;
178 break;
179 }
180 case RUSAGE_CHILDREN: {
181 usec = time.tms_cutime;
182 sec = time.tms_cstime;
183 break;
184 }
185 default:
186 return -EINVAL;
187 }
188 ConvertClocks(&kru.ru_utime, usec);
189 ConvertClocks(&kru.ru_stime, sec);
190
191 ret = LOS_ArchCopyToUser(ru, &kru, sizeof(struct rusage));
192 if (ret != 0) {
193 return -EFAULT;
194 }
195 return 0;
196}
static void ConvertClocks(struct timeval *time, clock_t clk)
Definition: misc_syscall.c:152
clock_t times(struct tms *buf)
Definition: time.c:1107
size_t LOS_ArchCopyToUser(void *dst, const void *src, size_t len)
从内核空间拷贝到用户空间
Definition: user_copy.c:79
size_t LOS_ArchCopyFromUser(void *dst, const void *src, size_t len)
Definition: user_copy.c:58
函数调用图:

◆ SysInfo()

int SysInfo ( struct sysinfo *  info)

系统信息

在文件 misc_syscall.c71 行定义.

72{
73 int ret;
74 struct sysinfo tmpInfo = { 0 };
75
76 tmpInfo.totalram = LOS_MemPoolSizeGet(m_aucSysMem1);
78 tmpInfo.sharedram = 0;
79 tmpInfo.bufferram = 0;
80 tmpInfo.totalswap = 0;
81 tmpInfo.freeswap = 0;
82
83 ret = LOS_ArchCopyToUser(info, &tmpInfo, sizeof(struct sysinfo));
84 if (ret != 0) {
85 return -EFAULT;
86 }
87 return 0;
88}
UINT8 * m_aucSysMem1
系统动态内存池地址的起始地址 @note_thinking 能否不要用 0,1来命名核心变量 ???
Definition: los_memory.c:108
UINT32 LOS_MemPoolSizeGet(const VOID *pool)
获取指定动态内存池的总大小
Definition: los_memory.c:1603
UINT32 LOS_MemTotalUsedGet(VOID *pool)
获取指定动态内存池的总使用量大小
Definition: los_memory.c:1628
函数调用图:

◆ SysReboot()

int SysReboot ( int  magic,
int  magic2,
int  type 
)

重启系统

在文件 misc_syscall.c90 行定义.

91{
92 (void)magic;
93 (void)magic2;
94 if (!IsCapPermit(CAP_REBOOT)) {
95 return -EPERM;
96 }
97 SystemRebootFunc rebootHook = OsGetRebootHook();
98 if ((type == RB_AUTOBOOT) && (rebootHook != NULL)) {
99 rebootHook();
100 return 0;
101 }
102 return -EFAULT;
103}
BOOL IsCapPermit(UINT32 capIndex)
Definition: capability.c:43
SystemRebootFunc OsGetRebootHook(VOID)
获取系统重启钩子函数
Definition: los_config.c:63
VOID(* SystemRebootFunc)(VOID)
Definition: los_config.h:475
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
函数调用图:

◆ SysSetrlimit()

int SysSetrlimit ( int  resource,
unsigned long long  k_rlim[2] 
)

在文件 misc_syscall.c228 行定义.

229{
230 int ret;
231 struct rlimit lim;
232
233 if(!IsCapPermit(CAP_CAPSET)) {
234 return -EPERM;
235 }
236
237 ret = LOS_ArchCopyFromUser(&lim, k_rlim, sizeof(struct rlimit));
238 if (ret != 0) {
239 return -EFAULT;
240 }
241 ret = setrlimit(resource, &lim);
242
243 return ret;
244}
int setrlimit(int resource, const struct rlimit *rlim)
重新设置当前进程资源限制。
Definition: misc.c:189
函数调用图:

◆ SysShellExec()

int SysShellExec ( const char *  msgName,
const char *  cmdString 
)

执行 shell 命令

在文件 misc_syscall.c106 行定义.

107{
108 int ret;
109 unsigned int uintRet;
110 errno_t err;
111 CmdParsed cmdParsed;
112 char msgNameDup[CMD_KEY_LEN + 1] = { 0 };
113 char cmdStringDup[CMD_MAX_LEN + 1] = { 0 };
114
115 if (!IsCapPermit(CAP_SHELL_EXEC)) {//1.先鉴权
116 return -EPERM;
117 }
118 //2.由内核栈空间接走用户空间的参数,注意还是同一个任务,只是从任务的用户空间移到内核栈.
119 ret = LOS_StrncpyFromUser(msgNameDup, msgName, CMD_KEY_LEN + 1);
120 if (ret < 0) {
121 return -EFAULT;
122 } else if (ret > CMD_KEY_LEN) {
123 return -ENAMETOOLONG;
124 }
125
126 ret = LOS_StrncpyFromUser(cmdStringDup, cmdString, CMD_MAX_LEN + 1);
127 if (ret < 0) {
128 return -EFAULT;
129 } else if (ret > CMD_MAX_LEN) {
130 return -ENAMETOOLONG;
131 }
132
133 err = memset_s(&cmdParsed, sizeof(CmdParsed), 0, sizeof(CmdParsed));
134 if (err != EOK) {
135 return -EFAULT;
136 }
137 //获取消息类型
138 uintRet = ShellMsgTypeGet(&cmdParsed, msgNameDup);
139 if (uintRet != LOS_OK) {
140 PRINTK("%s:command not found\n", msgNameDup);
141 return -EFAULT;
142 } else {
143 (void)OsCmdExec(&cmdParsed, (char *)cmdStringDup);//执行shell命令,回调命令注册时的 函数指针
144 }
145
146 return 0;
147}
unsigned int OsCmdExec(CmdParsed *cmdParsed, char *cmdStr)
执行命令,shell是运行程序的程序.
Definition: shcmd.c:586
UINT32 ShellMsgTypeGet(CmdParsed *cmdParsed, const CHAR *cmdType)
获取shell消息类型
Definition: shmsg.c:222
INT32 LOS_StrncpyFromUser(CHAR *dst, const CHAR *src, INT32 count)
函数调用图:

◆ SysSysconf()

long SysSysconf ( int  name)

系统配置

在文件 misc_syscall.c198 行定义.

199{
200 long ret;
201
202 ret = sysconf(name);
203 if (ret == -1) {
204 return -get_errno();
205 }
206
207 return ret;
208}
long sysconf(int name)
Definition: misc.c:82
函数调用图:

◆ SysUgetrlimit()

int SysUgetrlimit ( int  resource,
unsigned long long  k_rlim[2] 
)

在文件 misc_syscall.c210 行定义.

211{
212 int ret;
213 struct rlimit lim;
214
215 ret = getrlimit(resource, &lim);
216 if (ret < 0) {
217 return ret;
218 }
219
220 ret = LOS_ArchCopyToUser(k_rlim, &lim, sizeof(struct rlimit));
221 if (ret != 0) {
222 return -EFAULT;
223 }
224
225 return ret;
226}
int getrlimit(int resource, struct rlimit *rlim)
获取当前进程资源限制。
Definition: misc.c:155
函数调用图:

◆ SysUname()

int SysUname ( struct utsname *  name)

在文件 misc_syscall.c52 行定义.

53{
54 int ret;
55 struct utsname tmpName;
56 ret = LOS_ArchCopyFromUser(&tmpName, name, sizeof(struct utsname));
57 if (ret != 0) {
58 return -EFAULT;
59 }
60 ret = uname(&tmpName);
61 if (ret < 0) {
62 return ret;
63 }
64 ret = LOS_ArchCopyToUser(name, &tmpName, sizeof(struct utsname));
65 if (ret != 0) {
66 return -EFAULT;
67 }
68 return ret;
69}
int uname(struct utsname *name)
Definition: misc.c:55
函数调用图: