内核态和用户态

在intel x86的架构上cpu提供了0到3的权限等级,其中0最高,3最低,在linux中使用了两个等级,分别为0等级内核态,3等级用户态
刚开始时进程处在用户态,但当进程执行一段时间后,可能对系统资源或者硬件设备进行使用则会发生用户态到内核态的转变,因为在内核态下权限等级最高,可以执行任何操作,并在资源使用上没有限制,当然内核中提供了部分接口供用户使用,这些接口就是系统调用,比如malloc printf fork等操作都是通过系统调用实现的(软中断)
当发生系统调用时
1.调用系统调用函数,每一个函数都会生成一个系统调用号,保存在eax寄存器中
2.保护当前现场(程序计数器)
3.触发0x80中断,(条指令的运行会让系统跳转到一个预设的内核空间地址,它指向系统调用处理程序。即system_call函数)执行中断处理程序,通过中断处理程序进入内核态
4.在内核态中获取eax寄存器的值然后差系统调用表,找到该系统调用,执行,最终返回
内核态和用户态
从用户态和内核态之间的转换总结来说有三种情况
1.系统调用(主动)
2.异常事件,比如缺页异常
3.外围设备的中断
系统调用的意义:
一般进程是不能访问内核的,不能随意访问内核空间的值和随意使用系统资源,但在某些特定的情况下要访问内核空间,所有内核就给用户提供了一些接口,通过接口进程可以访问一些资源和硬件设备,这样保证了系统的稳定可靠,避免进程随意执行,惹出大麻烦