存档

文章标签 ‘MIPS’

Linux on MIPS的syscall及id列表

2012年11月2日 sigma 没有评论 124,762 views

Linux on MIPS的syscall及id列表:

<?xml version="1.0"?>
<!-- Copyright (C) 2011 Free Software Foundation, Inc.
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.  -->
<!DOCTYPE feature SYSTEM "gdb-syscalls.dtd">
<!-- This file was generated using the following file:
/usr/src/linux/arch/mips/include/asm/unistd.h
The file mentioned above belongs to the Linux Kernel.  -->
<syscalls_info>
<syscall name="syscall" number="4000"/>
<syscall name="exit" number="4001"/>
<syscall name="fork" number="4002"/>
<syscall name="read" number="4003"/>
<syscall name="write" number="4004"/>
<syscall name="open" number="4005"/>
<syscall name="close" number="4006"/>
<syscall name="waitpid" number="4007"/>
<syscall name="creat" number="4008"/>
<syscall name="link" number="4009"/>
<syscall name="unlink" number="4010"/>
<syscall name="execve" number="4011"/>
<syscall name="chdir" number="4012"/>
<syscall name="time" number="4013"/>
<syscall name="mknod" number="4014"/>
<syscall name="chmod" number="4015"/>
<syscall name="lchown" number="4016"/>
<syscall name="break" number="4017"/>
<syscall name="lseek" number="4019"/>
<syscall name="getpid" number="4020"/>
<syscall name="mount" number="4021"/>
<syscall name="umount" number="4022"/>
<syscall name="setuid" number="4023"/>
<syscall name="getuid" number="4024"/>
<syscall name="stime" number="4025"/>
<syscall name="ptrace" number="4026"/>
<syscall name="alarm" number="4027"/>
<syscall name="pause" number="4029"/>
<syscall name="utime" number="4030"/>
<syscall name="stty" number="4031"/>
<syscall name="gtty" number="4032"/>
<syscall name="access" number="4033"/>
<syscall name="nice" number="4034"/>
<syscall name="ftime" number="4035"/>
<syscall name="sync" number="4036"/>
<syscall name="kill" number="4037"/>
<syscall name="rename" number="4038"/>
<syscall name="mkdir" number="4039"/>
<syscall name="rmdir" number="4040"/>
<syscall name="dup" number="4041"/>
<syscall name="pipe" number="4042"/>
<syscall name="times" number="4043"/>
<syscall name="prof" number="4044"/>
<syscall name="brk" number="4045"/>
<syscall name="setgid" number="4046"/>
<syscall name="getgid" number="4047"/>
<syscall name="signal" number="4048"/>
<syscall name="geteuid" number="4049"/>
<syscall name="getegid" number="4050"/>
<syscall name="acct" number="4051"/>
<syscall name="umount2" number="4052"/>
<syscall name="lock" number="4053"/>
<syscall name="ioctl" number="4054"/>
<syscall name="fcntl" number="4055"/>
<syscall name="mpx" number="4056"/>
<syscall name="setpgid" number="4057"/>
<syscall name="ulimit" number="4058"/>
<syscall name="umask" number="4060"/>
<syscall name="chroot" number="4061"/>
<syscall name="ustat" number="4062"/>
<syscall name="dup2" number="4063"/>
<syscall name="getppid" number="4064"/>
<syscall name="getpgrp" number="4065"/>
<syscall name="setsid" number="4066"/>
<syscall name="sigaction" number="4067"/>
<syscall name="sgetmask" number="4068"/>
<syscall name="ssetmask" number="4069"/>
<syscall name="setreuid" number="4070"/>
<syscall name="setregid" number="4071"/>
<syscall name="sigsuspend" number="4072"/>
<syscall name="sigpending" number="4073"/>
<syscall name="sethostname" number="4074"/>
<syscall name="setrlimit" number="4075"/>
<syscall name="getrlimit" number="4076"/>
<syscall name="getrusage" number="4077"/>
<syscall name="gettimeofday" number="4078"/>
<syscall name="settimeofday" number="4079"/>
<syscall name="getgroups" number="4080"/>
<syscall name="setgroups" number="4081"/>
<syscall name="symlink" number="4083"/>
<syscall name="readlink" number="4085"/>
<syscall name="uselib" number="4086"/>
<syscall name="swapon" number="4087"/>
<syscall name="reboot" number="4088"/>
<syscall name="readdir" number="4089"/>
<syscall name="mmap" number="4090"/>
<syscall name="munmap" number="4091"/>
<syscall name="truncate" number="4092"/>
<syscall name="ftruncate" number="4093"/>
<syscall name="fchmod" number="4094"/>
<syscall name="fchown" number="4095"/>
<syscall name="getpriority" number="4096"/>
<syscall name="setpriority" number="4097"/>
<syscall name="profil" number="4098"/>
<syscall name="statfs" number="4099"/>
<syscall name="fstatfs" number="4100"/>
<syscall name="ioperm" number="4101"/>
<syscall name="socketcall" number="4102"/>
<syscall name="syslog" number="4103"/>
<syscall name="setitimer" number="4104"/>
<syscall name="getitimer" number="4105"/>
<syscall name="stat" number="4106"/>
<syscall name="lstat" number="4107"/>
<syscall name="fstat" number="4108"/>
<syscall name="iopl" number="4110"/>
<syscall name="vhangup" number="4111"/>
<syscall name="idle" number="4112"/>
<syscall name="vm86" number="4113"/>
<syscall name="wait4" number="4114"/>
<syscall name="swapoff" number="4115"/>
<syscall name="sysinfo" number="4116"/>
<syscall name="ipc" number="4117"/>
<syscall name="fsync" number="4118"/>
<syscall name="sigreturn" number="4119"/>
<syscall name="clone" number="4120"/>
<syscall name="setdomainname" number="4121"/>
<syscall name="uname" number="4122"/>
<syscall name="modify_ldt" number="4123"/>
<syscall name="adjtimex" number="4124"/>
<syscall name="mprotect" number="4125"/>
<syscall name="sigprocmask" number="4126"/>
<syscall name="create_module" number="4127"/>
<syscall name="init_module" number="4128"/>
<syscall name="delete_module" number="4129"/>
<syscall name="get_kernel_syms" number="4130"/>
<syscall name="quotactl" number="4131"/>
<syscall name="getpgid" number="4132"/>
<syscall name="fchdir" number="4133"/>
<syscall name="bdflush" number="4134"/>
<syscall name="sysfs" number="4135"/>
<syscall name="personality" number="4136"/>
<syscall name="afs_syscall" number="4137"/>
<syscall name="setfsuid" number="4138"/>
<syscall name="setfsgid" number="4139"/>
<syscall name="_llseek" number="4140"/>
<syscall name="getdents" number="4141"/>
<syscall name="_newselect" number="4142"/>
<syscall name="flock" number="4143"/>
<syscall name="msync" number="4144"/>
<syscall name="readv" number="4145"/>
<syscall name="writev" number="4146"/>
<syscall name="cacheflush" number="4147"/>
<syscall name="cachectl" number="4148"/>
<syscall name="sysmips" number="4149"/>
<syscall name="getsid" number="4151"/>
<syscall name="fdatasync" number="4152"/>
<syscall name="_sysctl" number="4153"/>
<syscall name="mlock" number="4154"/>
<syscall name="munlock" number="4155"/>
<syscall name="mlockall" number="4156"/>
<syscall name="munlockall" number="4157"/>
<syscall name="sched_setparam" number="4158"/>
<syscall name="sched_getparam" number="4159"/>
<syscall name="sched_setscheduler" number="4160"/>
<syscall name="sched_getscheduler" number="4161"/>
<syscall name="sched_yield" number="4162"/>
<syscall name="sched_get_priority_max" number="4163"/>
<syscall name="sched_get_priority_min" number="4164"/>
<syscall name="sched_rr_get_interval" number="4165"/>
<syscall name="nanosleep" number="4166"/>
<syscall name="mremap" number="4167"/>
<syscall name="accept" number="4168"/>
<syscall name="bind" number="4169"/>
<syscall name="connect" number="4170"/>
<syscall name="getpeername" number="4171"/>
<syscall name="getsockname" number="4172"/>
<syscall name="getsockopt" number="4173"/>
<syscall name="listen" number="4174"/>
<syscall name="recv" number="4175"/>
<syscall name="recvfrom" number="4176"/>
<syscall name="recvmsg" number="4177"/>
<syscall name="send" number="4178"/>
<syscall name="sendmsg" number="4179"/>
<syscall name="sendto" number="4180"/>
<syscall name="setsockopt" number="4181"/>
<syscall name="shutdown" number="4182"/>
<syscall name="socket" number="4183"/>
<syscall name="socketpair" number="4184"/>
<syscall name="setresuid" number="4185"/>
<syscall name="getresuid" number="4186"/>
<syscall name="query_module" number="4187"/>
<syscall name="poll" number="4188"/>
<syscall name="nfsservctl" number="4189"/>
<syscall name="setresgid" number="4190"/>
<syscall name="getresgid" number="4191"/>
<syscall name="prctl" number="4192"/>
<syscall name="rt_sigreturn" number="4193"/>
<syscall name="rt_sigaction" number="4194"/>
<syscall name="rt_sigprocmask" number="4195"/>
<syscall name="rt_sigpending" number="4196"/>
<syscall name="rt_sigtimedwait" number="4197"/>
<syscall name="rt_sigqueueinfo" number="4198"/>
<syscall name="rt_sigsuspend" number="4199"/>
<syscall name="pread64" number="4200"/>
<syscall name="pwrite64" number="4201"/>
<syscall name="chown" number="4202"/>
<syscall name="getcwd" number="4203"/>
<syscall name="capget" number="4204"/>
<syscall name="capset" number="4205"/>
<syscall name="sigaltstack" number="4206"/>
<syscall name="sendfile" number="4207"/>
<syscall name="getpmsg" number="4208"/>
<syscall name="putpmsg" number="4209"/>
<syscall name="mmap2" number="4210"/>
<syscall name="truncate64" number="4211"/>
<syscall name="ftruncate64" number="4212"/>
<syscall name="stat64" number="4213"/>
<syscall name="lstat64" number="4214"/>
<syscall name="fstat64" number="4215"/>
<syscall name="pivot_root" number="4216"/>
<syscall name="mincore" number="4217"/>
<syscall name="madvise" number="4218"/>
<syscall name="getdents64" number="4219"/>
<syscall name="fcntl64" number="4220"/>
<syscall name="gettid" number="4222"/>
<syscall name="readahead" number="4223"/>
<syscall name="setxattr" number="4224"/>
<syscall name="lsetxattr" number="4225"/>
<syscall name="fsetxattr" number="4226"/>
<syscall name="getxattr" number="4227"/>
<syscall name="lgetxattr" number="4228"/>
<syscall name="fgetxattr" number="4229"/>
<syscall name="listxattr" number="4230"/>
<syscall name="llistxattr" number="4231"/>
<syscall name="flistxattr" number="4232"/>
<syscall name="removexattr" number="4233"/>
<syscall name="lremovexattr" number="4234"/>
<syscall name="fremovexattr" number="4235"/>
<syscall name="tkill" number="4236"/>
<syscall name="sendfile64" number="4237"/>
<syscall name="futex" number="4238"/>
<syscall name="sched_setaffinity" number="4239"/>
<syscall name="sched_getaffinity" number="4240"/>
<syscall name="io_setup" number="4241"/>
<syscall name="io_destroy" number="4242"/>
<syscall name="io_getevents" number="4243"/>
<syscall name="io_submit" number="4244"/>
<syscall name="io_cancel" number="4245"/>
<syscall name="exit_group" number="4246"/>
<syscall name="lookup_dcookie" number="4247"/>
<syscall name="epoll_create" number="4248"/>
<syscall name="epoll_ctl" number="4249"/>
<syscall name="epoll_wait" number="4250"/>
<syscall name="remap_file_pages" number="4251"/>
<syscall name="set_tid_address" number="4252"/>
<syscall name="restart_syscall" number="4253"/>
<syscall name="fadvise64" number="4254"/>
<syscall name="statfs64" number="4255"/>
<syscall name="fstatfs64" number="4256"/>
<syscall name="timer_create" number="4257"/>
<syscall name="timer_settime" number="4258"/>
<syscall name="timer_gettime" number="4259"/>
<syscall name="timer_getoverrun" number="4260"/>
<syscall name="timer_delete" number="4261"/>
<syscall name="clock_settime" number="4262"/>
<syscall name="clock_gettime" number="4263"/>
<syscall name="clock_getres" number="4264"/>
<syscall name="clock_nanosleep" number="4265"/>
<syscall name="tgkill" number="4266"/>
<syscall name="utimes" number="4267"/>
<syscall name="mbind" number="4268"/>
<syscall name="get_mempolicy" number="4269"/>
<syscall name="set_mempolicy" number="4270"/>
<syscall name="mq_open" number="4271"/>
<syscall name="mq_unlink" number="4272"/>
<syscall name="mq_timedsend" number="4273"/>
<syscall name="mq_timedreceive" number="4274"/>
<syscall name="mq_notify" number="4275"/>
<syscall name="mq_getsetattr" number="4276"/>
<syscall name="vserver" number="4277"/>
<syscall name="waitid" number="4278"/>
<syscall name="add_key" number="4280"/>
<syscall name="request_key" number="4281"/>
<syscall name="keyctl" number="4282"/>
<syscall name="set_thread_area" number="4283"/>
<syscall name="inotify_init" number="4284"/>
<syscall name="inotify_add_watch" number="4285"/>
<syscall name="inotify_rm_watch" number="4286"/>
<syscall name="migrate_pages" number="4287"/>
<syscall name="openat" number="4288"/>
<syscall name="mkdirat" number="4289"/>
<syscall name="mknodat" number="4290"/>
<syscall name="fchownat" number="4291"/>
<syscall name="futimesat" number="4292"/>
<syscall name="fstatat64" number="4293"/>
<syscall name="unlinkat" number="4294"/>
<syscall name="renameat" number="4295"/>
<syscall name="linkat" number="4296"/>
<syscall name="symlinkat" number="4297"/>
<syscall name="readlinkat" number="4298"/>
<syscall name="fchmodat" number="4299"/>
<syscall name="faccessat" number="4300"/>
<syscall name="pselect6" number="4301"/>
<syscall name="ppoll" number="4302"/>
<syscall name="unshare" number="4303"/>
<syscall name="splice" number="4304"/>
<syscall name="sync_file_range" number="4305"/>
<syscall name="tee" number="4306"/>
<syscall name="vmsplice" number="4307"/>
<syscall name="move_pages" number="4308"/>
<syscall name="set_robust_list" number="4309"/>
<syscall name="get_robust_list" number="4310"/>
<syscall name="kexec_load" number="4311"/>
<syscall name="getcpu" number="4312"/>
<syscall name="epoll_pwait" number="4313"/>
<syscall name="ioprio_set" number="4314"/>
<syscall name="ioprio_get" number="4315"/>
<syscall name="utimensat" number="4316"/>
<syscall name="signalfd" number="4317"/>
<syscall name="timerfd" number="4318"/>
<syscall name="eventfd" number="4319"/>
<syscall name="fallocate" number="4320"/>
<syscall name="timerfd_create" number="4321"/>
<syscall name="timerfd_gettime" number="4322"/>
<syscall name="timerfd_settime" number="4323"/>
<syscall name="signalfd4" number="4324"/>
<syscall name="eventfd2" number="4325"/>
<syscall name="epoll_create1" number="4326"/>
<syscall name="dup3" number="4327"/>
<syscall name="pipe2" number="4328"/>
<syscall name="inotify_init1" number="4329"/>
<syscall name="preadv" number="4330"/>
<syscall name="pwritev" number="4331"/>
<syscall name="rt_tgsigqueueinfo" number="4332"/>
<syscall name="perf_event_open" number="4333"/>
<syscall name="accept4" number="4334"/>
<syscall name="recvmmsg" number="4335"/>
<syscall name="fanotify_init" number="4336"/>
<syscall name="fanotify_mark" number="4337"/>
<syscall name="prlimit64" number="4338"/>
</syscalls_info>

