中断,异常,系统调用

一、中断分类

  • 硬件中断:来自外部设备(如键盘、鼠标、网络设备等)的信号。
  • 软件中断:程序内部调用的中断,例如通过系统调用触发内核逻辑的执行。
  • 异常(Exceptions):由于程序事件(如除零、无效指令等,缺页)造成的中断,通常会引发错误处理机制。
  • 定时器中断:由系统时钟触发,用于实现任务调度和时间管理。
  • 自定义中断:在特定应用程序或框架中,用户可以定义逻辑事件作为中断处理。


1. 内中断(异常、例外、陷入):
            特点:信号源于CPU内部、与当前执行的指令有关
            种类:陷阱、陷入(trap):有意而为之的异常,如系统调用
            故障(fault):由错误条件引起的,有可能被故障处理程序修复,如缺页
            终止(abort):由不可恢复的致命操作导致的结果,如整数除0
2. 外中断(狭义的中断):
            特点:信号源于CPU外部、与当前执行的指令无关
            种类:I/O中断请求、人工干预

二、中断处理流程

三.中断基本原理

不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号的类型去查询中断向量表(interrupt vector table,IVT),以此来找到相应的中断处理程序在内存中的存放位置。这里的中断向量表,中断向量表 是一种数据结构,它将中断处理程序列表与中断向量表中的中断请求类型列表相关联。中断向量表的每个条目(称为中断向量)都是中断处理程序(interrupt handler,也称为ISR)的地址。

大多数处理器都有一个中断向量表,例如,常见的中断向量表的前几位有:

中断编号IVT 地址中断名称
000-03CPU 除以零, CPU divide by zero
104-07单步调试,Debug single step
208-0B不可屏蔽中断, Non Maskable Interrupt (NMI input on processor)
30C-0F调试断点, Debug breakpoints
.........

四、中断向量表

kernel/linux-5.15.15/arch/x86/entry/entry_64.S

五、系统调用分类

1. 设备管理(Device Management)

设备管理系统调用用于操作和控制各种硬件设备,通常这些系统调用是直接与硬件交互的。

  • ioctl():操作设备,设置和获取设备特定的属性或控制信息。
  • read():从设备文件中读取数据(例如,读取输入设备的内容)。
  • write():向设备文件中写入数据(例如,将数据写入输出设备)。
  • open():打开设备文件以访问特定设备(如 /dev/tty/dev/sda 等)。
  • close():关闭设备文件。

2. 文件管理(File Management)

文件管理系统调用用于管理文件的创建、读取、写入、删除等操作。

  • creat():创建一个新文件。
  • unlink():删除文件。
  • rename():重命名文件。
  • stat():获取文件的状态信息(如文件大小、权限等)。
  • lseek():设置文件读写指针的位置。
  • open():以访问权限打开文件。
  • close():关闭打开的文件。
  • read():从普通文件中读取数据。
  • write():向普通文件中写入数据。

3. 进程控制(Process Control)

进程控制系统调用用于创建、管理和终止进程。

  • fork():创建新进程(子进程)。
  • exec():在当前进程中执行另一个程序(替换当前进程的镜像)。
  • wait():让调用进程等待某个子进程的终止。
  • exit():终止当前进程并返回状态码。
  • kill():发送信号给进程(可用于终止进程)。
  • getpid():获取当前进程的ID。
  • getppid():获取当前进程的父进程ID。
  • setuid():设置进程的有效用户ID。
  • setgid():设置进程的有效组ID。
  • getuid() 和 getgid():获取当前进程的有效用户ID和组ID。

4. 进程通信(Inter-Process Communication, IPC)

进程通信系统调用用于在进程之间传递数据和信息。

  • pipe():创建一个管道用于进程间的通信。
  • msgget()msgsnd()msgrcv():用于消息队列的创建和信息传递。
  • shmget()shmat()shmdt():用于共享内存的创建和管理。
  • semop()semctl():用于信号量的操作,以实现进程间同步。

5. 内存管理(Memory Management)

内存管理系统调用用于动态管理内存的分配和释放。

  • brk():设置过程数据段的结束位置。
  • sbrk():增加或减少进程的堆内存。
  • mmap():将文件或设备映射到内存。
  • munmap():解除对通过 mmap() 映射的内存的映射。
  • mprotect():修改内存区域的访问权限。

6. 信息维护(Information Maintenance)

