欢迎关注VxWorks567
用户模式与内核模式使用不同的指令集和MMU配置,因此在RTP中不能直接访问内核的资源,包括内核函数、内核数据,以及driver等。如果迫不得已,RTP中必须要使用内核的某些机制,怎么解决?可以在RTP中重写相应功能,或者通过System Call!
System Call对使用者是透明的,它的大致执行流程如下:RTP里调用System Call封装的API时,系统执行一个特定于体系结构的Trap操作,将CPU从用户模式更改为内核模式;完成Trap请求的操作后,内核从Trap返回,将CPU恢复到用户模式。因为这涉及到了内核的Trap,所以System Call的开销比完全在用户模式下执行的程序要高一些。
VxWorks系统默认已经提供数十个System Call,使用syscallShow()就可以看到
详情如下
RTP函数(参数数量) | 对应的内核操作 |
---|---|
_close(1) | _closeSc |
_creat(2) | _creatSc |
_edrErrorInject(6) | _edrErrorInjectSc |
_exit(1) | _exitSc |
_fdatasync(1) | _fdatasyncSc |
_fsync(1) | _fsyncSc |
_getcwd(2) | _getcwdSc |
_ioctl(3) | _ioctlSc |
_mctl(4) | _mctlSc |
_msgQOpen(6) | _msgQOpenSc |
_open(3) | _openSc |
_pause(0) | _pauseSc |
_read(3) | _readSc |
_semExchange(3) | _semExchangeSc |
_semGive(1) | _semGiveSc |
_semOpen(6) | _semOpenSc |
_semRTake(2) | _semRTakeSc |
_semTake(2) | _semTakeSc |
_semWTake(2) | _semWTakeSc |
_sigaction(4) | _sigactionSc |
_sigqueue(4) | _sigqueueSc |
_sigreturn(0) | _sigreturnSc |
_sigsuspend(1) | _sigsuspendSc |
_sigtimedwait(3) | _sigtimedwaitSc |
_taskOpen(1) | _taskOpenSc |
_taskOpenWithGuard(1) | _taskOpenWithGuardSc |
_taskSigqueue(4) | _taskSigqueueSc |
_taskTcbCurrentGet(0) | _taskTcbCurrentGetSc |
_timer_open(5) | _timer_openSc |
_waitpid(3) | _waitpidSc |
_write(3) | _writeSc |
accept(3) | acceptSc |
access(2) | accessSc |
bind(3) | bindSc |
chdir(1) | chdirSc |
chmod(2) | chmodSc |
clockCtl(4) | clockCtlSc |
connect(3) | connectSc |
dup(1) | dupSc |
dup2(2) | dup2Sc |
edrFlagsGet(0) | edrFlagsGetSc |
eventCtl(4) | eventCtlSc |
eventReceive(4) | eventReceiveSc |
eventSend(2) | eventSendSc |
fpathconf(2) | fpathconfSc |
getpeername(3) | getpeernameSc |
getpid(0) | getpidSc |
getppid(0) | getppidSc |
getprlimit(4) | getprlimitSc |
getsockname(3) | getsocknameSc |
getsockopt(5) | getsockoptSc |
kill(2) | killSc |
link(2) | linkSc |
listen(2) | listenSc |
mmap(8) | mmapSc |
mprotect(3) | mprotectSc |
msgQReceive(4) | msgQReceiveSc |
msgQSend(5) | msgQSendSc |
munmap(2) | munmapSc |
objDelete(2) | objDeleteSc |
objInfoGet(4) | objInfoGetSc |
objUnlink(2) | objUnlinkSc |
pathconf(2) | pathconfSc |
pipe(1) | pipeSc |
pipeDevCreate(3) | pipeDevCreateSc |
pipeDevDelete(2) | pipeDevDeleteSc |
recv(4) | recvSc |
recvfrom(6) | recvfromSc |
recvmsg(3) | recvmsgSc |
remove(1) | removeSc |
rename(2) | renameSc |
rtpInfoGet(2) | rtpInfoGetSc |
rtpSpawn(7) | rtpSpawnSc |
rtpVarAdd(2) | rtpVarAddSc |
select(5) | selectSc |
semCtl(4) | semCtlSc |
send(4) | sendSc |
sendmsg(3) | sendmsgSc |
sendto(6) | sendtoSc |
setprlimit(4) | setprlimitSc |
setsockopt(5) | setsockoptSc |
shutdown(2) | shutdownSc |
sigaltstack(2) | sigaltstackSc |
sigpending(1) | sigpendingSc |
sigprocmask(3) | sigprocmaskSc |
socket(3) | socketSc |
sysctl(6) | sysctlSc |
taskCtl(4) | taskCtlSc |
taskDelay(1) | taskDelaySc |
taskKill(2) | taskKillSc |
timerCtl(4) | timerCtlSc |
unlink(1) | unlinkSc |
改天再来看看如何添加自己的SystemCall
我是泰山 专注VX 0x10年
一起学习 共同进步