用户态与内核态
用户态与内核态1、背景
当我们在写程序是,但凡涉及到IO读写、内存分配等硬件资源的操作时,常常不能直接操作,而是通过一种叫系统调用的过程,让程序身陷到内核态运行,之后内核态的CPU执行有关硬件资源操作指令,得到相关的硬件资源后在返回到用户态继续执行,之间还要进行一系列的数据传输。
假定没有这些内核态和用户态之分,程序随随大便才能访问硬件资源,例如说分配显存,程序能随便的读写所有的显存空间linux内核开发,假如程序员一不留神将不适当的内容讲到了不该写的地方,就很可能造成系统崩溃。
为何要有用户态和内核态?
因为须要限制不同的程序之间的访问能力,避免她们获取别的程序的显存数据,或则获取外围设备的数据,并发送到网路,CPU界定出两个权限等级–用户态和内核态。
2、定义
系统调用将Linux整个体系分为用户态和内核态(或则说内核空间和用户空间),
1、内核:本质上看是一种软件——控制计算机的硬件资源sogou pinyin linux,并提供下层应用程序运行的环境。
2、用户态:下层应用程序的活动空间linux内核开发,只能受限的访问显存,且不容许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。
具体说明
从这个图上可以更进一步对内核所做的事有一个“全景式”的印象。主要表现为:向上控制硬件资源,向内管理操作系统资源:包括进程的调度和管理、内存的管理、文件系统的管理、设备驱动程序的管理以及网路资源的管理,向下则向应用程序提供系统调用的插口。从整体上来看,整个操作系统分为两层:用户态和内核态,这些分层的构架极大地提升了资源管理的可扩充性和灵活性,但是便捷用户对资源的调用和集中式的管理,带来一定的安全性。
3、用户态访问内核态资源的方法
用户态的应用程序可以通过三种方法来访问内核态的资源:
3.1、系统调用
我们可以把系统调用看成是一种不能再通分的操作(类似于原子操作,而且不同概念),有人把它称作一个汉字的一个“笔画”,而一个“汉字”就代表一个下层应用,为此,有时侯假如要实现一个完整的汉字(给某个变量分配显存空间),就必须调用好多的系统调用。
3.2、库函数
库函数就是屏蔽那些复杂的底层实现细节,减少程序员的负担,因而愈加关注下层的逻辑实现。它对系统调用进行封装,提供简单的基本插口给用户,这样提高了程序的灵活性,其实对于简单的插口,也可以直接使用系统调用访问资源linux伊甸园论坛,比如:open(),write(),read()等等。库函数依据不同的标准也有不同的版本,比如:glibc库,posix库等。
接着里面的系统调用继续说:
3.3、Shell脚本
Shell是一个特殊的应用程序,也称命令行,本质上是一个命令类库,它下通系统调用,上通各类应用,一般充当着一种“胶水”的角色,来联接各个小功能程序,让不同程序才能以一个清晰的插口协同工作,因而提高各个程序的功能。
Shell是怎样联接用户和内核的?
shell才能接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,例如输出到显示器、写入到文件等,这就是大部份读者对Shell的认知。
你看,我始终都在使用Shell,哪有使用内核哦?我也没有看见Shell将我和内核联接上去呀?
虽然,Shell程序本身的功能是很弱的,例如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部份情况下Shell就会去调用内核曝露下来的插口,这就是在使用内核,只是这个过程被Shell隐藏了上去,它自己在背后默默进行,我们看不到而已。
插口虽然就是一个一个的函数,使用内核就是调用那些函数。这就是使用内核的全部内容了吗?嗯,是的!不仅函数,你没有别的途径使用内核。
4、用户态到内核态如何切换?
从用户态到内核态切换可以通过三种形式:
注意:
参考
1、
2、
3、