如何制作可启动程序?

时间:2012-04-02 20:28:17

标签: c boot low-level

所以,问题可能看起来很奇怪,但让我们说我编译:

int main(void)
{
    int x = 3;
    int y = 4;

    int z = x + y;
}

是否可以让CPU运行?怎么样?例如,这是否允许我写入监视器? (如果我没记错的话,你可以在内存中写下要显示的内容。)

3 个答案:

答案 0 :(得分:2)

对于您的程序,除了启动它之外,它不依赖于任何操作系统服务。如果它是另外做输入或输出,它几乎肯定会依赖操作系统来执行i / o。

如果您想用自己的代码替换操作系统,那么您可以这样做。存在简约的操作系统和程序加载器。但是,是的,你需要学习很多东西。

答案 1 :(得分:2)

printf是关于最糟糕的C库调用,它使用它到达如此多的方向,浮点,字符串,分区等等,避免它出现这种情况。我看到你还没看过评论。

要查看正在运行的程序,您想要使并行端口上的LED或引脚闪烁,或者将字符从串行端口发送出去,这比编程显卡中的寄存器和调试该代码要容易得多你正在取得进步。

现在使用x86,你有一个图层,不是真正的操作系统,而是一个背后有这种代码的图层,你可以通过简单的调用来在文本模式下在屏幕上打印字符并查看程序的运行情况。我已经剥离了pcemu_samples,但完整的pcemu和dosbox以及其他x86仿真环境以及实际的计算机,都可以使用这些东西。其中一个sim环境(dosbox,pcemu,etC)是一个更好的起点(如果你觉得你必须从x86开始,请注意这里的主题,我实际上是不鼓励从x86开始)。如果你做了x86,你可以从dosbox或类似的东西,然后以你自己的方式工作到一个可启动的usb棒并从那里开始工作。

嵌入式处理器,其中有很多很多的评估板,价格低于50美元,有些是20美元或者低于20美元的好处。但是许多免费的模拟器可供您学习。我有一些你可以尝试,thumbulator,amber_samples,pcemu_samples可能是最稳定的(不太可能需要调试我的东西,主要调试你的东西),然后其他不太稳定,meecoate,msp430sim等等。$ 5将获得你是msp430主板,10美元将为你获得一个ARM cortex-m3主板,20美元会让你太强大而不能称为微控制器,微控制器主板(基于cortex-m4)。更多的钱不会让你更快或更好,但更多的选择。可以运行linux的主板可以/会让你想要学习的东西更加痛苦,保持在这个水平之下。

您的简单示例需要很少,在编译器为该函数创建的代码之外,您只需要一条指令就可以从复位向量分支到主函数的入口点。理想情况下,您希望设置堆栈,最终可能为零.bss或copy .data等。只是学习使用工具(编译器,汇编器,链接器)构建嵌入式二进制文件(即使您没有运行的硬件/模拟器) )会告诉你(反汇编)如何连接reset和main之间的点(你不必称之为main,你可以将它命名为你想要的任何东西,一些你不想称之为主编译器的编译器会将额外的垃圾扔进去你的二进制文件。)

答案 2 :(得分:0)

这只是一个很长的故事,你需要熟悉装配 并且您必须知道什么样的划痕适合您的CPU类型 一般来说,x86系列的组装非常有名,你可以通过它来学习它。

你会看到类似的东西:

Start:

mov AX ,0xff ;example 1
mov BX ,[CX] ;example 2
myString db 'Hi This is my First scratch',0 ;Print Example
call printFunc ;example 3 
jmp $

printFunc:
 mov ah, 0Eh ;This how you print on screen in Assembly
 loop
 lodsb
 cmp AX,BX
 je loop

等 等等 ..... ...