用户态内核态

Q:怎么从用户态切换到内核态

A:用户程序调用系统调用的时候,用户程序先将系统调用号放入eax,执行int0x80指令触发中断,中断发生时,cpu切入内核态,从 用户栈 切换到 内核栈 ,在 内核栈 中依次压入用户态的寄存器,也就是保护现场,根据中断号中断向量表中查找对应的中断处理程序,并调用它。

中断

中断:操作系统是通过中断来从用户态切换到内核态

中断分两种:

硬件中断:电源掉电,键盘被按下

软件中断:i386下是 int 指令

linux上系统调用的中断号是0x80,而windows上是0x2E

中断号有限,所以不可能用一个中断号去对应一个系统调用,于是引进了系统调用号,用一个中断号来表示触发系统调用,然后根据eax里的系统调用号,来确定调用哪一个系统调用。

保护现场:由int依次压入寄存器SS,ESP,EFLAGS,CS,EIP

恢复现场:由iret依次弹出寄存器

system

调用int0x80后,根据中断向量表找到0x80是system_call

  1. system_call首先将各种寄存器压入栈中(依次是EBX,ECX,EDX,ESI,EDI,EBP,作为系统调用的参数)
  2. 调用sys_call_table(0, %eax, 4)查找中断服务程序并执行
  3. 执行结束后恢复被保存的寄存器
  4. 最后通过指令iret从中断处理程序中返回。

用户态 内核态

为什么要有用户态和内核态

操作系统为了让不同的代码运行在不同的模式上,限制他们的权利,提高稳定性和安全性,CPU划分出两个权限等级 -- 用户态 和 内核态

用户态:cpu只能受限的访问内存

内核态:cpu可以访问内存所有数据

Q:谈谈用户态和内核态

A:操作系统为了让不同的代码运行在不同的模式上,限制他们的权利,提高稳定性和安全性,CPU划分出两个权限等级 -- 用户态 和 内核态,处于用户态时cpu只能受限的访问内存,处于内核态时cpu可以访问内存所有数据,应用程序基本上都是运行在用户态的,而系统调用时运行在内核态的。

原文地址:https://www.cnblogs.com/hanhuihanhui/p/8616026.html

时间: 2024-10-14 00:58:12

用户态内核态的相关文章

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

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

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

用户态-内核态

前戏 我们知道计算机主要分为三部分,硬件,操作系统和应用程序,然后硬件的头脑cpu才是控制内核态和用户态的大佬 操作系统 操作系统是直接和硬件打交道的,操作系统在内核态下运行,从而可以访问整个硬件 应用程序 应用程序直接和用户交互,但是应用程序不能直接操作硬件,应用程序在用户态下运行,但是有时候应用程序也需要操作硬件,这个时候,就涉及到用户态和内核态的切换 内核态-用户态概念 内核态(所有指令都给操作系统使用) 当cpu在内核态运行时,cpu可以执行指令集中所有的指令,很明显,所有的指令中包含了

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是独立的,内核空间是共享的)来访问用户地址空间对应的物理地址,从而访问用户空间 相反用户态的进程,只能访问用户地址空间(虚拟地址空间) 在内核态下,利用内核地址空间中的高端内存地址空间,来映射高端