[OS]Pisanie boota

0

Witam.

Jako że mam wrażenie że ostatnio moim głównym zajęciem jest wymyślanie sobie bezsensownych problemów których później nie potrafię rozwiązać...

Chciałbym was prosić o drobną poradę.

Chciałem sobie napisać prostego OSa - oczywiście nie żebym chciał pokazać MS kto tutaj rządzi, tylko w celach edukacyjnych - nie ma lepszego sposobu niż samodzielne napisanie czegoś żeby o zrozumieć.

No i skorzystałem z tutoriala ma tym portalu - http://4programmers.net/OS_Programming/Pisanie_system%C3%B3w_operacyjnych_-_tryb_rzeczywisty - jako wstępu, i już na wstępie utknąłem.

Jako że dyskietki to już relikty przeszłości na swoim komputerze takiego cuda jak stacja dyskietek nie posiadam więc postanowiłem wgrać boota na cd (no dobra, dvd).

Na płytę kod nagrałem HexWorkshopem (bo Nero też nie posiadam...), tzn skopiowałem bajty do sektora 1.

Wie ktoś może czemu BIOS nie rozpoznaje płyty jako boota?

0

Bo CD to nie dyskietka? Weź zainwestuj w maszynę wirtualną, tam obraz dyskietki/wtf można podpiąć bez problemu. Poza tym reboot co chwila coby sprawdzić coś na fizycznym sprzęcie to masochizm. O braku możliwości debugowania nie wspomnę.

0

Sciagnij sobie chociazby qemu do tworzenia obrazu dyskietki i testuj bez systemu plikow, tylko wlasnie czytajac sektory:
tak tworzysz obraz

qemu-img create test.img 2880

tak nagrywasz

dd if=boot.bin of=test.img count=1

tak testujesz:

qemu -fda test.img -boot a

a jak bedziesz mial kernela to:

cat boot.bin kernel.bin > os.bin lub copy /b boot.bin+kernel.bin os.bin
merge os.bin obraz.img  <---- to dla Linuksa kod masz ponizej tego programu
dd if=os.bin of=obraz.img bs=512  <--- dla Windowsa, chociaz dd :)
// testujesz plik obraz.img

moj merge:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>

#define size	2949120

int main(int argc, char *argv[]) 
{
	int fd, fdimg, i;
	char img[size] = {0};

	if(argc != 3) {
		printf("usage: merge <file.bin> <file.img>\n");
		return 1;
	}

	fd = open(argv[1], O_RDONLY);
	if(fd == -1) {
		perror("open1");
		return 1;
	}

	if((read(fd, img, size)) == -1) {
		perror("read1");
		return 1;
	}

	close(fd);

	fdimg = open(argv[2], O_RDWR | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
	if(fdimg == -1) {
		perror("open2");
		return 1;
	}

	if((write(fdimg, img, size)) == -1) {
		perror("write");
		return 1;
	}

	close(fdimg);

	return 0;
}

Jak chcesz dokladny przyklad bootloadera z komentarzami to mam na swojej "stronce" ;)

Powodzenia przy pisaniu.

0

Tak btw to moze po prostu masz tak ustawiona kolejnosc bootowania, ze cd/dvd jest za dyskiem?
A poza tym to w 100% popieram co to zostalo juz napisane wyzej - odpal maszyne wirtualna.

0

Nie to chyba nie o to chodzi, sam pisalem kiedys os'a, zreszta nadal jak mam czas pisze, na razie cos tam jest i wydaje mi sie ze to kwestia tego ze inaczej plyta jest zbudowana i ma system plikow iso9660.

0

Tak samo mialem z pendrivem, musialem dodac obsluge systemu plikow, zeby bootowal bios, bo inaczej nie dawalo rady ;)

0

Tak btw to moze po prostu masz tak ustawiona kolejnosc bootowania, ze cd/dvd jest za dyskiem?

Czy mój nick sugeruje że jestem idiotą? ;)

Ok, VirtualBox się ściąga... jak na razie 3 procent.

0

Ok, VirtualBox się ściąga... jak na razie 3 procent.

polecam bochs, roznica miedzy vboxem wieksza niz miedzy vboxem i prawdziwym sprzetem.
boot trwa < sekunde, masz pelny debug z dodatkowymi informacjami, i jest to emulator a nie pojebany virtualmachine, ktore dziala na prawdziwym sprzecie. virtual box jest do czego innego, tam wiekszasc rzeczy nie bedzie dzialac!

0

