用户态和内核态

1.用户态和内核态

1.1 用户态和内核态的引入

最简单的运行程序的方式是“直接执行”,即直接在 CPU 上执行任意程序。直接执行的问题是:

  1. 如何限制代码行为?比如禁止:设置特殊寄存器的值、访问存储器的任意位置、I/O 请求、申请更多系统资源等
  2. 在运行这个程序的时候,如何切换到另一个程序?进程调度应该是 OS 才有的权限

因此引入用户态和内核态和两种模式。用户态无法执行受限操作,如 I/O 请求,执行这些操作会引发异常。核心态只能由操作系统运行,可以执行特权操作。用户程序通过 系统调用 system call 执行这些特权操作。OS 执行前会判断进程是否有权限执行相应的指令。

区分用户态和核心态的执行机制称为“受限直接执行”(Limited Direct Execution)。

1.2 两种工作模式的简述

(1)用户态又称为目态,计算机硬件可以通过一个模式位1进行表示。当计算机系统执行用户程序时,系统处于用户态。
(2)内核态又称为管态,计算机硬件可以通过一个模式位0进行表示,每当计算机能够控制计算机时,它就处于内核态。例如,当用户程序通过系统调用请求OS服务时,系统必须从用户态切换到内核态,以响应请求。

2.各态下的指令,中断

2.1特权指令和非特权指令

(1)特权指令是指 具有特殊权限的指令,如:清除内存,置时钟,分配系统资源,修改虚存的段表或页表,修改用户的访问权限等,由于这些指令的权限过大,使用不当会导致难以想象的灾难,甚至于整个系统崩溃。所以这些指令只能在内核态下执行,实际上,CPU在内核态下可以执行指令系统的所有指令        

(2)用户态下只能执行非特权指令,在用户态下使用特权指令时,将产生中断以阻止用户使用特权指令

(3)从用户态转换为内核态的唯一途径是中断或异常

2.2 访管指令和访管中断

(1)访管指令( trap 指令) 是一条在用户态下执行的指令。在用户程序中,因要求操作系统提供服务而有意识地使用访管指令,从而产生一个中断事件(自愿中断),将操作系统转换为内核态,称为访管中断。访管中断由访管指令产生,程序员使用访管指令向操作系统请求服务。

(2)由于用户程序只能在用户态下运行,若用户程序想要完成在用户态下无法完成的工作时,就需要依靠访管指令。访管指令本身不是特权指令,其基本功能是让程序拥有“自愿进管”的手段 ,从而引起访管中断。

2.3 只能在内核态下执行的指令

包括特权指令,访问硬件指令,上下文切换指令等:

        1)I/O指令

        2)中断管理指令:关中断,开中断

        3)内存管理指令:如 LGDT(加载全局描述符表),LIDT(加载中断描述符表)

        4)系统状态设置指令:如 HLT(停止处理器),RESET(复位)

        5)访问硬件指令:控制CPU特定寄存器;直接操作设备寄存器等

        6)上下文切换指令:如 IRET(从中断返回,恢复用户态)

### Java 用户态内核态的区别联系 #### 区别 在Java环境中,用户态内核态主要体现在程序执行的不同层次上。当Java应用程序运行时,默认情况下是在用户空间中操作,即处于用户态;而一旦涉及到需要操作系统权限的操作,则会进入内核态。 - **访问范围** - 在用户态下,进程能够触及的地址区域有限制,并且无法直接操控硬件设备或修改某些敏感数据结构。这是因为存在保护机制防止恶意软件破坏系统稳定性[^3]。 - **特权级别** - 当切换到内核态之后,当前正在处理的任务获得了更高的控制权,可以不受约束地读写整个物理内存以及调用底层API函数完成特定功能(如I/O请求)。此时占用的CPU时间片也不会轻易被其他更高优先级的任务打断[^4]。 #### 联系 尽管两者有着明显的界限区分,但在实际应用过程中却紧密相连: - **通过系统调用来沟通** - 对于Java而言,在遇到诸如文件IO、网络通信等场景时,便会触发从用户模式向核心层转变的过程——这被称为“系统调用”。例如`new FileInputStream()`这样的方法内部就会发起一次跨越边界的动作[^1]。 - **共享同一套逻辑流程** - 即使表面上看去像是两个独立的世界,但实际上二者遵循着相同的编程模型并共同作用于同一个进程中。每当发生异常事件或者定时器到期等情况时,都可能导致类似的转换行为出现[^2]。 ```java try (FileInputStream fis = new FileInputStream("example.txt")) { int content; while ((content = fis.read()) != -1) { System.out.print((char) content); } } catch (IOException e) { e.printStackTrace(); } ``` 上述代码展示了如何利用标准库类实现简单的磁盘读取过程,期间不可避免地经历了由用户域至管理端再返回来的循环路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值