我对编写尽可能少启动的软件感兴趣。我该怎么办? 这是一个装配问题吗?我是否必须对要运行软件的磁盘执行一些特殊操作?
为了澄清,我正在寻找stdin和stdout可用的点,但不是很多。
答案 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和一张软盘。
; 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