Od razu przepraszam, że odkopuje, ale lepsze chyba to niż zakładanie takiego samego tematu ;-)

Również wzoruje się na artykule z 4programmers.net, ale też na tym: http://rudy.mif.pg.gda.pl/~bogdro/dos/boot_tut.htm, po asemblacji kodu z tej drugiej stronki (NASM) do pliku *.bin i utworzeniu obrazu płytki w CDBurnerXP, z opcją emulacji dyskietki, wypalona płyta botuje. Tak samo MobaLifeCD też botuje płytę, w Bochs obraz płyty również botuje, ale nie mogę odpalic jej jako dyskietki (podając jako jej obraz utworzony bin lub zapisany RawWriterem obraz dyskietki). Czy ktoś wie dlaczego? :-)

Drugim problemem jest to, że jak już zbotuje sobie taką płytkę to na ekranie nic się nie wyświetla (jedynie kursor) i "OS" nie reaguje wcale na przyciski. :-( Zwyczajnie przerwanie 16h (z funkcją 0) zawsze mi działa. Ale postanowiłem sprawdzić co z wyświetlaniem i czy w zwykłym .com'ie zadziała ten sposób (pisanie do segmentu 0B800h). Niestety nie działa :-(

	org 7c00h			; lub     "org 0"

	start:
		mov	ax, 0b800h
		mov	es, ax		; ES = segment pamięci ekranu

		mov	byte [es:0], "1" ; piszemy "1"

		xor	ah, ah
		int	16h		; czekamy na klawisz

		mov	bx, 40h
		mov	ds, bx
		mov	word [ds:72h], 1234h	; 40h:72h = 1234h -
						; wybieramy gorący reset

		jmp	0ffffh:0000h		; reset

	times 510 - ($ - start) db 0		; dopełnienie do 510 bajtów
	dw 0aa55h				; znacznik

Nie wiem co jest grane, właściwie to pierwsze pytanie nie jest takie ważne, ale na reszcie bardzo mi zależy i liczę na waszą pomoc :-)
Z góry dzięki ;-)

0

Nie ustawiles segmentu kodu to po pierwsze, po drugie pamietaj ze w trybie 80x25 znak jest okreslany przez dwa bajty, jeden to sam znak, a drugi kolor tego znaku ;)

0

Jeszcze sygnatura ma byc w hexa, wiec:

0xAA55       ; x zjadles
0

@up - nie zjadł, dopisał na końcu 'h' - tak jak powinien.

Twojego asembler raczej nie łyknie...

0

Przepraszam za tak późną odpowiedź :)

t0m_k-tmp napisał(a)

Nie ustawiles segmentu kodu to po pierwsze, po drugie pamietaj ze w trybie 80x25 znak jest okreslany przez dwa bajty, jeden to sam znak, a drugi kolor tego znaku ;)

Próbowałem pisać do kilkunastu bajtów i z żadnym nie było efektu. Co do segmentu kodu idanych to ustawiać go nie muszę w tak małej aplikacji, a nawet w większej bo pisze przecież do bezwzględnego adresu pamięci ekranu :)

Więc czekam dalej dlaczego nie chce to działać ;-)

0
MSM napisał(a)

Na płytę kod nagrałem HexWorkshopem (bo Nero też nie posiadam...), tzn skopiowałem bajty do sektora 1. Wie ktoś może czemu BIOS nie rozpoznaje płyty jako boota?

Bo to tak nie działa. Ściągnij darmowy CDBurnerXP, ustaw odpowiednie opcje bootowalnej płytki i pójdzie.

0

No dobra, ja używałem tego programu i też nie działa (botuje, nie wyświetla).

Ale co robić żeby zaczęło wyświetlać to co wysyłam do segmentu pamięci ekranu (choćby w wykonywalnych programach typu com)? :D

0

Moze to Ci cos rozjasni:

[ORG 0x7C00]
			xor	ax, ax
			mov	ds, ax

			mov	ax, 0xB800	
			mov	es, ax		

			mov	di, 0x0100	
			mov	si, msg	
			mov	cx, dlg	
			rep	movsb	

			jmp	$		

		msg     db      "H",0x01,"e",0x02,"l",0x23,"l",0x32,"o",0x5b," ",
				    0x96,"W",0x62,"o",0x7d,"r",0x3e,"l",0x23,"d",0x67
		dlg     equ     $-msg

		times   510-($-$$)      db      0
		db      0x55
		db      0xAA

Adresujesz ekran ES:[DI] pamietaj o tym ;)

0 użytkowników online, w tym zalogowanych: 0, gości: 0