X86的syscall表在这里有:

http://syscalls.kernelgrok.com/

分类: 沙子 标签: , ,

MIPS中LL/SC指令介绍

2011年12月14日 sigma 1 条评论 18,548 views

注:本文主要参考了IBM的《Linux 的 Spinlock 在 MIPS 多核处理器中的设计与实现》一文,需要更详细的关于spinlock的实现可以看前述文章。

在多线程程序中,为了实现对共享变量的互斥访问,一般都会用spinlock实现,而spinlock需要一个TestAndSet的原子操作。而这种原子操作是需要专门的硬件支持才能完成的,在MIPS中,是通过特殊的Load,Store操作LL(Load Linked,链接加载)以及SC(Store Conditional,条件存储)完成的。

LL 指令的功能是从内存中读取一个字,以实现接下来的 RMW(Read-Modify-Write) 操作;SC 指令的功能是向内存中写入一个字,以完成前面的 RMW 操作。LL/SC 指令的独特之处在于,它们不是一个简单的内存读取/写入的函数,当使用 LL 指令从内存中读取一个字之后,比如 LL d, off(b),处理器会记住 LL 指令的这次操作(会在 CPU 的寄存器中设置一个不可见的 bit 位),同时 LL 指令读取的地址 off(b) 也会保存在处理器的寄存器中。接下来的 SC 指令,比如 SC t, off(b),会检查上次 LL 指令执行后的 RMW 操作是否是原子操作(即不存在其它对这个地址的操作),如果是原子操作,则 t 的值将会被更新至内存中,同时 t 的值也会变为1,表示操作成功;反之,如果 RMW 的操作不是原子操作(即存在其它对这个地址的访问冲突),则 t 的值不会被更新至内存中,且 t 的值也会变为0,表示操作失败。

SC 指令执行失败的原因有两种:

  • 在 LL/SC 操作序列的过程中,发生了一个异常(或中断),这些异常(或中断)可能会打乱 RMW 操作的原子性。
  • 在多核处理器中,一个核在进行 RMW 操作时,别的核试图对同样的地址也进行操作,这会导致 SC 指令执行的失败。

在IBM的那篇文章中,并没有说明SC是如何实现RMW是否有冲突的操作的。在一般实现中,处理器有两个专门的域给LL和SC指令,即上文中的“不可见的bit位”以及保存ll操作地址的“寄存器”。再LL之后,处理器会监测各种事件,当发生异常或者有别的处理器对该地址发了invalid请求时,会将不可见的bit位重置,从而导致后面的SC失败。

由于这样的bit位只有一位,存ll的寄存器也只有一个,因此,LL/SC无法实现嵌套,也即无法实现嵌套锁,这是程序员使用LL/SC所需要注意的。

分类: 技术相关, 未分类 标签: , , ,

无觅相关文章插件,快速提升流量