系统调用的过程

系统调用是实现是应用程序调用swi, 进入swi 异常处理模式:

crash> dis -l vector_swi

/* 保存寄存器

系统调用和进程切换上下文保存的内容,有什么不同?

系统调用对应的数据结构是pt_regs,而进程调度使用的是thread_info -> cpu_context_save

 **/
0xc000e100 <vector_swi>:        sub     sp, sp, #72     ; 0x48
0xc000e104 <vector_swi+4>:      stm     sp, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12}
0xc000e108 <vector_swi+8>:      add     r8, sp, #60     ; 0x3c
0xc000e10c <vector_swi+12>:     stmdb   r8, {sp, lr}^
0xc000e110 <vector_swi+16>:     mrs     r8, SPSR
0xc000e114 <vector_swi+20>:     str     lr, [sp, #60]   ; 0x3c
0xc000e118 <vector_swi+24>:     str     r8, [sp, #64]   ; 0x40
0xc000e11c <vector_swi+28>:     str     r0, [sp, #68]   ; 0x44


/* Get the system call number.

 **/
0xc000e120 <vector_swi+32>:     mov     r11, #0
0xc000e124 <vector_swi+36>:     tst     r8, #32
0xc000e128 <vector_swi+40>:     movne   r10, #0
0xc000e12c <vector_swi+44>:     ldreq   r10, [lr, #-4]
0xc000e130 <vector_swi+48>:     ldr     r12, [pc, #168] ; 0xc000e1e0 <__cr_alignment>
0xc000e134 <vector_swi+52>:     ldr     r12, [r12]
0xc000e138 <vector_swi+56>:     mcr     15, 0, r12, cr1, cr0, {0}
0xc000e13c <vector_swi+60>:     cpsie   i
0xc000e140 <vector_swi+64>:     lsr     r9, sp, #13
0xc000e144 <vector_swi+68>:     lsl     r9, r9, #13
0xc000e148 <vector_swi+72>:     add     r8, pc, #152    ; 0x98
0xc000e14c <vector_swi+76>:     bics    r10, r10, #-16777216    ; 0xff000000
0xc000e150 <vector_swi+80>:     eorne   r7, r10, #9437184       ; 0x900000

/*sys_call_table:调用具体的系统函数

 **/
0xc000e154 <vector_swi+84>:     ldrne   r8, [pc, #136]  ; 0xc000e1e4 <__cr_alignment+4>
0xc000e158 <vector_swi+88>:     ldr     r10, [r9]
0xc000e15c <vector_swi+92>:     push    {r4, r5}
0xc000e160 <vector_swi+96>:     tst     r10, #768       ; 0x300
0xc000e164 <vector_swi+100>:    bne     0xc000e18c <__sys_trace>
0xc000e168 <vector_swi+104>:    cmp     r7, #380        ; 0x17c
0xc000e16c <vector_swi+108>:    sub     lr, pc, #308    ; 0x134
0xc000e170 <vector_swi+112>:    ldrcc   pc, [r8, r7, lsl #2]

/*Handle all unrecognised system calls.

 **/
0xc000e174 <vector_swi+116>:    add     r1, sp, #8
0xc000e178 <vector_swi+120>:    mov     r8, #0
0xc000e17c <vector_swi+124>:    cmp     r7, #983040     ; 0xf0000
0xc000e180 <vector_swi+128>:    eor     r0, r7, #0
0xc000e184 <vector_swi+132>:    bcs     0xc0012810 <arm_syscall>
0xc000e188 <vector_swi+136>:    b       0xc0044420 <sys_vm86old>


系统调用保存上下文使用的数据结构pt_regs:

crash> pt_regs
struct pt_regs {
    unsigned long uregs[18];
}
SIZE: 72

#define ARM_cpsr    uregs[16]
#define ARM_pc        uregs[15]
#define ARM_lr        uregs[14]
#define ARM_sp        uregs[13]
#define ARM_ip        uregs[12]
#define ARM_fp        uregs[11]
#define ARM_r10        uregs[10]
#define ARM_r9        uregs[9]
#define ARM_r8        uregs[8]
#define ARM_r7        uregs[7]
#define ARM_r6        uregs[6]
#define ARM_r5        uregs[5]
#define ARM_r4        uregs[4]
#define ARM_r3        uregs[3]
#define ARM_r2        uregs[2]
#define ARM_r1        uregs[1]
#define ARM_r0        uregs[0]
#define ARM_ORIG_r0    uregs[17]

  DEFINE(S_R0,            offsetof(struct pt_regs, ARM_r0));
  DEFINE(S_R1,            offsetof(struct pt_regs, ARM_r1));
  DEFINE(S_R2,            offsetof(struct pt_regs, ARM_r2));
  DEFINE(S_R3,            offsetof(struct pt_regs, ARM_r3));
  DEFINE(S_R4,            offsetof(struct pt_regs, ARM_r4));
  DEFINE(S_R5,            offsetof(struct pt_regs, ARM_r5));
  DEFINE(S_R6,            offsetof(struct pt_regs, ARM_r6));
  DEFINE(S_R7,            offsetof(struct pt_regs, ARM_r7));
  DEFINE(S_R8,            offsetof(struct pt_regs, ARM_r8));
  DEFINE(S_R9,            offsetof(struct pt_regs, ARM_r9));
  DEFINE(S_R10,            offsetof(struct pt_regs, ARM_r10));
  DEFINE(S_FP,            offsetof(struct pt_regs, ARM_fp));
  DEFINE(S_IP,            offsetof(struct pt_regs, ARM_ip));
  DEFINE(S_SP,            offsetof(struct pt_regs, ARM_sp));
  DEFINE(S_LR,            offsetof(struct pt_regs, ARM_lr));
  DEFINE(S_PC,            offsetof(struct pt_regs, ARM_pc));
  DEFINE(S_PSR,            offsetof(struct pt_regs, ARM_cpsr));
  DEFINE(S_OLD_R0,        offsetof(struct pt_regs, ARM_ORIG_r0));
  DEFINE(S_FRAME_SIZE,        sizeof(struct pt_regs));

有关EABI and OABI

内核里面谈EABI,OABI,其实相对于系统调用的方式,当然我们所说的系统限于arm系统。

根据是EABI/OABI获得syscall ID

sys_call_table

kernel支持的系统函数,都在这个数组中

ENTRY(sys_call_table)
#include "calls.S"

arch/arm/kernel/calls.s

/* 0 */        CALL(sys_restart_syscall)
        CALL(sys_exit)
        CALL(sys_fork_wrapper)
        CALL(sys_read)
        CALL(sys_write)
/* 5 */        CALL(sys_open)
        CALL(sys_close)
        CALL(sys_ni_syscall)        /* was sys_waitpid */
        CALL(sys_creat)
        CALL(sys_link)
/* 10 */    CALL(sys_unlink)
        CALL(sys_execve_wrapper)
        CALL(sys_chdir)
        CALL(OBSOLETE(sys_time))    /* used by libc4 */
        CALL(sys_mknod)
/* 15 */    CALL(sys_chmod)
        CALL(sys_lchown16)
        CALL(sys_ni_syscall)        /* was sys_break */
        CALL(sys_ni_syscall)        /* was sys_stat */
        CALL(sys_lseek)
/* 20 */    CALL(sys_getpid)
        CALL(sys_mount)
        CALL(OBSOLETE(sys_oldumount))    /* used by libc4 */
        CALL(sys_setuid16)
        CALL(sys_getuid16)
/* 25 */    CALL(OBSOLETE(sys_stime))
        CALL(sys_ptrace)
        CALL(OBSOLETE(sys_alarm))    /* used by libc4 */
        CALL(sys_ni_syscall)        /* was sys_fstat */
        CALL(sys_pause)
/* 30 */    CALL(OBSOLETE(sys_utime))    /* used by libc4 */
        CALL(sys_ni_syscall)        /* was sys_stty */
        CALL(sys_ni_syscall)        /* was sys_getty */
        CALL(sys_access)
        CALL(sys_nice)
/* 35 */    CALL(sys_ni_syscall)        /* was sys_ftime */
        CALL(sys_sync)
        CALL(sys_kill)
        CALL(sys_rename)
        CALL(sys_mkdir)
/* 40 */    CALL(sys_rmdir)
        CALL(sys_dup)
        CALL(sys_pipe)
        CALL(sys_times)
        CALL(sys_ni_syscall)        /* was sys_prof */
/* 45 */    CALL(sys_brk)
        CALL(sys_setgid16)
        CALL(sys_getgid16)
        CALL(sys_ni_syscall)        /* was sys_signal */
        CALL(sys_geteuid16)
/* 50 */    CALL(sys_getegid16)
        CALL(sys_acct)
        CALL(sys_umount)
        CALL(sys_ni_syscall)        /* was sys_lock */
        CALL(sys_ioctl)
/* 55 */    CALL(sys_fcntl)
        CALL(sys_ni_syscall)        /* was sys_mpx */
        CALL(sys_setpgid)
        CALL(sys_ni_syscall)        /* was sys_ulimit */
        CALL(sys_ni_syscall)        /* was sys_olduname */
/* 60 */    CALL(sys_umask)
        CALL(sys_chroot)
        CALL(sys_ustat)
        CALL(sys_dup2)
        CALL(sys_getppid)
/* 65 */    CALL(sys_getpgrp)
        CALL(sys_setsid)
        CALL(sys_sigaction)
        CALL(sys_ni_syscall)        /* was sys_sgetmask */
        CALL(sys_ni_syscall)        /* was sys_ssetmask */
/* 70 */    CALL(sys_setreuid16)
        CALL(sys_setregid16)
        CALL(sys_sigsuspend)
        CALL(sys_sigpending)
        CALL(sys_sethostname)
/* 75 */    CALL(sys_setrlimit)
        CALL(OBSOLETE(sys_old_getrlimit)) /* used by libc4 */
        CALL(sys_getrusage)
        CALL(sys_gettimeofday)
        CALL(sys_settimeofday)
/* 80 */    CALL(sys_getgroups16)
        CALL(sys_setgroups16)
        CALL(OBSOLETE(sys_old_select))    /* used by libc4 */
        CALL(sys_symlink)
        CALL(sys_ni_syscall)        /* was sys_lstat */
/* 85 */    CALL(sys_readlink)
        CALL(sys_uselib)
        CALL(sys_swapon)
        CALL(sys_reboot)
        CALL(OBSOLETE(sys_old_readdir))    /* used by libc4 */
/* 90 */    CALL(OBSOLETE(sys_old_mmap))    /* used by libc4 */
        CALL(sys_munmap)
        CALL(sys_truncate)
        CALL(sys_ftruncate)
        CALL(sys_fchmod)
/* 95 */    CALL(sys_fchown16)
        CALL(sys_getpriority)
        CALL(sys_setpriority)
        CALL(sys_ni_syscall)        /* was sys_profil */
        CALL(sys_statfs)
/* 100 */    CALL(sys_fstatfs)
        CALL(sys_ni_syscall)        /* sys_ioperm */
        CALL(OBSOLETE(ABI(sys_socketcall, sys_oabi_socketcall)))
        CALL(sys_syslog)
        CALL(sys_setitimer)
/* 105 */    CALL(sys_getitimer)
        CALL(sys_newstat)
        CALL(sys_newlstat)
        CALL(sys_newfstat)
        CALL(sys_ni_syscall)        /* was sys_uname */
/* 110 */    CALL(sys_ni_syscall)        /* was sys_iopl */
        CALL(sys_vhangup)
        CALL(sys_ni_syscall)
        CALL(OBSOLETE(sys_syscall))    /* call a syscall */
        CALL(sys_wait4)
/* 115 */    CALL(sys_swapoff)
        CALL(sys_sysinfo)
        CALL(OBSOLETE(ABI(sys_ipc, sys_oabi_ipc)))
        CALL(sys_fsync)
        CALL(sys_sigreturn_wrapper)
/* 120 */    CALL(sys_clone_wrapper)
        CALL(sys_setdomainname)
        CALL(sys_newuname)
        CALL(sys_ni_syscall)        /* modify_ldt */
        CALL(sys_adjtimex)
/* 125 */    CALL(sys_mprotect)
        CALL(sys_sigprocmask)
        CALL(sys_ni_syscall)        /* was sys_create_module */
        CALL(sys_init_module)
        CALL(sys_delete_module)
/* 130 */    CALL(sys_ni_syscall)        /* was sys_get_kernel_syms */
        CALL(sys_quotactl)
        CALL(sys_getpgid)
        CALL(sys_fchdir)
        CALL(sys_bdflush)
/* 135 */    CALL(sys_sysfs)
        CALL(sys_personality)
        CALL(sys_ni_syscall)        /* reserved for afs_syscall */
        CALL(sys_setfsuid16)
        CALL(sys_setfsgid16)
/* 140 */    CALL(sys_llseek)
        CALL(sys_getdents)
        CALL(sys_select)
        CALL(sys_flock)
        CALL(sys_msync)
/* 145 */    CALL(sys_readv)
        CALL(sys_writev)
        CALL(sys_getsid)
        CALL(sys_fdatasync)
        CALL(sys_sysctl)
/* 150 */    CALL(sys_mlock)
        CALL(sys_munlock)
        CALL(sys_mlockall)
        CALL(sys_munlockall)
        CALL(sys_sched_setparam)
/* 155 */    CALL(sys_sched_getparam)
        CALL(sys_sched_setscheduler)
        CALL(sys_sched_getscheduler)
        CALL(sys_sched_yield)
        CALL(sys_sched_get_priority_max)
/* 160 */    CALL(sys_sched_get_priority_min)
        CALL(sys_sched_rr_get_interval)
        CALL(sys_nanosleep)
        CALL(sys_mremap)
        CALL(sys_setresuid16)
/* 165 */    CALL(sys_getresuid16)
        CALL(sys_ni_syscall)        /* vm86 */
        CALL(sys_ni_syscall)        /* was sys_query_module */
        CALL(sys_poll)
        CALL(sys_ni_syscall)        /* was nfsservctl */
/* 170 */    CALL(sys_setresgid16)
        CALL(sys_getresgid16)
        CALL(sys_prctl)
        CALL(sys_rt_sigreturn_wrapper)
        CALL(sys_rt_sigaction)
/* 175 */    CALL(sys_rt_sigprocmask)
        CALL(sys_rt_sigpending)
        CALL(sys_rt_sigtimedwait)
        CALL(sys_rt_sigqueueinfo)
        CALL(sys_rt_sigsuspend)
/* 180 */    CALL(ABI(sys_pread64, sys_oabi_pread64))
        CALL(ABI(sys_pwrite64, sys_oabi_pwrite64))
        CALL(sys_chown16)
        CALL(sys_getcwd)
        CALL(sys_capget)
/* 185 */    CALL(sys_capset)
        CALL(sys_sigaltstack_wrapper)
        CALL(sys_sendfile)
        CALL(sys_ni_syscall)        /* getpmsg */
        CALL(sys_ni_syscall)        /* putpmsg */
/* 190 */    CALL(sys_vfork_wrapper)
        CALL(sys_getrlimit)
        CALL(sys_mmap2)
        CALL(ABI(sys_truncate64, sys_oabi_truncate64))
        CALL(ABI(sys_ftruncate64, sys_oabi_ftruncate64))
/* 195 */    CALL(ABI(sys_stat64, sys_oabi_stat64))
        CALL(ABI(sys_lstat64, sys_oabi_lstat64))
        CALL(ABI(sys_fstat64, sys_oabi_fstat64))
        CALL(sys_lchown)
        CALL(sys_getuid)
/* 200 */    CALL(sys_getgid)
        CALL(sys_geteuid)
        CALL(sys_getegid)
        CALL(sys_setreuid)
        CALL(sys_setregid)
/* 205 */    CALL(sys_getgroups)
        CALL(sys_setgroups)
        CALL(sys_fchown)
        CALL(sys_setresuid)
        CALL(sys_getresuid)
/* 210 */    CALL(sys_setresgid)
        CALL(sys_getresgid)
        CALL(sys_chown)
        CALL(sys_setuid)
        CALL(sys_setgid)
/* 215 */    CALL(sys_setfsuid)
        CALL(sys_setfsgid)
        CALL(sys_getdents64)
        CALL(sys_pivot_root)
        CALL(sys_mincore)
/* 220 */    CALL(sys_madvise)
        CALL(ABI(sys_fcntl64, sys_oabi_fcntl64))
        CALL(sys_ni_syscall) /* TUX */
        CALL(sys_ni_syscall)
        CALL(sys_gettid)
/* 225 */    CALL(ABI(sys_readahead, sys_oabi_readahead))
        CALL(sys_setxattr)
        CALL(sys_lsetxattr)
        CALL(sys_fsetxattr)
        CALL(sys_getxattr)
/* 230 */    CALL(sys_lgetxattr)
        CALL(sys_fgetxattr)
        CALL(sys_listxattr)
        CALL(sys_llistxattr)
        CALL(sys_flistxattr)
/* 235 */    CALL(sys_removexattr)
        CALL(sys_lremovexattr)
        CALL(sys_fremovexattr)
        CALL(sys_tkill)
        CALL(sys_sendfile64)
/* 240 */    CALL(sys_futex)
        CALL(sys_sched_setaffinity)
        CALL(sys_sched_getaffinity)
        CALL(sys_io_setup)
        CALL(sys_io_destroy)
/* 245 */    CALL(sys_io_getevents)
        CALL(sys_io_submit)
        CALL(sys_io_cancel)
        CALL(sys_exit_group)
        CALL(sys_lookup_dcookie)
/* 250 */    CALL(sys_epoll_create)
        CALL(ABI(sys_epoll_ctl, sys_oabi_epoll_ctl))
        CALL(ABI(sys_epoll_wait, sys_oabi_epoll_wait))
        CALL(sys_remap_file_pages)
        CALL(sys_ni_syscall)    /* sys_set_thread_area */
/* 255 */    CALL(sys_ni_syscall)    /* sys_get_thread_area */
        CALL(sys_set_tid_address)
        CALL(sys_timer_create)
        CALL(sys_timer_settime)
        CALL(sys_timer_gettime)
/* 260 */    CALL(sys_timer_getoverrun)
        CALL(sys_timer_delete)
        CALL(sys_clock_settime)
        CALL(sys_clock_gettime)
        CALL(sys_clock_getres)
/* 265 */    CALL(sys_clock_nanosleep)
        CALL(sys_statfs64_wrapper)
        CALL(sys_fstatfs64_wrapper)
        CALL(sys_tgkill)
        CALL(sys_utimes)
/* 270 */    CALL(sys_arm_fadvise64_64)
        CALL(sys_pciconfig_iobase)
        CALL(sys_pciconfig_read)
        CALL(sys_pciconfig_write)
        CALL(sys_mq_open)
/* 275 */    CALL(sys_mq_unlink)
        CALL(sys_mq_timedsend)
        CALL(sys_mq_timedreceive)
        CALL(sys_mq_notify)
        CALL(sys_mq_getsetattr)
/* 280 */    CALL(sys_waitid)
        CALL(sys_socket)
        CALL(ABI(sys_bind, sys_oabi_bind))
        CALL(ABI(sys_connect, sys_oabi_connect))
        CALL(sys_listen)
/* 285 */    CALL(sys_accept)
        CALL(sys_getsockname)
        CALL(sys_getpeername)
        CALL(sys_socketpair)
        CALL(sys_send)
/* 290 */    CALL(ABI(sys_sendto, sys_oabi_sendto))
        CALL(sys_recv)
        CALL(sys_recvfrom)
        CALL(sys_shutdown)
        CALL(sys_setsockopt)
/* 295 */    CALL(sys_getsockopt)
        CALL(ABI(sys_sendmsg, sys_oabi_sendmsg))
        CALL(sys_recvmsg)
        CALL(ABI(sys_semop, sys_oabi_semop))
        CALL(sys_semget)
/* 300 */    CALL(sys_semctl)
        CALL(sys_msgsnd)
        CALL(sys_msgrcv)
        CALL(sys_msgget)
        CALL(sys_msgctl)
/* 305 */    CALL(sys_shmat)
        CALL(sys_shmdt)
        CALL(sys_shmget)
        CALL(sys_shmctl)
        CALL(sys_add_key)
/* 310 */    CALL(sys_request_key)
        CALL(sys_keyctl)
        CALL(ABI(sys_semtimedop, sys_oabi_semtimedop))
/* vserver */    CALL(sys_ni_syscall)
        CALL(sys_ioprio_set)
/* 315 */    CALL(sys_ioprio_get)
        CALL(sys_inotify_init)
        CALL(sys_inotify_add_watch)
        CALL(sys_inotify_rm_watch)
        CALL(sys_mbind)
/* 320 */    CALL(sys_get_mempolicy)
        CALL(sys_set_mempolicy)
        CALL(sys_openat)
        CALL(sys_mkdirat)
        CALL(sys_mknodat)
/* 325 */    CALL(sys_fchownat)
        CALL(sys_futimesat)
        CALL(ABI(sys_fstatat64,  sys_oabi_fstatat64))
        CALL(sys_unlinkat)
        CALL(sys_renameat)
/* 330 */    CALL(sys_linkat)
        CALL(sys_symlinkat)
        CALL(sys_readlinkat)
        CALL(sys_fchmodat)
        CALL(sys_faccessat)
/* 335 */    CALL(sys_pselect6)
        CALL(sys_ppoll)
        CALL(sys_unshare)
        CALL(sys_set_robust_list)
        CALL(sys_get_robust_list)
/* 340 */    CALL(sys_splice)
        CALL(sys_sync_file_range2)
        CALL(sys_tee)
        CALL(sys_vmsplice)
        CALL(sys_move_pages)
/* 345 */    CALL(sys_getcpu)
        CALL(sys_epoll_pwait)
        CALL(sys_kexec_load)
        CALL(sys_utimensat)
        CALL(sys_signalfd)
/* 350 */    CALL(sys_timerfd_create)
        CALL(sys_eventfd)
        CALL(sys_fallocate)
        CALL(sys_timerfd_settime)
        CALL(sys_timerfd_gettime)
/* 355 */    CALL(sys_signalfd4)
        CALL(sys_eventfd2)
        CALL(sys_epoll_create1)
        CALL(sys_dup3)
        CALL(sys_pipe2)
/* 360 */    CALL(sys_inotify_init1)
        CALL(sys_preadv)
        CALL(sys_pwritev)
        CALL(sys_rt_tgsigqueueinfo)
        CALL(sys_perf_event_open)
/* 365 */    CALL(sys_recvmmsg)
        CALL(sys_accept4)
        CALL(sys_fanotify_init)
        CALL(sys_fanotify_mark)
        CALL(sys_prlimit64)
/* 370 */    CALL(sys_name_to_handle_at)
        CALL(sys_open_by_handle_at)
        CALL(sys_clock_adjtime)
        CALL(sys_syncfs)
        CALL(sys_sendmmsg)
/* 375 */    CALL(sys_setns)
        CALL(sys_process_vm_readv)
        CALL(sys_process_vm_writev)

就这么几个系统调用函数啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值