在文件~/repos/build_all/fp_octeon_56xx/build/linux/fs/rea d_write.c中实现了read系统调用。 首先它调用宏SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)来定义一个带三个参数的系统调用。 让我们来看看这个宏: ~/repos/build_all/fp_octeon_56xx/build/linux/includ e/linux/syscalls.h中定义了它。 #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__) #define SYSCALL_DEFINEx(x, sname, ...) \ __SYSCALL_DEFINEx(x, sname, __VA_ARGS__) #define __SYSCALL_DEFINEx(x, name, ...) \ asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)); d_write.c #define __SC_DECL1(t1, a1) t1 a1 #define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__) #define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__) 最终SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)经过预处理后变成了 asmlinkage long sys_read (unsigned int fd, char __user *buf, size_t count); 也就是说这个函数原型声明在syscalls.h,但是定义和实现在read_write.c 上面已经分析过,系统调用中断处理是从系统调用表中查找到真正入口函数跳转过去的,sys_read自然也会在这个表中。 "~/repos/build_all/fp_octeon_56xx/build/linux/arch/mips/kernel/scall64-64.S 可以找到这个表: .align 3 .type sys_call_table,@object EXPORT(sys_call_table) PTR sys_read /* 5000 */ PTR sys_write PTR sys_open PTR sys_close PTR sys_newstat PTR sys_newfstat /* 5005 */ PTR sys_newlstat PTR sys_poll PTR sys_lseek PTR sys_mips_mmap PTR sys_mprotect /* 5010 */ PTR sys_munmap PTR sys_brk PTR sys_rt_sigaction PTR sys_rt_sigprocmask PTR sys_ioctl /* 5015 */ PTR sys_pread64 PTR sys_pwrite64 PTR sys_readv PTR sys_writev PTR sys_access /* 5020 */ PTR sysm_pipe PTR sys_select PTR sys_sched_yield PTR sys_mremap PTR sys_msync /* 5025 */ PTR sys_mincore PTR sys_madvise PTR sys_shmget PTR sys_shmat PTR sys_shmctl /* 5030 */ PTR sys_dup PTR sys_dup2 PTR sys_pause PTR sys_nanosleep PTR sys_getitimer /* 5035 */ PTR sys_setitimer PTR sys_alarm PTR sys_getpid PTR sys_sendfile64 PTR sys_socket /* 5040 */ PTR sys_connect PTR sys_accept PTR sys_sendto PTR sys_recvfrom PTR sys_sendmsg /* 5045 */ PTR sys_recvmsg PTR sys_shutdown PTR sys_bind PTR sys_listen PTR sys_getsockname /* 5050 */ PTR sys_getpeername PTR sys_socketpair PTR sys_setsockopt PTR sys_getsockopt PTR sys_clone /* 5055 */ PTR sys_fork PTR sys_execve PTR sys_exit PTR sys_wait4 PTR sys_kill /* 5060 */ PTR sys_newuname PTR sys_semget PTR sys_semop PTR sys_semctl PTR sys_shmdt /* 5065 */ PTR sys_msgget PTR sys_msgsnd PTR sys_msgrcv PTR sys_msgctl PTR sys_fcntl /* 5070 */ PTR sys_flock PTR sys_fsync PTR sys_fdatasync PTR sys_truncate PTR sys_ftruncate /* 5075 */ PTR sys_getdents PTR sys_getcwd PTR sys_chdir PTR sys_fchdir PTR sys_rename /* 5080 */ PTR sys_mkdir PTR sys_rmdir PTR sys_creat PTR sys_link PTR sys_unlink /* 5085 */ PTR sys_symlink PTR sys_readlink PTR sys_chmod PTR sys_fchmod PTR sys_chown /* 5090 */ PTR sys_fchown PTR sys_lchown PTR sys_umask PTR sys_gettimeofday PTR sys_getrlimit /* 5095 */ PTR sys_getrusage PTR sys_sysinfo PTR sys_times PTR sys_ptrace PTR sys_getuid /* 5100 */ PTR sys_syslog PTR sys_getgid PTR sys_setuid PTR sys_setgid PTR sys_geteuid /* 5105 */ PTR sys_getegid PTR sys_setpgid PTR sys_getppid PTR sys_getpgrp PTR sys_setsid /* 5110 */ PTR sys_setreuid PTR sys_setregid PTR sys_getgroups PTR sys_setgroups PTR sys_setresuid /* 5115 */ PTR sys_getresuid PTR sys_setresgid PTR sys_getresgid PTR sys_getpgid PTR sys_setfsuid /* 5120 */ PTR sys_setfsgid PTR sys_getsid PTR sys_capget PTR sys_capset PTR sys_rt_sigpending /* 5125 */ PTR sys_rt_sigtimedwait PTR sys_rt_sigqueueinfo PTR sys_rt_sigsuspend PTR sys_sigaltstack PTR sys_utime /* 5130 */ PTR sys_mknod PTR sys_personality PTR sys_ustat PTR sys_statfs PTR sys_fstatfs /* 5135 */ PTR sys_sysfs PTR sys_getpriority PTR sys_setpriority PTR sys_sched_setparam PTR sys_sched_getparam /* 5140 */ PTR sys_sched_setscheduler PTR sys_sched_getscheduler PTR sys_sched_get_priority_max PTR sys_sched_get_priority_min PTR sys_sched_rr_get_interval /* 5145 */ PTR sys_mlock PTR sys_munlock PTR sys_mlockall PTR sys_munlockall PTR sys_vhangup /* 5150 */ PTR sys_pivot_root PTR sys_sysctl PTR sys_prctl PTR sys_adjtimex PTR sys_setrlimit /* 5155 */ PTR sys_chroot PTR sys_sync PTR sys_acct PTR sys_settimeofday PTR sys_mount /* 5160 */ PTR sys_umount PTR sys_swapon PTR sys_swapoff PTR sys_reboot PTR sys_sethostname /* 5165 */ PTR sys_setdomainname PTR sys_ni_syscall /* was create_module */ PTR sys_init_module PTR sys_delete_module PTR sys_ni_syscall /* 5170, was get_kernel_syms */ PTR sys_ni_syscall /* was query_module */ PTR sys_quotactl PTR sys_nfsservctl PTR sys_ni_syscall /* res. for getpmsg */ PTR sys_ni_syscall /* 5175 for putpmsg */ PTR sys_ni_syscall /* res. for afs_syscall */ PTR sys_ni_syscall /* res. for security */ PTR sys_gettid PTR sys_readahead PTR sys_setxattr /* 5180 */ PTR sys_lsetxattr PTR sys_fsetxattr PTR sys_getxattr PTR sys_lgetxattr PTR sys_fgetxattr /* 5185 */ PTR sys_listxattr PTR sys_llistxattr PTR sys_flistxattr PTR sys_removexattr PTR sys_lremovexattr /* 5190 */ PTR sys_fremovexattr PTR sys_tkill PTR sys_ni_syscall PTR sys_futex PTR sys_sched_setaffinity /* 5195 */ PTR sys_sched_getaffinity PTR sys_cacheflush PTR sys_cachectl PTR sys_sysmips PTR sys_io_setup /* 5200 */ PTR sys_io_destroy PTR sys_io_getevents PTR sys_io_submit PTR sys_io_cancel PTR sys_exit_group /* 5205 */ PTR sys_lookup_dcookie PTR sys_epoll_create PTR sys_epoll_ctl PTR sys_epoll_wait PTR sys_remap_file_pages /* 5210 */ PTR sys_rt_sigreturn PTR sys_set_tid_address PTR sys_restart_syscall PTR sys_semtimedop PTR sys_fadvise64_64 /* 5215 */ PTR sys_timer_create PTR sys_timer_settime PTR sys_timer_gettime PTR sys_timer_getoverrun PTR sys_timer_delete /* 5220 */ PTR sys_clock_settime PTR sys_clock_gettime PTR sys_clock_getres PTR sys_clock_nanosleep PTR sys_tgkill /* 5225 */ PTR sys_utimes PTR sys_mbind PTR sys_ni_syscall /* sys_get_mempolicy */ PTR sys_ni_syscall /* sys_set_mempolicy */ PTR sys_mq_open /* 5230 */ PTR sys_mq_unlink PTR sys_mq_timedsend PTR sys_mq_timedreceive PTR sys_mq_notify PTR sys_mq_getsetattr /* 5235 */ PTR sys_ni_syscall /* sys_vserver */ PTR sys_waitid PTR sys_ni_syscall /* available, was setaltroot */ PTR sys_add_key PTR sys_request_key /* 5240 */ PTR sys_keyctl PTR sys_set_thread_area PTR sys_inotify_init PTR sys_inotify_add_watch PTR sys_inotify_rm_watch /* 5245 */ PTR sys_migrate_pages PTR sys_openat PTR sys_mkdirat PTR sys_mknodat PTR sys_fchownat /* 5250 */ PTR sys_futimesat PTR sys_newfstatat PTR sys_unlinkat PTR sys_renameat PTR sys_linkat /* 5255 */ PTR sys_symlinkat PTR sys_readlinkat PTR sys_fchmodat PTR sys_faccessat PTR sys_pselect6 /* 5260 */ PTR sys_ppoll PTR sys_unshare PTR sys_splice PTR sys_sync_file_range PTR sys_tee /* 5265 */ PTR sys_vmsplice PTR sys_move_pages PTR sys_set_robust_list PTR sys_get_robust_list PTR sys_kexec_load /* 5270 */ PTR sys_getcpu PTR sys_epoll_pwait PTR sys_ioprio_set PTR sys_ioprio_get PTR sys_utimensat /* 5275 */ PTR sys_signalfd PTR sys_ni_syscall PTR sys_eventfd PTR sys_fallocate PTR sys_timerfd_create /* 5280 */ PTR sys_timerfd_gettime PTR sys_timerfd_settime PTR sys_signalfd4 PTR sys_eventfd2 PTR sys_epoll_create1 /* 5285 */ PTR sys_dup3 PTR sys_pipe2 PTR sys_inotify_init1 PTR sys_preadv PTR sys_pwritev /* 5390 */ PTR sys_rt_tgsigqueueinfo PTR sys_perf_event_open PTR sys_accept4 PTR sys_recvmmsg .size sys_call_table,.-sys_call_table 最后要提供给应用程序使用read这个系统调用,所以在unistd.h里提供了系统调用号和系统调用的原型。 #define __NR_read 64 __SYSCALL(__NR_read, sys_read)