百科问答小站 logo
百科问答小站 font logo



为什么汇编语言不能越过操作系统操控硬件? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

首先,建议你看书,你问的东西太多,即使给你回答了,你可能还是不明白,因为太多基础性的东西你不知道。这些书包括Intel的开发手册(intel 架构软件开发人员手册 第3卷:系统编程指南,有部分被翻译成中文)、以及自己编写操作系统的书(这些书有很多,大多数讲的都还可以)。

以x86架构为例,x86指令运行的权限是从Ring0到Ring3的,操作系统内核运行在R0,用户程序运行在R3。

有一些指令只能在R0执行,比如修改CR寄存器(mov cr0, eax),这种操作在用户态直接会报错。因为CPU会保存当前运行的代码的CPL(当前特权级别)和IOPL(IO权限),如果CPL/IOPL不符,CPU会抛出异常,丢给内核R0的代码去处理。这种错误,是执行到某条特定指令才会遇到的,不是加载的时候遇到的,是CPU行为,不是操作系统行为

操作系统之所以不会被限制,是因为操作系统内核运行在R0上,对CPU有完整的控制权

计算机刚启动时,属于实模式,从实模式切换到保护模式的过程中,默认是进入到R0里的,所以操作系统在启动的过程中,是自动获得了R0的权限的。而用户代码都是被操作系统启动的,此时操作系统能控制用户代码运行在什么级别上。

那么为什么操作系统的代码就可以切换特权级而用户的代码却不可以切换特权级?

实际上可以的。Windows可以加载用户驱动到内核(但受到一些限制),这就是把用户代码放到R0里执行的过程,Linux也有类似的东西存在。

没操作系统之前二进制代码 到 操作系统 的过程是什么?

引导扇区(实模式)-> bootloader(实模式->保护模式,R0)-> 操作系统(保护模式,R0)

有操作系统以后从二进制代码 到 shell 到 内核 到硬件 过程是什么?

操作系统先加载的是内核,内核处于R0,shell已经是在用户态了。




  

相关话题

  是否有文档支持Java『volatile int i 在执行 i++ 的底层是非原子性的三步』的说法? 
  会不会有两个中断绝对同时发出,cpu会如何处理? 
  操作系统内核态和用户态切换落实到代码层面和运行层面的本质是什么? 
  关于vmlinux,vmlinuz,bzImage,zImage的区别和联系? 
  如果让计算机不使用操作系统做服务器性能上是否会更有优势? 
  Windows 内核和 Linux 内核谁更复杂? 
  C盘分区很大没事吗? 
  如果在内核把特权级切换到用户态之前屏蔽 CPU 对软中断的响应,是不是就再也进不了内核态了? 
  Linux不同发行版之间可以互换吗? 
  如何看待「鸿蒙系统一夜之间拥有 57 万个 App」这一说法? 

前一个讨论
郑州火车站东广场与西广场为什么不修建一条地道互通?
下一个讨论
被动车、高铁的门夹住为什么门没有自动感应到?为什么火车还能正常启动行驶?





© 2024-11-28 - tinynew.org. All Rights Reserved.
© 2024-11-28 - tinynew.org. 保留所有权利