Ubuntu和centos这两个都是linux发行版,也就是在linux上包了一层壳(内核都是linux
),在发行版上安装的应用(如mysql,redis)无法直接与计算机硬件交互,这些应用需要先访问内核,然后基于内核操作计算机硬件(CPU,内存,网卡)
不能让用户应用随意的去操作各种计算机硬件资源,造成内核崩溃

用户应用只能执行受限的指令,不能直接操控计算机硬件(需要通过内核提供的接口来间接操控),用户态只能访问用户空间这块内存区域
内核应用可以执行特权指令,可以直接操控计算机硬件,内核态程序可以访问内核空间这块内存区域
进程可以在内核态和用户态之间进行切换

系统调用,中断,异常可以使用户态变成内核态
(1)用户态线程通过执行系统调用指令变成内核态,就可以执行位于内核地址内存空间的系统调用函数了
(2)异常就是执行代码时出错了,比如除0异常
(3)中断:键盘按键被按下,鼠标被移动或者点击,网络中有数据发送过来
特权指令:具有特殊权限的指令,比如清内存,重置时钟,分配系统资源,修改用户的访问权限
由于这类指令的权限最大,所以使用不当会导致整个系统崩溃
系统调用:是操作系统提供给应用程序的接口(供应用程序调用的特殊函数),应用程序使用系统调用来获得操作系统的服务
运行的用户程序,想要操控内核态级别的资源(比如文件管理,进程控制,内存管理),需要通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成,要记住的是用户程序执行系统调用
用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取
内核态:可以访问内存所有数据,而且可以访问外围设备(硬盘,网卡),cpu也可以将自己从一个程序切换到另一个程序
内核态和用户态的区别就是权限不同,内核态处于权限0,权限较高,用户态处于权限3,权限较低
从用户态切换到内核态的方法:
(1)系统调用:
进程调用:exit,fork()
文件系统访问:chmod,chown
设备调用:read,write
信息读取:读取设备信息
通信:mmap,pipe
(2)中断:外围设备的终端,硬盘读写操作完成后,会向cpu发出中断信号,这时cpu会暂停执行下一条将要执行的指令,转而去执行与中断信号对应的处理程序,这个程序时内核态程序,所以也会由用户态转为内核态
(3)异常:cpu在执行用户态下的程序时,发生了某些事先不可知的异常,这时会触发当前运行的进程切换到处理此异常的内核相关程序,也就转到了内核态,比如缺页异常,除零异常
应用程序在运行的时候,可能会涉及到一些硬件资源的调用,这个时候需要借助内核来操控硬件,应用程序通过系统调用可以调用内核的一些函数
用户态程序执行系统调用,cpu切换到内核态,系统调用执行完,cpu回到用户态

3871

被折叠的 条评论
为什么被折叠?



