首页 > 系统相关 >【转】Linux探秘之用户态与内核态

【转】Linux探秘之用户态与内核态

时间:2023-12-06 17:25:28浏览次数:28  
标签:Shell 系统 用户 调用 内核 Linux 探秘

一、 Unix/Linux的体系架构

                                                                

如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接口:即系统调用。

  系统调用是操作系统的最小功能单位,这些系统调用根据不同的应用场景可以进行扩展和裁剪,现在各种版本的Unix实现都提供了不同数量的系统调用,如Linux的不同版本提供了240-260个系统调用,FreeBSD大约提供了320个(reference:UNIX环境高级编程)。我们可以把系统调用看成是一种不能再化简的操作(类似于原子操作,但是不同概念),有人把它比作一个汉字的一个“笔画”,而一个“汉字”就代表一个上层应用,我觉得这个比喻非常贴切。因此,有时候如果要实现一个完整的汉字(给某个变量分配内存空间),就必须调用很多的系统调用。如果从实现者(程序员)的角度来看,这势必会加重程序员的负担,良好的程序设计方法是:重视上层的业务逻辑操作,而尽可能避免底层复杂的实现细节。库函数正是为了将程序员从复杂的细节中解脱出来而提出的一种有效方法。它实现对系统调用的封装,将简单的业务逻辑接口呈现给用户,方便用户调用,从这个角度上看,库函数就像是组成汉字的“偏旁”。这样的一种组成方式极大增强了程序设计的灵活性,对于简单的操作,我们可以直接调用系统调用来访问资源,如“人”,对于复杂操作,我们借助于库函数来实现,如“仁”。显然,这样的库函数依据不同的标准也可以有不同的实现版本,如ISO C 标准库,POSIX标准库等。

  Shell是一个特殊的应用程序,俗称命令行,本质上是一个命令解释器,它下通系统调用,上通各种应用,通常充当着一种“胶水”的角色,来连接各个小功能程序,让不同程序能够以一个清晰的接口协同工作,从而增强各个程序的功能。同时,Shell是可编程的,它可以执行符合Shell语法的文本,这样的文本称为Shell脚本,通常短短的几行Shell脚本就可以实现一个非常大的功能,原因就是这些Shell语句通常都对系统调用做了一层封装。为了方便用户和系统交互,一般,一个Shell对应一个终端,终端是一个硬件设备,呈现给用户的是一个图形化窗口。我们可以通过这个窗口输入或者输出文本。这个文本直接传递给shell进行分析解释,然后执行。

总结一下,用户态的应用程序可以通过三种方式来访问内核态的资源:

1)系统调用

2)库函数

3)Shell脚本

下图是对上图的一个细分结构,从这个图上可以更进一步对内核所做的事有一个“全景式”的印象。主要表现为:向下控制硬件资源,向内管理操作系统资源:包括进程的调度和管理、内存的管理、文件系统的管理、设备驱动程序的管理以及网络资源的管理,向上则向应用程序提供系统调用的接口。从整体上来看,整个操作系统分为两层:用户态和内核态,这种分层的架构极大地提高了资源管理的可扩展性和灵活性,而且方便用户对资源的调用和集中式的管理,带来一定的安全性。

二、用户态和内核态的切换

 因为操作系统的资源是有限的,如果访问资源的操作过多,必然会消耗过多的资源,而且如果不对这些操作加以区分,很可能造成资源访问的冲突。所以,为了减少有限资源的访问和使用冲突,Unix/Linux的设计哲学之一就是:对不同的操作赋予不同的执行等级,就是所谓特权的概念。简单说就是有多大能力做多大的事,与系统相关的一些特别关键的操作必须由最高特权的程序来完成。Intel的X86架构的CPU提供了0到3四个特权级,数字越小,特权越高,Linux操作系统中主要采用了0和3两个特权级,分别对应的就是内核态和用户态。运行于用户态的进程可以执行的操作和访问的资源都会受到极大的限制,而运行在内核态的进程则可以执行任何操作并且在资源的使用上没有限制。很多程序开始时运行于用户态,但在执行的过程中,一些操作需要在内核权限下才能执行,这就涉及到一个从用户态切换到内核态的过程。比如C函数库中的内存分配函数malloc(),它具体是使用sbrk()系统调用来分配内存,当malloc调用sbrk()的时候就涉及一次从用户态到内核态的切换,类似的函数还有printf(),调用的是wirte()系统调用来输出字符串,等等。

                                                                                    

到底在什么情况下会发生从用户态到内核态的切换,一般存在以下三种情况:

1)当然就是系统调用:原因如上的分析。

2)异常事件: 当CPU正在执行运行在用户态的程序时,突然发生某些预先不可知的异常事件,这个时候就会触发从当前用户态执行的进程转向内核态执行相关的异常事件,典型的如缺页异常。

3)外围设备的中断:当外围设备完成用户的请求操作后,会像CPU发出中断信号,此时,CPU就会暂停执行下一条即将要执行的指令,转而去执行中断信号对应的处理程序,如果先前执行的指令是在用户态下,则自然就发生从用户态到内核态的转换。

