3、内核态和用户态

简介: 当一个任务(进程)执行系统调用而执行内核代码时,称进程处于内核内核态,此时处理器处于特权级最高的(0级)内核代码中执行,当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。

当一个任务(进程)执行系统调用而执行内核代码时,称进程处于内核内核态此时处理器处于特权级最高的(0级)内核代码中执行当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。当进程执行用户代码时,称其处于用户态此时处理器在特权级最低的(3级)用户代码中运行。<?xml:namespace prefix = o />

当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态,因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。内核态与用户态是操作系统的两种运行级别,intel cpu没有必然的联系,intel cpu提供Ring0-Ring3三种级别的运行模式,Ring0级别最高,Ring3最低。

Linux使用了Ring3级别运行用户态,Ring0作为内核态,没有使用Ring1Ring2Ring3状态不能访问Ring0的地址空间,包括代码和数据。Linux进程的4GB地址空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据。用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过writesend等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。

保护模式,通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程的地址空间中的数据。在内核态下,CPU可执行任何指令,在用户态下CPU只能执行非特权指令。当CPU处于内核态,可以随意进入用户态;而当CPU处于用户态,只能通过中断的方式进入内核态。一般程序一开始都是运行于用户态,当程序需要使用系统资源时,就必须通过调用软中断进入内核态.

使用nm查看用户态程序的符号表内容

使用System.map(内核符号表)查看内核符号表内容

1. 测试程序中打印用户态函数地址,并调用系统调用(在内核中打印系统调用函数地址),用"用户态符号表""内核态符号表"示例说明内核态和用户态地址空间的差异

2. 说明内核态地址映射ioremap();用户态地址映射mmap()

目录
相关文章
|
8月前
|
存储 调度
关于进程与进程调度
关于进程与进程调度
35 0
|
3月前
|
存储 网络协议 数据库
用户态协议栈
用户态协议栈
|
4月前
|
存储 安全 数据中心
系统调用与用户态陷入内核态
我们都知道操作系统中运行着很多的进程,如果普通的进程可以直接操作硬件那么这个系统的安全性没办法保障,所以操作系统分出了两种状态,一种状态是运行的代码可以操作硬件;一种状态不能操作硬件,只能切换到第一种状态去操作后再切换回来,这就是内核态和用户态。
|
10月前
|
调度 数据安全/隐私保护
用户态和内核态 中断处理机制
用户态和内核态 中断处理机制
215 0
|
6月前
|
安全 Linux C++
操作系统:用户态与内核态
操作系统:用户态与内核态
|
9月前
|
Unix Shell Linux
进程系统调用
进程系统调用
62 0
|
测试技术
seastar的用户态协议栈
seastar是一个高性能的IO框架,C++14炫技式实现。
|
安全
minifilter 与用户态的通信
驱动层的步骤 创建通信端口  FltCreateCommunicationPort    对于安全对象,必须设置OBJ_KERNEL_HANDLE。    ServerPort 监听客户端连接请求的端口。
2478 0
|
Linux 安全
用户态和内核态的区别
在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么你的系统一天死机n回就不足为奇了。
2475 0
|
Linux 调度
系统调用,上下文切换及中断概念的汇总
       仔细揣摩了一段时间.        系统调用过程,用户进程进入内核态,进程栈进入内核态栈, cpu进入内核态,cpu用户态各寄存器的值保存到内核态栈,执行内核态代码. 执行完从内核态返回到用户态,包括进程栈返回到用户态栈,cpu返回到用户态,cpu各寄存器的值用之前保存在内核态栈的值还原.  内核在执行系统调用时处于进程上下文中,current指针指向当前进程,即引发系统调用的进程。
2591 0

热门文章

最新文章