Linux用户态和内核态

最近一直在到处跑找工作,笔试,面试,乐此不疲。今天笔试时遇到一道linux的题目,那啥,由于不会,所以选项也不记得了。。。囧,不过百度搜到一道类似的题目:

下列选项中,会导致用户进程从用户态切换到内核的操作是?

I. 整数除以零
II. sin( )函数调用
III. read系统调用

A、仅 I、II
B、仅 I、III
C、仅 II 、III
D、I、II和III

看到这个第一反应是,啥是用户态?啥是内核态?好像大概知道是什么,又不是很确定。于是好好了解了一下这个东西,就当是查漏补缺了。

Linux体系架构

如上图,linux的体系架构大致可以分为用户空间和内核空间。其中,

用户空间包括C语言的库函数和上层应用程序。

内核空间包括硬件平台、平台依赖代码、内核和系统调用。

linux中,每个进程都有一个4G大小的虚拟地址空间,在这个4G大小的虚拟地址空间中,最高的1G字节(从虚地址0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而较低的3G字节(从虚地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间”。

每个进程的用户空间之间是相互独立、互不干扰的。进程的内核空间中有有一块区域为内核栈,这个区域是各个进程独立的。每个进程都可以从用户态切换到内核态,因此,内核空间中除了每个进程的内核栈外,对于所有进程来说,是共享的。

那么为什么要将内存分为内核空间和用户空间呢?

一来,分层提高了效率,底层的做底层,上层的做上层。

二来,可以保护内核。因为应用程序的崩溃,不至于造成内核的崩溃。例如,qq的崩溃不至于造成内核的崩溃。

三来,每个应用程序都有自己的内存地址,各个程序之间相互不影响,例如,qq的崩溃不会导致微信的崩溃。

那么什么是内核态?什么是用户态?简单来说,内核态指进程工作在内核空间下,用户态指进程工作在用户空间下。

linux系统中有两种运行模式:高优先级模式(特权模式)和低优先级模式(普通模式)。内核态和用户态的最大区别就是特权不同,内核态的优先级高,用户态的优先级低。内核态下,可以运行内核核心代码以及与硬件密切相关的代码,而用户态下只能运行应用程序与硬件无关的部分。

既然说了用户态可以切换到内核态,那什么时候会发生这种切换?

1、发生系统调用时

这是处于用户态的进程主动请求切换到内核态的一种方式。应用程序正常情况下是运行在用户态下的,不能直接操控硬件或者调用内核函数。那当应用程序需要完成在内核态下才能完成的某些工作时,该怎么办呢?这时就需要通过linux向上提供的系统调用接口进入内核态,然后执行调用所提供的有限功能。其核心是使用了操作系统为用户特别开发的一个中断机制来实现的,即软中断

2、产生异常时

当CPU执行运行在用户态下的程序时,发生了某些不可预知的异常,这时会触发当前运行的进程切换到处理此异常的内核相关的程序中,也就是转到了内核态,如缺页异常。

3、外设产生中断时

当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作的完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

上述三种由用户态切换到内核态的情况中,只有系统调用是进程主动请求发生切换的,中断和异常都是被动的。

了解完内核态用户态之后,再来看这个题,就很简单了。

I. 整数除以零
II. sin( )函数调用
III. read系统调用
首先I,由于程序会报除0异常,因此会从用户态切换到内核态;
再看II,sin()是C语言库函数中的一个函数,由上面的架构图知道,库函数是处于用户空间的,因此进程会运行在用户空间,不会发生切换;
最后是III,read系统调用,会使进程由用户态切换至内核态。
因此这道题选I、III

 

 

 

 

文章已创建 65

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部