百科问答小站 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已经是在用户态了。




  

相关话题

  把操作系统编译结果的机器码更改一位,比如将第一位0改成1或者反之,操作系统还能运行吗? 
  在嵌入式商用里面哪款RTOS(实时操作系统)比较多人用? 
  Linux 的核心思想是什么? 
  CPU检测到中断信号时,怎么知道是发给哪个进程的? 
  如何看待华为终端 2020 年除了手机、平板和电脑外全线搭载鸿蒙系统? 
  如果美帝软件上制裁,禁止使用一切 MADE in USA 的代码、软件(包括开源软件)会怎样? 
  为什么电脑厂商不将 Windows 系统进行定制? 
  为什么 macOS 没有看到 Windows 的一些远古遗留设计? 
  打印机使用什么系统?自己开发的系统?还是Windows系统? 
  操作系统中到底是谁分配的资源? 

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





© 2025-05-15 - tinynew.org. All Rights Reserved.
© 2025-05-15 - tinynew.org. 保留所有权利