Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 基本操作系统引导问题_Assembly_Operating System_Boot_Bios - Fatal编程技术网

Assembly 基本操作系统引导问题

Assembly 基本操作系统引导问题,assembly,operating-system,boot,bios,Assembly,Operating System,Boot,Bios,我对计算机的引导过程和引导加载程序调用操作系统的部分有一些基本的问题 所以我知道BIOS将可引导驱动器的前512字节复制到内存中,并执行代码——这就是引导块 但是这个小的汇编程序是如何引导引导引导程序从操作系统中执行命令的呢 引导加载程序是否继续运行,并且仍然充当软件和硬件之间的“传送器”?或者控制权完全交给了操作系统 为什么所有引导加载程序都是用汇编语言编写的 为什么在编写OS时必须从C++返回到C? 致以最良好的祝愿, lamas1)引导加载程序通常包含一些简单的指令,用于从磁盘加载更多

我对计算机的引导过程和引导加载程序调用操作系统的部分有一些基本的问题

所以我知道BIOS将可引导驱动器的前512字节复制到内存中,并执行代码——这就是引导块

  • 但是这个小的汇编程序是如何引导引导引导程序从操作系统中执行命令的呢
  • 引导加载程序是否继续运行,并且仍然充当软件和硬件之间的“传送器”?或者控制权完全交给了操作系统
  • 为什么所有引导加载程序都是用汇编语言编写的
  • 为什么在编写OS时必须从C++返回到C?
致以最良好的祝愿, lamas

1)引导加载程序通常包含一些简单的指令,用于从磁盘加载更多数据并执行它

2) 不,

3) 尽量减少它们占用的空间

4) 你没有

但是这个小的汇编程序如何引导引导引导程序从操作系统启动命令呢?

由于您不能在512字节的代码中完成很多工作(尽管事实上,引导加载程序并不严格限制为512字节),因此引导加载程序通常只需将较大的代码块从磁盘加载到RAM中,然后执行即可

引导加载程序是否继续运行,并且仍然充当软件和硬件之间的“传送器”?还是将控制权完全交给操作系统?

我认为,一旦引导加载程序代码完成了它的工作,并跳转到它加载到内存中的其他代码,它就可以被重写,因为它不再需要了

为什么所有引导加载程序都是用汇编语言编写的?

我想这主要是因为一个原因:如果用高级语言编写引导加载程序,生成的代码很可能依赖于某种运行库,其中包含基本函数。然而,引导加载程序通常不需要这些代码,因此会导致代码大小膨胀

<>强>为什么在编写OS时必须从C++返回到C?<强> < /P> 严格来说,你不必这么做。只是C代码比C++更接近机器。使用C++,你不能总是猜测会产生什么代码,以及它是否会像你所希望的那样高效。
<>强>编辑:我还听到一些OS开发者坚持C语言的说法,因为在不同的编程范式和风格中,选择比C++中要少。因此,对于一个拥有公共代码库的团队来说,工作更容易,因为每个人都会编写更多“相似”的代码。(因为我自己没有参与过任何开源或操作系统开发,我无法根据经验判断这是否是一个有效的说法。)

回答你的最后一个问题:内核不需要用C编写。但是当涉及到分配内存时,这会使它们更容易

C++有许多不同的情况,您可以隐式地为临时变量等分配内存,这些情况在代码检查时并不总是明显的。这使得编写内核更加困难,因为您必须避免在某些上下文中分配内存


但是,它并不完全排除C++中的内核编写。有很多方法可以解决这个问题。

引导加载程序从磁盘加载操作系统

这就是为什么它被称为引导加载程序-它通过在没有任何磁盘操作系统从磁盘加载任何内容之前从磁盘加载磁盘操作系统,从而在引导过程中提升自身

加载操作系统时,它将接管并丢弃加载程序

引导加载程序通常用汇编语言编写,因为它在总体控制和可读性之间有很好的平衡。它可以用简单的机器代码编写(第一个可能是),但这更难阅读。它可以用像C这样的低级语言编写,但很难达到BIOS中加载所需的低级例程,也很难将其保持在大小限制内,因为编译后的代码往往会有大量开销

操作系统通常是用像C这样的低级语言编写的(引导加载程序和硬件驱动程序仍然在汇编程序中)。你可以用C++来写它,因为它是用C语言编写的,但是这将是毫无意义的,因为你不会使用C++所增加的很多内容。编写操作系统时,面向对象并不是很有用。

  • 但是这个小的汇编程序是如何引导引导引导程序从操作系统中执行命令的呢
是的,引导加载程序很小,但BIOS不是,它实现了。。一直在实施。。DOS I/O“系统调用”。这个I/O系统最初在DOS和早期的Windows时代运行整个OS I/O系统。现在,它只是一个控制台,负责加载真正的操作系统,然后提供所有自己的驱动程序。它是一种设备驱动程序库和用于引导加载程序的原始IBM PC仿真器

  • 引导加载程序是否继续运行,并且仍然充当软件和硬件之间的“传送器”?或者控制权完全交给了操作系统
一旦操作系统运行,引导加载程序就会启动。这是一个很好的问题,因为在最初的PC概念中,BIOS为操作系统和引导加载程序进行I/O,因此系统的一部分在加载操作系统后仍然存在

  • 为什么所有引导加载程序都是用汇编语言编写的
原因有几点:它们需要很小,它们有固定的地址布局限制,它们必须执行int$x风格的BIOS调用,并且考虑到它们的大小以及其中一些必须在汇编中的事实,使用128个左右的字节并说“好的,这部分你可以用C写,尽量不要写超过10条语句。”

    为什么在编写OS时必须从C++返回到C?
C++现在还不错;回到今天的大内核诞生时,情况就不同了。

有一个重要的问题