注意:系统调用的本质其实也是中断,相对于外围设备的硬中断,这种中断称为软中断,这是操作系统为用户特别开放的一种中断,如Linux int 80h中断。所以,从触发方式和效果上来看,这三种切换方式是完全一样的,都相当于是执行了一个中断响应的过程。但是从触发的对象来看,系统调用是进程主动请求切换的,而异常和硬中断则是被动的。

三、总结

本文仅是从宏观的角度去理解Linux用户态和内核态的设计,并没有去深究它们的具体实现方式。从实现上来看,必须要考虑到的一点我想就是性能问题,因为用户态和内核态之间的切换也会消耗大量资源。关于实现的细节,目前学艺不精不敢乱说,等日后补上。但知道了这一点,我相信对很多问题也就很容易理解了,比如说基于缓冲区的IO和无缓冲的IO,用户进程和内核进程之间的切换,IO复用中的读写内核事件表,等等,这些知识之后会一一补上。

转载地址:https://www.cnblogs.com/bakari/p/5520860.html

标签:Shell,系统,用户,调用,内核,Linux,探秘
From: https://www.cnblogs.com/huangm1314/p/10963651.html

相关文章

  • linux使用tail,grep查看文件,提示配到二进制文件 (标准输入)
    环境centos7.9背景最近在linux下使用cat,tail等查看日志时会报《配到二进制文件(标准输入)》,然后就没有任何输出,通常这些日志是中文英文混打印的如使用vi进日志后能查看中文格式的内容原因那是因为在Linux系统中,使用tail和grep命令来查找中文格式的log时,遇到《Binaryfil......
  • Linux yum管理器 课堂实例
    yum源指定存放在/etc/yum.repos.d目录下 每次配置yum源后需要清除以前的yum数据库信息:yumcleanall更新yum仓库本地缓存:yummakecache   yum管理RPM包:查看yum源中是否存在可安装的httpd软件包:yumlisthttpd查看wget软件是否安装:yumlistwget 卸载httpd包:yum-yr......
  • linux学习-6
    文件共享1.FTP服务构建FTP服务是一种文件共享服务,依照FTP协议提供服务,默认使用端口20、21。其中端口20用于传输数据,端口21用于客户端发出相关的FTP指令。FTP协议有以下两种工作模式:①主动模式:FTP服务器主动向客户端发送连接请求。②被动模式:FTP的默认工作模式,FTP服务器等待......
  • Linux文件查找、打包压缩以及解压
    一:文件查找文件查找主要包括三个命令:which、find、locatewhich:命令查找示例:find:文件查找,针对文件名命令:find路径选项表达式动作示例: 二:文件打包压缩打包:打包的命令是tar,打包不能改变文件的大小,打包后的文件不是一个压缩包。命令:tar选项压缩包文件名称源文件ta......
  • Linux课堂知识总结
    这是学习Linux的第七节课,老师跟我们讲述了Linux的存储管理操作。[root@linux-server~]#ll/dev/sd*#创建LVM[root@linux-server~]#pvcreate/dev/sdb#创建pv[root@linux-server~]#pvs#查看pv[root@linux-server~]#vgcreatevg1/dev/sdb#创建vg[root@linux-serve......
  • Linux 关机命令(超详细)
    欢迎大家关注公众号【小白技术圈】,发送B02orb02领取Linux学习资料大礼包!在Linux中,关机是一个常见而重要的操作。为了安全地关闭系统,你需要使用 shutdown 或 poweroff 命令。以下是两种命令的使用方法:1.使用 shutdown 命令shutdown 命令允许你在预定的时间将系统关机,并......
  • Linux相关
    Linux日常总结修改文件或文件夹所属用户及用户组sudochowngitlab-runner:gitlab-runnerapp-gate.jar手动部署cd/data/ebike/app-gatesudodockerstopappgw-testsudorm-rfapp-gate.jarsudorzsudodockercp/data/ebike/app-gate/app-gate.jarappgw-test......
  • 小新Pro13 新手安装linux 注意事项
    家中有闲置的小新,是A卡正好合适装linux安装前关闭安全引导通过关机键旁边的重置口重新开机OR在开机界面按F2(开启Hotkey模式的要按Fn+F2)进入BIOS设置界面,关闭SecureBoot,这样方便安装linux系统刻录linux有很多发行版大家可以自行选择,推荐Ubuntu,相关资源比较丰富。我......
  • linux安装postgresql三种方式【转】
    linux下安装PostgreSQL可采用三种方式,二进制已编绎安装包、安装、源码安装三种方式进行安装方式1:yum安装,建议使用这种参看官方文档如下地址:sudoyuminstall-ysudoyuminstall-ypostgresql15-serversudo/usr/pgsql-15/bin/postgresql-15-setupinitdbsudosystemctlena......
  • linux-JDK安装配置
    查看是否安装jdk java-version 如果已经安装jdk,先卸载原来的卸载方式查看java安装路径whichjava卸载rm-rf"安装路径"修改或者删除原来环境变量vim/etc/profile#然后source命令让修改后的profile文件立即生效source/etc/profile 开始正式安装配置   ......