2010-06-19 50 views
2

我有兴趣编写尽可能少引导的软件。我该怎么办? 这是一个程序集的问题吗?我需要对软件运行的磁盘做些特别的事吗?如何编写与系统启动非常接近的软件?

为了澄清,我正在寻找一个stdin和stdout可用的点,但没有其他的。

+0

我们在这里谈论子操作系统级别的代码? – ChaosPandion 2010-06-19 17:49:02

+0

是的。我想将一个简单的程序刻录到磁盘并让系统只执行该程序。 – lowerkey 2010-06-19 17:55:43

回答

3

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

目前在互联网上编写自己的引导程序相当多的资源 - 你可能要开始与他们:

如果你发现自己寻找关于x86汇编的一本好书,请尝试:

+0

冒着没有简单答案的风险:这是否意味着我会编写自己的引导加载程序? – lowerkey 2010-06-19 17:59:23

+0

我抬头看POST的意思,是的,我只是在想你在说什么。是否有可能在引导程序中创建一个新条目并使其指向我的程序? – lowerkey 2010-06-19 18:03:37

+0

或者更确切地说用你的程序替换bootloader。如果你不需要超过510个字节。 :) – 2010-06-19 21:43:15

0

这取决于操作系统。 您必须将程序添加到Windows下的RunOnce注册表项中,并在Linux下启动脚本(linux下有各种init方法,因此有各种方法)。

+1

我有兴趣编写在windows或linux加载之前运行的软件。有没有办法做到这一点? – lowerkey 2010-06-19 17:52:32

1

才达到这种效果可能会重新使用像一些删节Linux的一些非常有限的OS或者甚至老的DOS,然后让他们在启动时自动运行你的代码的方法。但这取决于你为什么要这样做,如果这种解决方案适合你。

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

+1

DOS在嵌入式世界,气泵,收银机等中仍然非常活跃。DOS不是坏。你应该从头开始学习linux来理解linux的启动过程,你会发现你可以大幅缩短这个时间,并直接启动到嵌入式程序中。 – 2010-06-20 03:17:02

1

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

stdin和stdout是OS具体的概念,他们不存在预引导(尽管也许在一些自定义的BIOS或引导程序他们这样做...)

下一个最低的地方将是引导装载程序,有些事情是在那个时候初始化的,但是你仍然会有很多工作要做。

你甚至可以加载更低的BIOS,加载你自己的BIOS,但是你必须照顾好你的BIOS需要处理的所有非标准化的东西。

+0

引导加载程序刚刚完成。我只是想能够做基本的输入输出。 – lowerkey 2010-06-21 14:57:54

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