如何编写非常接近系统启动的软件?

时间:2010-06-19 17:47:10

标签: assembly

我对编写尽可能少启动的软件感兴趣。我该怎么办? 这是一个装配问题吗?我是否必须对要运行软件的磁盘执行一些特殊操作?

为了澄清,我正在寻找stdin和stdout可用的点,但不是很多。

5 个答案:

答案 0 :(得分:3)

如果要在POST之后但在OS启动之前运行代码,则需要挂钩或替换引导加载程序。对于你要提出的下几个问题,没有简单的答案。

互联网上有很多资源用于编写自己的引导加载程序 - 您可能希望从它们开始:

如果您发现自己正在寻找有关x86程序集的好书,请尝试:

答案 1 :(得分:1)

实现这种效果的一种方法可能是重新使用一些非常有限的操作系统,比如一些削减的Linux或者甚至是旧的DOS,然后让它们在启动时自动运行代码。但这取决于你为什么要这样做,如果这个解决方案适合你。

编辑:或者,如果这还不够,我建议您查看Lilo或grub4dos或类似内容,看看您是否可以通过某种方式插入代码。 Boot Land网站上的论坛可能也很有用,因为他们似乎很想弄清楚如何自定义启动过程。

答案 2 :(得分:1)

只运行Linux而没有分发提供的所有垃圾?我的内核需要1.8秒才能加载。这是最简单的方法。请参阅Linux From Scratch

stdin和stdout是操作系统特定的概念,它们在预启动时不存在(尽管可能在某些自定义BIOS或引导加载程序中它们......)

下一个最低的位置是引导装载程序,有些东西在那时被初始化,但是你仍然需要做很多工作。

你可以比这更低,加载你自己的BIOS,但是你必须处理你的BIOS负责的所有非标准化的东西。

答案 3 :(得分:0)

这取决于操作系统。 你必须将你的程序添加到windows下的RunOnce注册表项,以及linux下的init脚本(linux下有各种init方法,所以有各种方法)。

答案 4 :(得分:0)

这是一个简单的启动加载程序,可以帮助您入门。 你需要nasm,dd和一张软盘。

http://www.cs.umbc.edu/courses/undergraduate/313/spring05/burt_katz/lectures/Lect11/newBootSector.html

; boot1.asm   stand alone program for floppy boot sector
; Compiled using            nasm -f bin boot1.asm
; Written to floppy with    dd if=boot1 of=/dev/fd0

; Boot record is loaded at 0000:7C00,
        ORG     7C00h

; load message address into SI register:
        LEA     SI,[msg]

; screen function:
        MOV     AH,0Eh

print:  MOV     AL,[SI]         
        CMP     AL,0         
        JZ      done               ; zero byte at end of string
        INT     10h                ; write character to screen.    
        INC     SI         
        JMP     print

; wait for 'any key':
done:   MOV     AH,0       
        INT     16h                ; waits for key press
                                   ; AL is ASCII code or zero
                                   ; AH is keyboard code

; store magic value at 0040h:0072h to reboot:
;       0000h - cold boot.
;       1234h - warm boot.
        MOV     AX,0040h
        MOV     DS,AX
        MOV     word[0072h],0000h  ; cold boot.
        JMP     0FFFFh:0000h       ; reboot!

msg     DB      'Welcome, I have control of the computer.',13,10
        DB      'Press any key to reboot.',13,10
        DB      '(after removing the floppy)',13,10,0
; end boot1