2010-06-19 71 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