用户态切换到内核态的过程

https://www.tldp.org/HOWTO/KernelAnalysis-HOWTO-3.html

1. When do we switch?

Once we understand that there are 2 different modes, we have to know when we switch from one to the other.

Typically, there are 2 points of switching:

  • When calling a System Call: after calling a System Call, the task voluntary calls pieces of code living in Kernel Mode
  • When an IRQ (or exception) comes: after the IRQ an IRQ handler (or exception handler) is called, then control returns back to the task that was interrupted like nothing was happened.

2. System Calls

System calls are like special functions that manage OS routines which live in Kernel Mode.

A system call can be called when we:

  • access an I/O device or a file (like read or write)
  • need to access privileged information (like pid, changing scheduling policy or other information)
  • need to change execution context (like forking or executing some other application)
  • need to execute a particular command (like ‘‘chdir’’, ''kill", ‘‘brk’’, or ‘‘signal’’)
    Unix System Calls Working

System calls are almost the only interface used by User Mode to talk with low level resources (hardware). The only exception to this statement is when a process uses ‘‘ioperm’’ system call. In this case a device can be accessed directly by User Mode process (IRQs cannot be used).

NOTE: Not every ‘‘C’’ function is a system call, only some of them.

Below is a list of System Calls under Linux Kernel 2.4.17, from [ arch/i386/kernel/entry.S ]

    .long SYMBOL_NAME(sys_ni_syscall)       /* 0  -  old "setup()" system call*/
    .long SYMBOL_NAME(sys_exit)
    .long SYMBOL_NAME(sys_fork)
    .long SYMBOL_NAME(sys_read)
    .long SYMBOL_NAME(sys_write)
    .long SYMBOL_NAME(sys_open)             /* 5 */
    .long SYMBOL_NAME(sys_close)
    .long SYMBOL_NAME(sys_waitpid)
    .long SYMBOL_NAME(sys_creat)
    .long SYMBOL_NAME(sys_link)
    .long SYMBOL_NAME(sys_unlink)           /* 10 */
    .long SYMBOL_NAME(sys_execve)
    .long SYMBOL_NAME(sys_chdir)
    .long SYMBOL_NAME(sys_time)
    .long SYMBOL_NAME(sys_mknod)
    .long SYMBOL_NAME(sys_chmod)            /* 15 */
    .long SYMBOL_NAME(sys_lchown16)
    .long SYMBOL_NAME(sys_ni_syscall)                               /* old break syscall holder */
    .long SYMBOL_NAME(sys_stat)
    .long SYMBOL_NAME(sys_lseek)
    .long SYMBOL_NAME(sys_getpid)           /* 20 */
    .long SYMBOL_NAME(sys_mount)
    .long SYMBOL_NAME(sys_oldumount)
    .long SYMBOL_NAME(sys_setuid16)
    .long SYMBOL_NAME(sys_getuid16)
    .long SYMBOL_NAME(sys_stime)            /* 25 */
    .long SYMBOL_NAME(sys_ptrace)
    .long SYMBOL_NAME(sys_alarm)
    .long SYMBOL_NAME(sys_fstat)
    .long SYMBOL_NAME(sys_pause)
    .long SYMBOL_NAME(sys_utime)            /* 30 */
    .long SYMBOL_NAME(sys_ni_syscall)                               /* old stty syscall holder */
    .long SYMBOL_NAME(sys_ni_syscall)                               /* old gtty syscall holder */
    .long SYMBOL_NAME(sys_access)
    .long SYMBOL_NAME(sys_nice)
    .long SYMBOL_NAME(sys_ni_syscall)       /* 35 */                /* old ftime syscall holder */
    .long SYMBOL_NAME(sys_sync)
    .long SYMBOL_NAME(sys_kill)
    .long SYMBOL_NAME(sys_rename)
    .long SYMBOL_NAME(sys_mkdir)
    .long SYMBOL_NAME(sys_rmdir)            /* 40 */
    .long SYMBOL_NAME(sys_dup)
    .long SYMBOL_NAME(sys_pipe)
    .long SYMBOL_NAME(sys_times)
    .long SYMBOL_NAME(sys_ni_syscall)                               /* old prof syscall holder */
    .long SYMBOL_NAME(sys_brk)              /* 45 */
    .long SYMBOL_NAME(sys_setgid16)
    .long SYMBOL_NAME(sys_getgid16)
    .long SYMBOL_NAME(sys_signal)
    .long SYMBOL_NAME(sys_geteuid16)
    .long SYMBOL_NAME(sys_getegid16)        /* 50 */
    .long SYMBOL_NAME(sys_acct)
    .long SYMBOL_NAME(sys_umount)                                   /* recycled never used phys() */
    .long SYMBOL_NAME(sys_ni_syscall)                               /* old lock syscall holder */
    .long SYMBOL_NAME(sys_ioctl)
    .long SYMBOL_NAME(sys_fcntl)            /* 55 */
    .long SYMBOL_NAME(sys_ni_syscall)                               /* old mpx syscall holder */
    .long SYMBOL_NAME(sys_setpgid)
    .long SYMBOL_NAME(sys_ni_syscall)                               /* old ulimit syscall holder */
    .long SYMBOL_NAME(sys_olduname)
    .long SYMBOL_NAME(sys_umask)            /* 60 */
    .long SYMBOL_NAME(sys_chroot)
    .long SYMBOL_NAME(sys_ustat)
    .long SYMBOL_NAME(sys_dup2)
    .long SYMBOL_NAME(sys_getppid)
    .long SYMBOL_NAME(sys_getpgrp)          /* 65 */
    .long SYMBOL_NAME(sys_setsid)
    .long SYMBOL_NAME(sys_sigaction)
    .long SYMBOL_NAME(sys_sgetmask)
    .long SYMBOL_NAME(sys_ssetmask)
    .long SYMBOL_NAME(sys_setreuid16)       /* 70 */
    .long SYMBOL_NAME(sys_setregid16)
    .long SYMBOL_NAME(sys_sigsuspend)
    .long SYMBOL_NAME(sys_sigpending)
    .long SYMBOL_NAME(sys_sethostname)
    .long SYMBOL_NAME(sys_setrlimit)        /* 75 */
    .long SYMBOL_NAME(sys_old_getrlimit)
    .long SYMBOL_NAME(sys_getrusage)
    .long SYMBOL_NAME(sys_gettimeofday)
    .long SYMBOL_NAME(sys_settimeofday)
    .long SYMBOL_NAME(sys_getgroups16)      /* 80 */
    .long SYMBOL_NAME(sys_setgroups16)
    .long SYMBOL_NAME(old_select)
    .long SYMBOL_NAME(sys_symlink)
    .long SYMBOL_NAME(sys_lstat)
    .long SYMBOL_NAME(sys_readlink)         /* 85 */
    .long SYMBOL_NAME(sys_uselib)
    .long SYMBOL_NAME(sys_swapon)
    .long SYMBOL_NAME(sys_reboot)
    .long SYMBOL_NAME(old_readdir)
    .long SYMBOL_NAME(old_mmap)             /* 90 */
    .long SYMBOL_NAME(sys_munmap)
    .long SYMBOL_NAME(sys_truncate)
    .long SYMBOL_NAME(sys_ftruncate)
    .long SYMBOL_NAME(sys_fchmod)
    .long SYMBOL_NAME(sys_fchown16)         /* 95 */
    .long SYMBOL_NAME(sys_getpriority)
    .long SYMBOL_NAME(sys_setpriority)
    .long SYMBOL_NAME(sys_ni_syscall)                               /* old profil syscall holder */
    .long SYMBOL_NAME(sys_statfs)
    .long SYMBOL_NAME(sys_fstatfs)          /* 100 */
    .long SYMBOL_NAME(sys_ioperm)
    .long SYMBOL_NAME(sys_socketcall)
    .long SYMBOL_NAME(sys_syslog)
    .long SYMBOL_NAME(sys_setitimer)
    .long SYMBOL_NAME(sys_getitimer)        /* 105 */
    .long SYMBOL_NAME(sys_newstat)
    .long SYMBOL_NAME(sys_newlstat)
    .long SYMBOL_NAME(sys_newfstat)
    .long SYMBOL_NAME(sys_uname)
    .long SYMBOL_NAME(sys_iopl)             /* 110 */
    .long SYMBOL_NAME(sys_vhangup)
    .long SYMBOL_NAME(sys_ni_syscall)       /* old "idle" system call */
    .long SYMBOL_NAME(sys_vm86old)
    .long SYMBOL_NAME(sys_wait4)
    .long SYMBOL_NAME(sys_swapoff)          /* 115 */
    .long SYMBOL_NAME(sys_sysinfo)
    .long SYMBOL_NAME(sys_ipc)
    .long SYMBOL_NAME(sys_fsync)
    .long SYMBOL_NAME(sys_sigreturn)
    .long SYMBOL_NAME(sys_clone)            /* 120 */
    .long SYMBOL_NAME(sys_setdomainname)
    .long SYMBOL_NAME(sys_newuname)
    .long SYMBOL_NAME(sys_modify_ldt)
    .long SYMBOL_NAME(sys_adjtimex)
    .long SYMBOL_NAME(sys_mprotect)         /* 125 */
    .long SYMBOL_NAME(sys_sigprocmask)
    .long SYMBOL_NAME(sys_create_module)
    .long SYMBOL_NAME(sys_init_module)
    .long SYMBOL_NAME(sys_delete_module)
    .long SYMBOL_NAME(sys_get_kernel_syms)  /* 130 */
    .long SYMBOL_NAME(sys_quotactl)
    .long SYMBOL_NAME(sys_getpgid)
    .long SYMBOL_NAME(sys_fchdir)
    .long SYMBOL_NAME(sys_bdflush)
    .long SYMBOL_NAME(sys_sysfs)            /* 135 */
    .long SYMBOL_NAME(sys_personality)
    .long SYMBOL_NAME(sys_ni_syscall)       /* for afs_syscall */
    .long SYMBOL_NAME(sys_setfsuid16)
    .long SYMBOL_NAME(sys_setfsgid16)
    .long SYMBOL_NAME(sys_llseek)           /* 140 */
    .long SYMBOL_NAME(sys_getdents)
    .long SYMBOL_NAME(sys_select)
    .long SYMBOL_NAME(sys_flock)
    .long SYMBOL_NAME(sys_msync)
    .long SYMBOL_NAME(sys_readv)            /* 145 */
    .long SYMBOL_NAME(sys_writev)
    .long SYMBOL_NAME(sys_getsid)
    .long SYMBOL_NAME(sys_fdatasync)
    .long SYMBOL_NAME(sys_sysctl)
    .long SYMBOL_NAME(sys_mlock)            /* 150 */
    .long SYMBOL_NAME(sys_munlock)
    .long SYMBOL_NAME(sys_mlockall)
    .long SYMBOL_NAME(sys_munlockall)
    .long SYMBOL_NAME(sys_sched_setparam)
    .long SYMBOL_NAME(sys_sched_getparam)   /* 155 */
    .long SYMBOL_NAME(sys_sched_setscheduler)
    .long SYMBOL_NAME(sys_sched_getscheduler)
    .long SYMBOL_NAME(sys_sched_yield)
    .long SYMBOL_NAME(sys_sched_get_priority_max)
    .long SYMBOL_NAME(sys_sched_get_priority_min)  /* 160 */
    .long SYMBOL_NAME(sys_sched_rr_get_interval)
    .long SYMBOL_NAME(sys_nanosleep)
    .long SYMBOL_NAME(sys_mremap)
    .long SYMBOL_NAME(sys_setresuid16)
    .long SYMBOL_NAME(sys_getresuid16)      /* 165 */
    .long SYMBOL_NAME(sys_vm86)
    .long SYMBOL_NAME(sys_query_module)
    .long SYMBOL_NAME(sys_poll)
    .long SYMBOL_NAME(sys_nfsservctl)
    .long SYMBOL_NAME(sys_setresgid16)      /* 170 */
    .long SYMBOL_NAME(sys_getresgid16)
    .long SYMBOL_NAME(sys_prctl)
    .long SYMBOL_NAME(sys_rt_sigreturn)
    .long SYMBOL_NAME(sys_rt_sigaction)
    .long SYMBOL_NAME(sys_rt_sigprocmask)   /* 175 */
    .long SYMBOL_NAME(sys_rt_sigpending)
    .long SYMBOL_NAME(sys_rt_sigtimedwait)
    .long SYMBOL_NAME(sys_rt_sigqueueinfo)
    .long SYMBOL_NAME(sys_rt_sigsuspend)
    .long SYMBOL_NAME(sys_pread)            /* 180 */
    .long SYMBOL_NAME(sys_pwrite)
    .long SYMBOL_NAME(sys_chown16)
    .long SYMBOL_NAME(sys_getcwd)
    .long SYMBOL_NAME(sys_capget)
    .long SYMBOL_NAME(sys_capset)           /* 185 */
    .long SYMBOL_NAME(sys_sigaltstack)
    .long SYMBOL_NAME(sys_sendfile)
    .long SYMBOL_NAME(sys_ni_syscall)               /* streams1 */
    .long SYMBOL_NAME(sys_ni_syscall)               /* streams2 */
    .long SYMBOL_NAME(sys_vfork)            /* 190 */
    .long SYMBOL_NAME(sys_getrlimit)
    .long SYMBOL_NAME(sys_mmap2)
    .long SYMBOL_NAME(sys_truncate64)
    .long SYMBOL_NAME(sys_ftruncate64)
    .long SYMBOL_NAME(sys_stat64)           /* 195 */
    .long SYMBOL_NAME(sys_lstat64)
    .long SYMBOL_NAME(sys_fstat64)
    .long SYMBOL_NAME(sys_lchown)
    .long SYMBOL_NAME(sys_getuid)
    .long SYMBOL_NAME(sys_getgid)           /* 200 */
    .long SYMBOL_NAME(sys_geteuid)
    .long SYMBOL_NAME(sys_getegid)
    .long SYMBOL_NAME(sys_setreuid)
    .long SYMBOL_NAME(sys_setregid)
    .long SYMBOL_NAME(sys_getgroups)        /* 205 */
    .long SYMBOL_NAME(sys_setgroups)
    .long SYMBOL_NAME(sys_fchown)
    .long SYMBOL_NAME(sys_setresuid)
    .long SYMBOL_NAME(sys_getresuid)
    .long SYMBOL_NAME(sys_setresgid)        /* 210 */
    .long SYMBOL_NAME(sys_getresgid)
    .long SYMBOL_NAME(sys_chown)
    .long SYMBOL_NAME(sys_setuid)
    .long SYMBOL_NAME(sys_setgid)
    .long SYMBOL_NAME(sys_setfsuid)         /* 215 */
    .long SYMBOL_NAME(sys_setfsgid)
    .long SYMBOL_NAME(sys_pivot_root)
    .long SYMBOL_NAME(sys_mincore)
    .long SYMBOL_NAME(sys_madvise)
    .long SYMBOL_NAME(sys_getdents64)       /* 220 */
    .long SYMBOL_NAME(sys_fcntl64)
    .long SYMBOL_NAME(sys_ni_syscall)       /* reserved for TUX */
    .long SYMBOL_NAME(sys_ni_syscall)       /* Reserved for Security */
    .long SYMBOL_NAME(sys_gettid)
    .long SYMBOL_NAME(sys_readahead)        /* 225 */

3. IRQ Event

When an IRQ comes, the task that is running is interrupted in order to service the IRQ Handler.

After the IRQ is handled, control returns backs exactly to point of interrupt, like nothing happened.

在这里插入图片描述

The numbered steps below refer to the sequence of events in the diagram above:

  • Process is executing
  • IRQ comes while the task is running.
  • Task is interrupted to call an “Interrupt handler”.
  • The “Interrupt handler” code is executed.
  • Control returns back to task user mode (as if nothing happened)
    Process returns back to normal execution

Special interest has the Timer IRQ, coming every TIMER ms to manage:

  • Alarms
  • System and task counters (used by schedule to decide when stop a process or for accounting)
  • Multitasking based on wake up mechanism after TIMESLICE time.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值