信息维护系统调用用于获取和设置系统及用户进程的状态和信息。

  • gettimeofday():获取当前的时间和日期。
  • sysinfo():获取系统当前的一般信息(如负载、空闲内存等)。
  • uname():获取当前系统的名称和版本信息

六、系统调用表

系统调用号函数名入口点源码
0readsys_readfs/read_write.c
1writesys_writefs/read_write.c
2opensys_openfs/open.c
3closesys_closefs/open.c
4statsys_newstatfs/stat.c
5fstatsys_newfstatfs/stat.c
6lstatsys_newlstatfs/stat.c
7pollsys_pollfs/select.c
8lseeksys_lseekfs/read_write.c
9mmapsys_mmaparch/x86/kernel/sys_x86_64.c
10mprotectsys_mprotectmm/mprotect.c
11munmapsys_munmapmm/mmap.c
12brksys_brkmm/mmap.c
13rt_sigactionsys_rt_sigactionkernel/signal.c
14rt_sigprocmasksys_rt_sigprocmaskkernel/signal.c
15rt_sigreturnstub_rt_sigreturnarch/x86/kernel/signal.c
16ioctlsys_ioctlfs/ioctl.c
17pread64sys_pread64fs/read_write.c
18pwrite64sys_pwrite64fs/read_write.c
19readvsys_readvfs/read_write.c
20writevsys_writevfs/read_write.c
21accesssys_accessfs/open.c
22pipesys_pipefs/pipe.c
23selectsys_selectfs/select.c
24sched_yieldsys_sched_yieldkernel/sched/core.c
25mremapsys_mremapmm/mmap.c
26msyncsys_msyncmm/msync.c
27mincoresys_mincoremm/mincore.c
28madvisesys_madvisemm/madvise.c
29shmgetsys_shmgetipc/shm.c
30shmatsys_shmatipc/shm.c
31shmctlsys_shmctlipc/shm.c
32dupsys_dupfs/file.c
33dup2sys_dup2fs/file.c
34pausesys_pausekernel/signal.c
35nanosleepsys_nanosleepkernel/hrtimer.c
36getitimersys_getitimerkernel/itimer.c
37alarmsys_alarmkernel/timer.c
38setitimersys_setitimerkernel/itimer.c
39getpidsys_getpidkernel/sys.c
40sendfilesys_sendfile64fs/read_write.c
41socketsys_socketnet/socket.c
42connectsys_connectnet/socket.c
43acceptsys_acceptnet/socket.c
44sendtosys_sendtonet/socket.c
45recvfromsys_recvfromnet/socket.c
46sendmsgsys_sendmsgnet/socket.c
47recvmsgsys_recvmsgnet/socket.c
48shutdownsys_shutdownnet/socket.c
49bindsys_bindnet/socket.c
50listensys_listennet/socket.c
51getsocknamesys_getsocknamenet/socket.c
52getpeernamesys_getpeernamenet/socket.c
53socketpairsys_socketpairnet/socket.c
54setsockoptsys_setsockoptnet/socket.c
55getsockoptsys_getsockoptnet/socket.c
56clonestub_clonekernel/fork.c
57forkstub_forkkernel/fork.c
58vforkstub_vforkkernel/fork.c
59execvestub_execvefs/exec.c
60exitsys_exitkernel/exit.c
61wait4sys_wait4kernel/exit.c
62killsys_killkernel/signal.c
63unamesys_newunamekernel/sys.c
64semgetsys_semgetipc/sem.c
65semopsys_semopipc/sem.c
66semctlsys_semctlipc/sem.c
67shmdtsys_shmdtipc/shm.c
68msggetsys_msggetipc/msg.c
69msgsndsys_msgsndipc/msg.c
70msgrcvsys_msgrcvipc/msg.c
71msgctlsys_msgctlipc/msg.c
72fcntlsys_fcntlfs/fcntl.c
73flocksys_flockfs/locks.c
74fsyncsys_fsyncfs/sync.c
75fdatasyncsys_fdatasyncfs/sync.c
76truncatesys_truncatefs/open.c
77ftruncatesys_ftruncatefs/open.c
78getdentssys_getdentsfs/readdir.c
79getcwdsys_getcwdfs/dcache.c
80chdirsys_chdirfs/open.c
81fchdirsys_fchdirfs/open.c
82renamesys_renamefs/namei.c
83mkdirsys_mkdirfs/namei.c
84rmdirsys_rmdirfs/namei.c
85creatsys_creatfs/open.c
86linksys_linkfs/namei.c
87unlinksys_unlinkfs/namei.c
88symlinksys_symlinkfs/namei.c
89readlinksys_readlinkfs/stat.c
90chmodsys_chmodfs/open.c
91fchmodsys_fchmodfs/open.c
92chownsys_chownfs/open.c
93fchownsys_fchownfs/open.c
94lchownsys_lchownfs/open.c
95umasksys_umaskkernel/sys.c
96gettimeofdaysys_gettimeofdaykernel/time.c
97getrlimitsys_getrlimitkernel/sys.c
98getrusagesys_getrusagekernel/sys.c
99sysinfosys_sysinfokernel/sys.c
100timessys_timeskernel/sys.c
101ptracesys_ptracekernel/ptrace.c
102getuidsys_getuidkernel/sys.c
103syslogsys_syslogkernel/printk/printk.c
104getgidsys_getgidkernel/sys.c
105setuidsys_setuidkernel/sys.c
106setgidsys_setgidkernel/sys.c
107geteuidsys_geteuidkernel/sys.c
108getegidsys_getegidkernel/sys.c
109setpgidsys_setpgidkernel/sys.c
110getppidsys_getppidkernel/sys.c
111getpgrpsys_getpgrpkernel/sys.c
112setsidsys_setsidkernel/sys.c
113setreuidsys_setreuidkernel/sys.c
114setregidsys_setregidkernel/sys.c
115getgroupssys_getgroupskernel/groups.c
116setgroupssys_setgroupskernel/groups.c
117setresuidsys_setresuidkernel/sys.c
118getresuidsys_getresuidkernel/sys.c
119setresgidsys_setresgidkernel/sys.c
120getresgidsys_getresgidkernel/sys.c
121getpgidsys_getpgidkernel/sys.c
122setfsuidsys_setfsuidkernel/sys.c
123setfsgidsys_setfsgidkernel/sys.c
124getsidsys_getsidkernel/sys.c
125capgetsys_capgetkernel/capability.c
126capsetsys_capsetkernel/capability.c
127rt_sigpendingsys_rt_sigpendingkernel/signal.c
128rt_sigtimedwaitsys_rt_sigtimedwaitkernel/signal.c
129rt_sigqueueinfosys_rt_sigqueueinfokernel/signal.c
130rt_sigsuspendsys_rt_sigsuspendkernel/signal.c
131sigaltstacksys_sigaltstackkernel/signal.c
132utimesys_utimefs/utimes.c
133mknodsys_mknodfs/namei.c
134uselibfs/exec.c
135personalitysys_personalitykernel/exec_domain.c
136ustatsys_ustatfs/statfs.c
137statfssys_statfsfs/statfs.c
138fstatfssys_fstatfsfs/statfs.c
139sysfssys_sysfsfs/filesystems.c
140getprioritysys_getprioritykernel/sys.c
141setprioritysys_setprioritykernel/sys.c
142sched_setparamsys_sched_setparamkernel/sched/core.c
143sched_getparamsys_sched_getparamkernel/sched/core.c
144sched_setschedulersys_sched_setschedulerkernel/sched/core.c
145sched_getschedulersys_sched_getschedulerkernel/sched/core.c
146sched_get_priority_maxsys_sched_get_priority_maxkernel/sched/core.c
147sched_get_priority_minsys_sched_get_priority_minkernel/sched/core.c
148sched_rr_get_intervalsys_sched_rr_get_intervalkernel/sched/core.c
149mlocksys_mlockmm/mlock.c
150munlocksys_munlockmm/mlock.c
151mlockallsys_mlockallmm/mlock.c
152munlockallsys_munlockallmm/mlock.c
153vhangupsys_vhangupfs/open.c
154modify_ldtsys_modify_ldtarch/x86/um/ldt.c
155pivot_rootsys_pivot_rootfs/namespace.c
156_sysctlsys_sysctlkernel/sysctl_binary.c
157prctlsys_prctlkernel/sys.c
158arch_prctlsys_arch_prctlarch/x86/um/syscalls_64.c
159adjtimexsys_adjtimexkernel/time.c
160setrlimitsys_setrlimitkernel/sys.c
161chrootsys_chrootfs/open.c
162syncsys_syncfs/sync.c
163acctsys_acctkernel/acct.c
164settimeofdaysys_settimeofdaykernel/time.c
165mountsys_mountfs/namespace.c
166umount2sys_umountfs/namespace.c
167swaponsys_swaponmm/swapfile.c
168swapoffsys_swapoffmm/swapfile.c
169rebootsys_rebootkernel/reboot.c
170sethostnamesys_sethostnamekernel/sys.c
171setdomainnamesys_setdomainnamekernel/sys.c
172ioplstub_ioplarch/x86/kernel/ioport.c
173iopermsys_iopermarch/x86/kernel/ioport.c
174create_moduleNOT IMPLEMENTED
175init_modulesys_init_modulekernel/module.c
176delete_modulesys_delete_modulekernel/module.c
177get_kernel_symsNOT IMPLEMENTED
178query_moduleNOT IMPLEMENTED
179quotactlsys_quotactlfs/quota/quota.c
180nfsservctlNOT IMPLEMENTED
181getpmsgNOT IMPLEMENTED
182putpmsgNOT IMPLEMENTED
183afs_syscallNOT IMPLEMENTED
184tuxcallNOT IMPLEMENTED
185securityNOT IMPLEMENTED
186gettidsys_gettidkernel/sys.c
187readaheadsys_readaheadmm/readahead.c
188setxattrsys_setxattrfs/xattr.c
189lsetxattrsys_lsetxattrfs/xattr.c
190fsetxattrsys_fsetxattrfs/xattr.c
191getxattrsys_getxattrfs/xattr.c
192lgetxattrsys_lgetxattrfs/xattr.c
193fgetxattrsys_fgetxattrfs/xattr.c
194listxattrsys_listxattrfs/xattr.c
195llistxattrsys_llistxattrfs/xattr.c
196flistxattrsys_flistxattrfs/xattr.c
197removexattrsys_removexattrfs/xattr.c
198lremovexattrsys_lremovexattrfs/xattr.c
199fremovexattrsys_fremovexattrfs/xattr.c
200tkillsys_tkillkernel/signal.c
201timesys_timekernel/time.c
202futexsys_futexkernel/futex.c
203sched_setaffinitysys_sched_setaffinitykernel/sched/core.c
204sched_getaffinitysys_sched_getaffinitykernel/sched/core.c
205set_thread_areaarch/x86/kernel/tls.c
206io_setupsys_io_setupfs/aio.c
207io_destroysys_io_destroyfs/aio.c
208io_geteventssys_io_geteventsfs/aio.c
209io_submitsys_io_submitfs/aio.c
210io_cancelsys_io_cancelfs/aio.c
211get_thread_areaarch/x86/kernel/tls.c
212lookup_dcookiesys_lookup_dcookiefs/dcookies.c
213epoll_createsys_epoll_createfs/eventpoll.c
214epoll_ctl_oldNOT IMPLEMENTED
215epoll_wait_oldNOT IMPLEMENTED
216remap_file_pagessys_remap_file_pagesmm/fremap.c
217getdents64sys_getdents64fs/readdir.c
218set_tid_addresssys_set_tid_addresskernel/fork.c
219restart_syscallsys_restart_syscallkernel/signal.c
220semtimedopsys_semtimedopipc/sem.c
221fadvise64sys_fadvise64mm/fadvise.c
222timer_createsys_timer_createkernel/posix-timers.c
223timer_settimesys_timer_settimekernel/posix-timers.c
224timer_gettimesys_timer_gettimekernel/posix-timers.c
225timer_getoverrunsys_timer_getoverrunkernel/posix-timers.c
226timer_deletesys_timer_deletekernel/posix-timers.c
227clock_settimesys_clock_settimekernel/posix-timers.c
228clock_gettimesys_clock_gettimekernel/posix-timers.c
229clock_getressys_clock_getreskernel/posix-timers.c
230clock_nanosleepsys_clock_nanosleepkernel/posix-timers.c
231exit_groupsys_exit_groupkernel/exit.c
232epoll_waitsys_epoll_waitfs/eventpoll.c
233epoll_ctlsys_epoll_ctlfs/eventpoll.c
234tgkillsys_tgkillkernel/signal.c
235utimessys_utimesfs/utimes.c
236vserverNOT IMPLEMENTED
237mbindsys_mbindmm/mempolicy.c
238set_mempolicysys_set_mempolicymm/mempolicy.c
239get_mempolicysys_get_mempolicymm/mempolicy.c
240mq_opensys_mq_openipc/mqueue.c
241mq_unlinksys_mq_unlinkipc/mqueue.c
242mq_timedsendsys_mq_timedsendipc/mqueue.c
243mq_timedreceivesys_mq_timedreceiveipc/mqueue.c
244mq_notifysys_mq_notifyipc/mqueue.c
245mq_getsetattrsys_mq_getsetattripc/mqueue.c
246kexec_loadsys_kexec_loadkernel/kexec.c
247waitidsys_waitidkernel/exit.c
248add_keysys_add_keysecurity/keys/keyctl.c
249request_keysys_request_keysecurity/keys/keyctl.c
250keyctlsys_keyctlsecurity/keys/keyctl.c
251ioprio_setsys_ioprio_setfs/ioprio.c
252ioprio_getsys_ioprio_getfs/ioprio.c
253inotify_initsys_inotify_initfs/notify/inotify/inotify_user.c
254inotify_add_watchsys_inotify_add_watchfs/notify/inotify/inotify_user.c
255inotify_rm_watchsys_inotify_rm_watchfs/notify/inotify/inotify_user.c
256migrate_pagessys_migrate_pagesmm/mempolicy.c
257openatsys_openatfs/open.c
258mkdiratsys_mkdiratfs/namei.c
259mknodatsys_mknodatfs/namei.c
260fchownatsys_fchownatfs/open.c
261futimesatsys_futimesatfs/utimes.c
262newfstatatsys_newfstatatfs/stat.c
263unlinkatsys_unlinkatfs/namei.c
264renameatsys_renameatfs/namei.c
265linkatsys_linkatfs/namei.c
266symlinkatsys_symlinkatfs/namei.c
267readlinkatsys_readlinkatfs/stat.c
268fchmodatsys_fchmodatfs/open.c
269faccessatsys_faccessatfs/open.c
270pselect6sys_pselect6fs/select.c
271ppollsys_ppollfs/select.c
272unsharesys_unsharekernel/fork.c
273set_robust_listsys_set_robust_listkernel/futex.c
274get_robust_listsys_get_robust_listkernel/futex.c
275splicesys_splicefs/splice.c
276teesys_teefs/splice.c
277sync_file_rangesys_sync_file_rangefs/sync.c
278vmsplicesys_vmsplicefs/splice.c
279move_pagessys_move_pagesmm/migrate.c
280utimensatsys_utimensatfs/utimes.c
281epoll_pwaitsys_epoll_pwaitfs/eventpoll.c
282signalfdsys_signalfdfs/signalfd.c
283timerfd_createsys_timerfd_createfs/timerfd.c
284eventfdsys_eventfdfs/eventfd.c
285fallocatesys_fallocatefs/open.c
286timerfd_settimesys_timerfd_settimefs/timerfd.c
287timerfd_gettimesys_timerfd_gettimefs/timerfd.c
288accept4sys_accept4net/socket.c
289signalfd4sys_signalfd4fs/signalfd.c
290eventfd2sys_eventfd2fs/eventfd.c
291epoll_create1sys_epoll_create1fs/eventpoll.c
292dup3sys_dup3fs/file.c
293pipe2sys_pipe2fs/pipe.c
294inotify_init1sys_inotify_init1fs/notify/inotify/inotify_user.c
295preadvsys_preadvfs/read_write.c
296pwritevsys_pwritevfs/read_write.c
297rt_tgsigqueueinfosys_rt_tgsigqueueinfokernel/signal.c
298perf_event_opensys_perf_event_openkernel/events/core.c
299recvmmsgsys_recvmmsgnet/socket.c
300fanotify_initsys_fanotify_initfs/notify/fanotify/fanotify_user.c
301fanotify_marksys_fanotify_markfs/notify/fanotify/fanotify_user.c
302prlimit64sys_prlimit64kernel/sys.c
303name_to_handle_atsys_name_to_handle_atfs/fhandle.c
304open_by_handle_atsys_open_by_handle_atfs/fhandle.c
305clock_adjtimesys_clock_adjtimekernel/posix-timers.c
306syncfssys_syncfsfs/sync.c
307sendmmsgsys_sendmmsgnet/socket.c
308setnssys_setnskernel/nsproxy.c
309getcpusys_getcpukernel/sys.c
310process_vm_readvsys_process_vm_readvmm/process_vm_access.c
311process_vm_writevsys_process_vm_writevmm/process_vm_access.c
312kcmpsys_kcmpkernel/kcmp.c
313finit_modulesys_finit_modulekernel/module.c

参考链接https://blog.csdn.net/weixin_49196365/article/details/114529266?spm=1001.2014.3001.5502

https://www.zhihu.com/question/21440586/answer/3270777380

操作系统 - 清华大学 - 学堂在线 (xuetangx.com)

arm64系统调用分析 - tycoon3 - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值