Linux--问题1--从用户态进入内核态
Linux--问题1--从用户态进入内核态
切换用户
首先要理清,切换用户是用命令su或者su -;与用户态进入内核态不是一回事。
大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户。Linux中切换用户的命令是su或su -。
su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell;而后者连用户和Shell环境一起切换成root身份了。只有切换了Shell环境才不会出现PATH环境变量错误。su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用su -命令切换以后,工作目录变成root的工作目录了。用echo $PATH命令看一下su和su -以后的环境变量有何不同。以此类推,要从当前用户切换到其它用户也一样,应该使用su -命令。
如图所示:
从用户态进入内核态
用户空间:指的就是用户可以操作和访问的空间,这个空间通常存放我们用户自己写的数据等等;
而内核空间则是系统内核来操作的一块空间,这块空间里面存放系统内核的函数、接口等。
当一个程序运行时,如果它是在用户空间下执行,我们把此时运行得程序的这种状态成为用户态,而当这段程序执行在内核的空间执行时,这种状态称为内核态。
Linux严格意义上说的是一个操作系统,我们称之为“核心 "。但我们一般用户是不能直接使内核的,而是通过内核(kernel)的“外壳”程序,也就是说shell用于kernel沟通。
Shell是一种命令行解释器,它主要包含:
1.将使用者的命令翻译给核心来处理。
2.将核心的处理结果翻译给使用者。
关于用户不能直接操作内核,其根本原因是为了对系统内核进行“保护”。
从用户态进入内核态如何切换?
答案是软件中断。软件中断和我们常说的中断(硬件中断)不同之处在于,它是通过软件指令触发而并非外设引发的中断,也就是说,是编程人员开发出的一种异常(该异常为正常的异常)。Linux操作系统一般是通过软件中断从用户态切换到内核态。
我们所说的用户态到内核态的切换,其实就是一个进程通过系统调用到内核的一些接口,从而实现切换。而该系统调用切换时通过软件中断来完成,该中断是程序人员自己开发出的一种正常的异常。
那么在Linux下,这个异常具体是调用int $0x80的汇编指令,这条汇编指令将产生向量为0x80的编程异常。
之所以系统调用需要借助这个中断异常来实现,是因为这个异常实际上就是通过系统门陷入内核。
(除了int 0x80外用户空间还可以通过int3——向量3、into——向量4 、bound——向量5等异常指令进入内核,而其他异常无法被用户空间程序利用,都是由系统使用的)
我们知道是先通过软件中断调用了0x80的这个编程异常,这个编程异常对应的是中断描述符表IDT中的第128项——也就是对应的系统门描述符。门描述符中含有一个预设的内核空间地址,它指向了系统调用处理程序:system_call()(别和系统调用服务程序混了)。
Linux一共有319个系统调用都从这里进入内核后,又该如何派发到它们到各自的服务程序去呢?
解决这个问题的方法很简单就是: 首先Linux为每个系统调用都进行了编号 (0—NR_syscall),同时在内核中保存了一张系统调用表 ,该表中保存了系统调用编号和其对应的服务例程,因此在系统调入通过系统门陷入内核前,(1)需要把系统调用号一并传入内核。在x86上,这个传递动作是通过在执行int0x80前,把调用号装入eax寄存器实现的。(2)系统调用处理程序一旦运行,就可以从eax中得到数据,(3)然后再去系统调用表中寻找相应服务例程了。如图:引用其他博主的知识。
除了需要传递系统调用号以外,许多系统调用还需要传递一些参数到内核,比如sys_write(unsigned int fd, const char * buf, size_t count)调用就需要传递文件描述符fd、要写入的内容buf、以及写入字节数count等几个内容到内核。碰到这种情况,Linux会有6个寄存器可被用来传递这些参数:eax (存放系统调用号)、 ebx、ecx、edx、esi及edi来存放这些额外的参数(以字母递增的顺序)。具体做法是在system_call( )中使用SAVE_ALL宏,把这些寄存器的值保存在内核态堆栈中。
做好上述工作之后,再执行系统调用处理程序,这样就从用户态切换到内核态。
本篇文章是学习其他人的博客,自己做整理。
Linux--问题1--从用户态进入内核态相关推荐
- java运行在用户态_理解Linux用户态和内核态
Linux整体架构图 我们先来看一张Linux整体架构图. 系统调用 系统调用时操作系统的最小功能单位.根据不同的应用场景,不同的Linux发行版本提供的系统调用数量也不尽相同,大致在240-35 ...
- Linux用户态和内核态
究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...
- linux 用户态与内核态通信方式简介
我们平常在写代码时,一般是在用户空间,通过系统调用函数来访问内核空间,这是最常用的一种用户态和内核态通信的方式.(关于 Linux 用户态和内核态可以参考 xx) 除此之外,还有以下四种方式: pro ...
- Linux探秘之用户态与内核态
https://www.cnblogs.com/bakari/p/5520860.html 一. Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核 ...
- Linux系统编程33:进程信号之详解信号的捕捉过程,用户态和内核态及其切换,sigaction和signal
文章目录 (1)用户态和内核态 (2)用户态和内核态的切换 (3)内核是如何实现信号的捕捉 (4)sigaction (1)用户态和内核态 我们说过,每个Linux进程有4GB的地址空间 其中0-3G ...
- JVM内存划分、Linux用户态、内核态简介
JVM内存划分 1.在Java运行的时候 JVM虚拟机拿到自己能支配的内存 将内存进行分割2.本地方法栈存储是C++ native方法3.程序计数器指向程序当前运行的位置4.方法区存储元数据信息在jd ...
- Linux 用户态与内核态的交互——netlink 篇
[size=4]Linux 用户态与内核态的交互 --netlink 篇[/size] 作者:Kendo 2006-9-3 这是一篇学习笔记,主要是对<Linux 系统内核空间与用户空间通信的实 ...
- Linux用户态与内核态通信的几种方式(待完善)
文章目录 1. 内核启动参数 2.模块参数与sysfs 3.sysctl 4.系统调用 5.netlink 6. procfs(/proc) 7.seq_file 8.debugfs 9.relayf ...
- 浅谈Linux用户态和内核态
为什么要分用户态和内核态? 在 CPU 的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃.比如:清内存.设置时钟等.如果所有的程序都能使用这些指令,那么你的系统一天死机 n 回就不足 ...
- 系统调用原理与用户态以及内核态相互切换过程,以linux系统为主
1. 讲系统调用前需要清楚的几个基本概念 1.1 内核态与用户态 内核态:当CPU执行内核的代码(CPU堆栈指针指向内核堆栈)时,我们就称此时处于内核态,内核态的代码可以使用特权指令,这些指令可以控制 ...
最新文章
- MATLAB从入门到精通系列-非线性曲线拟合函数lsqcurve()详解
- Sublime Text[崇高文本]----最性感的编辑器(程序员必备)
- LeetCode 题 - 69. x 的平方根 python解法
- mock教程 java_自动生成 java 测试 mock 对象框架 DataFactory-01-入门使用教程
- a星算法的优缺点_轻松理解机器学习算法:C4.5算法
- 《线性代数》同济六版 总结
- 最优秀的一到五个国产软件
- 手机上计算机开n次方,手机计算器还能这样用,99%的人都不知道
- 述职答辩提问环节一般可以问些什么_01、述职答辩操作流程指引
- cloudera安装
- html链接ppt,PPT超链接怎么做?
- 计算机的配件知识,最基本的入门知识:电脑由哪些部件组成?
- cas4.2登出后,跳转指定链接
- java寻宝算法_【Java 7】今天,你寻宝了吗?
- 编译原理-语法制导翻译
- 微信加好友方法有哪些?
- gcc 中-O -O1 -O2 -O3 -Os -Ofast -Og优化的原理
- ReleaseDC、DeleteDC(买二送一DeleteObject)简单解析
- 【Android】更改程序图标
- visual studio 如何编写c语言程序,用Visual Studio 编写纯C语言程序