如何在没有操作系统的情况下运行程序?

时间:2014-02-26 22:13:38

标签: assembly x86 operating-system bootloader osdev

如果没有运行操作系统,如何单独运行程序? 您是否可以创建计算机可以在启动时加载和运行的汇编程序,例如从闪存驱动器启动计算机,它运行CPU上的程序?

3 个答案:

答案 0 :(得分:136)

  

如果没有运行操作系统,如何单独运行程序?

将二进制代码放在重新启动后处理器查找的位置(例如ARM上的地址0)。

  

您是否可以创建计算机可以在启动时加载和运行的汇编程序(例如,从闪存驱动器启动计算机并运行驱动器上的程序)?

问题的一般答案:可以做到。 它通常被称为“裸机编程”。 要从闪存驱动器读取,您想知道什么是USB,并且您希望有一些驱动程序可以使用此USB。这个驱动器上的程序也必须采用某种特定的格式,在某些特定的文件系统上...这是引导装载程序通常会做的事情,但是你的程序可能包含自己的引导加载程序,所以它是自包含的,如果固件只有加载一小段代码。

许多ARM主板允许您执行其中的一些操作。有些引导装载程序可以帮助您进行基本设置。

Here您可以找到有关如何在Raspberry Pi上执行基本操作系统的精彩教程。

编辑: 本文和整个wiki.osdev.org将解答您的大部分问题 http://wiki.osdev.org/Introduction

此外,如果您不想直接在硬件上进行实验,可以使用qemu等虚拟机管理程序将其作为虚拟机运行。了解如何直接在虚拟化ARM硬件here上运行“hello world”。

答案 1 :(得分:1)

以操作系统为灵感

操作系统也是程序,因此我们也可以通过从头开始创建或更改(限制或添加)<强大的小型操作系统,然后在引导过程中运行(使用 ISO映像)。

例如,此页面可用作起点:

How to write a simple operating system

在这里,整个操作系统完全适合512字节引导扇区(MBR)!

可以使用此类操作系统或类似的简单操作系统创建一个简单的框架,该框架将允许我们:

  

使引导加载程序将磁盘上的后续扇区加载到RAM中,并跳转到该点以继续执行。或者,您可以读取FAT12(软盘驱动器上使用的文件系统)并实现

但是有很多可能性。例如,要查看更大的x86汇编语言操作系统,我们可以探索MykeOS,x86操作系统学习工具,用于显示简单的16位,实模式操作系统,并带有注释良好的代码广泛的文档

引导加载程序为灵感

在没有操作系统的情况下运行的其他程序的常见类型也是引导加载程序。我们可以使用以下站点来创建受此概念启发的程序:

How to develop your own Boot Loader

以上文章还介绍了此类程序的基本体系结构

  
      
  1. 按0000:7C00地址正确加载到内存。
  2.   
  3. 调用以高级语言开发的BootMain函数
  4.   
  5. 在显示屏上显示“”,世界……”,您好。
  6.   

我们可以看到,该体系结构非常灵活,可以让我们实现任何程序,不一定是引导加载程序。

尤其是,它展示了如何使用“混合代码”技术,这使得可以合并高级结构(来自 C < / strong>或 C ++ (具有低级命令)(来自汇编器)。这是一种非常有用的方法,但我们必须记住:

  

构建程序并获取可执行文件,您将需要用于16位模式的Assembler的编译器和链接器对于C / C ++ ,您只需要可以为16位模式创建目标文件的编译器

本文还介绍了如何查看正在运行的程序,以及如何执行其测试和调试。

UEFI应用程序的灵感

以上示例使用了将扇区MBR加载到数据介质上的事实。 但是,例如,我们可以使用 UEFI应用来深入了解

  

除了加载操作系统之外,UEFI还可以运行UEFI应用程序,这些应用程序作为文件驻留在EFI系统分区上。它们可以从UEFI命令外壳,固件的启动管理器或其他UEFI应用程序执行。 UEFI应用程序可以独立于系统制造商进行开发和安装。

     

一种UEFI应用程序是 OS加载器,例如GRUB,rEFInd,Gummiboot和Windows引导管理器;它将OS文件加载到内存中并执行它。而且,OS加载程序可以提供用户界面,以允许选择另一个要运行的UEFI应用程序。 UEFI Shell之类的实用程序也是UEFI应用程序。

如果我们希望开始创建此类程序,例如,我们可以从以下网站开始:

Programming for EFI: Creating a "Hello, World" Program / UEFI Programming - First Steps

探索安全问题作为灵感

众所周知,有一整套恶意软件(它们是程序)在操作系统启动之前正在运行

与上述所有解决方案一样,它们中的很大一部分都在MBR扇区或UEFI应用程序上运行,但是也有一些使用诸如Volume Boot Record(VBR)或{{3 }}:

  

至少有四种已知的BIOS攻击病毒,其中两种用于演示目的。

或者也可能是另一个。

BIOS

  

Bootkits 已从概念验证开发演变为大规模发行,并且现在已有效地成为开源软件

不同的启动方式

我还认为,在这种情况下,值得一提的是Attacks before system startup个操作系统(或用于此目的的可执行程序)。有很多,但我要注意使用网络启动选项( PXE )从网络加载代码,该选项允许我们在计算机上运行程序无论其操作系统是什么,甚至无论直接连接到计算机的任何存储介质是什么

various forms of booting

答案 2 :(得分:0)

我写了一个基于Win32的c ++程序,将程序集写到笔式驱动器的引导区。从笔式驱动器启动计算机后,它会成功执行代码-在这里C++ Program to write to the boot sector of a USB Pendrive

该程序只有几行内容,应在配置了Windows编译器(例如Visual Studio编译器)的任何可用版本的编译器上进行编译。