用户态-内核态

前戏

我们知道计算机主要分为三部分,硬件,操作系统和应用程序,然后硬件的头脑cpu才是控制内核态和用户态的大佬

操作系统

操作系统是直接和硬件打交道的,操作系统在内核态下运行,从而可以访问整个硬件

应用程序

应用程序直接和用户交互,但是应用程序不能直接操作硬件,应用程序在用户态下运行,但是有时候应用程序也需要操作硬件,这个时候,就涉及到用户态和内核态的切换

内核态-用户态概念

内核态(所有指令都给操作系统使用)

当cpu在内核态运行时,cpu可以执行指令集中所有的指令,很明显,所有的指令中包含了使用硬件的所有功能

用户态(操作硬件部分的指令禁用)

用户程序在用户态下运行,仅仅只能执行cpu整个指令集的一个子集,该子集中不包含操作硬件功能的部分,因此,一般情况下,在用户态中有关I/O和内存保护(操作系统占用的内存是受保护的,不能被别的程序占用),当然,在用户态下,将PSW中的模式设置成内核态也是禁止的。

内核态-用户态的切换

CPU执行切换

由于内核态和用户态是非常频繁的,所以把状态切换和记录放在cpu的寄存器,最合适不过

程序状态寄存器-(系统调用)

用户态下工作的软件不能操作硬件,但是我们的软件比如暴风影音,一定会有操作硬件的需求,比如从磁盘上读一个电影文件,那就必须经历从用户态切换到内核态的过程,为此,用户程序必须使用系统调用(system call),系统调用陷入内核并调用操作系统,TRAP指令把用户态切换成内核态,并启用操作系统从而获得服务。

注意

用户态内核态相当于cpu的一个执行状态,cpu在不同状态下能使用的指令不同

参考链接

https://www.cnblogs.com/zx125/p/11524709.html

https://www.cnblogs.com/linhaifeng/p/6523843.html

原文地址:https://www.cnblogs.com/zx125/p/12064385.html

时间: 2024-11-13 08:08:17

用户态-内核态的相关文章

DSP 之原子与高性能设计(一) 用户态/内核态 原子原语

type __sync_fetch_and_add (type *ptr, type value, ...)type __sync_fetch_and_sub (type *ptr, type value, ...)type __sync_fetch_and_or (type *ptr, type value, ...)type __sync_fetch_and_and (type *ptr, type value, ...)type __sync_fetch_and_xor (type *pt

用户态内核态

Q:怎么从用户态切换到内核态 A:用户程序调用系统调用的时候,用户程序先将系统调用号放入eax,执行int0x80指令触发中断,中断发生时,cpu切入内核态,从 用户栈 切换到 内核栈 ,在 内核栈 中依次压入用户态的寄存器,也就是保护现场,根据中断号在中断向量表中查找对应的中断处理程序,并调用它. 中断 中断:操作系统是通过中断来从用户态切换到内核态 中断分两种: 硬件中断:电源掉电,键盘被按下 软件中断:i386下是 int 指令 linux上系统调用的中断号是0x80,而windows上是

用户态/内核态、用户栈/内核栈

一.用户态和内核态 内核态和用户态是操作系统的两种运行级别,用于区分不同程序的不同权利. 内核态就是拥有资源多的状态,或者说访问资源多的状态,也称为特权态.相对来说,用户态就是非特权态,访问的而资源将受到限制.如果一个程序运行在特权态,该程序就可以访问计算机的任何资源,它的资源访问权限不受限制.如果一个程序运行在用户态,其资源需求将受到各种限制.如:要访问操作系统的内核数据结构,如进程表,则需要在特选态下才能办到.如果要访问用户程序里的数据,在用户态即可. 二.用户栈和内核栈 内核在创建进程的时

linux 用户态 内核态

http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例子 C代码 1.     void testfork(){   2.     if(0 = = fork()){   3.     printf(“create new process suc

进程:linux用户态-内核态

用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问. 内核态:Ring0在处理器的存储保护中,核心态,或者特权态(与之相对应的是用户态),是操作系统内核所运行的模式.运行在该模式的代码,可以无限制地对系统存储.外部设备进行访问. 一.用户态和内核态 现在我们从特权级的调度来理解用户态和内核态就

从socket can中断到netlink用户态内核态通信

1. Linux中的进程间的通信机制源自于Unix平台上的进程通信机制.Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制.同时linux也遵循IEEE制定的posix IPC标准,在三者的基础上实现以下几种主要的IPC机制:管道(Pipe)和命名管道(Name Pipe),信号(Signal),消息队列(Message queue),共享内存(Shared

关于内核态用户态和信号的思考(其中中断上下段没有看懂)

终于搞懂用户态内核态以及中断.信号的上下文切换关系了,处于内核态的时候用户态的上下文保存在内核栈中,此时如果发生中断或者切换,是不会区分进程处于用户态还是内核态的,直接切之,软中断导致的是内核态和用户态的转化,也即是用户上下文到内核上下文的转化,而中断导致的是用户态或者内核态上下文到中断上下文的转化,进程切换导致的是用户态/内核态上下文到用户态/内核态上下文的转化.关键是每个进程都对应一个用户栈和内核栈. 扩展阅读: http://19880512.blog.51cto.com/936364/2

关于内核态和用户态切换开销的测试

最近开发用到fuse文件系统,这个文件系统的功能实现是在用户态下进行的,然而它的文件系统操作接口必须在内核态注册,所以需要研究一下内核态到用户态的开销到底如何.下面这个例子是在stackoverflow上看到的,基本能反映开销的差异了:在linux测试这个测试程序,getuid是一个系统调用,返回当前用户的id 1 #include <unistd.h> 2 3 #define MAX 100000000 4 int main() { 5 int ii; 6 for (ii=0; ii<

内核态和用户态,内核空间和用户空间

内核态与用户态是操作系统的两种运行级别,intel cpu提供Ring0-Ring3三种级别的运行模式.Ring0级别最高,Ring3最低 内核态可以拥有比用户态更大的权限 处于内核态的进程,可以访问用户进程空间(是虚拟地址空间),就是通过进程的页表(进程本身就是一个4G虚拟地址空间.其中用户空间的3G是独立的,内核空间是共享的)来访问用户地址空间对应的物理地址,从而访问用户空间 相反用户态的进程,只能访问用户地址空间(虚拟地址空间) 在内核态下,利用内核地址空间中的高端内存地址空间,来映射高端