View Full Version : [assembler] boot loader e kernel
ragazzi ho creato un piccolo programmino che chiede all'utente di premre un tasto per riavviare il pc e mi sono preso il lusso di chiamarlo kernel, in quanto la mia idea è che dato un bootloader che indichi al bios cosa caricare mi faccia partire il programma in questione. Ora ecco il punto come si fa ad istallare il boot loader ed il kernel rispettivamente nel settore 1 e 2? e come indico al bootloader il caricamento del kernel?
up niente ragazzi quanche esperto di codice macchina?
cdimauro
22-04-2009, 05:57
Leggi qui (http://en.wikipedia.org/wiki/Master_boot_record#Programming_Considerations).
Ma ti consiglio di fare le prove con una macchina virtuale, perché andare a sostituire l'MBR è pericoloso, visto che contiene anche le informazioni sulle partizione del disco rigido.
Comunque nel link c'è spiegato anche come rimpiazzare l'MBR in maniera corretta.
Grazie pytoniano vedo :D puretroppo in rete non si trova molto grazie per il link mi sarà di sicuro utile guarda ho kiesto a tutti i miei prof della mia scuola e nessuno sa nulla incredibile :D
cdimauro
22-04-2009, 12:52
Mi pare difficile che un prof di scuola sia a conoscenza di roba come questa. :D
Aiuto nulla di fatto e se invece volessi usare un programma che scrive in un floppy ad un settore specifico quale potrei usare?
cdimauro
26-04-2009, 21:55
In mente non me ne viene nessuno al momento.
Ma realizzarne uno ad hoc dovrebbe essere cosa facile. Ai tempi del DOS si scriveva con poche righe in Turbo Pascal, sfruttando direttamente le apposite API che il BIOS metteva a disposizione per (leggere e) scrivere i settori di un qualunque dispositivo.
DanieleC88
26-04-2009, 23:30
http://en.wikipedia.org/wiki/RaWrite
http://en.wikipedia.org/wiki/RaWrite2
Se sei su Linux basta un uso saggio di dd.
ciao ;)
Ragazzi ho trovato un "writebin" e ha funzionato infatti il floppy avvia il pc e stampa una bella scitta XD mi vorrei cimentare nello scrivere io stesso un programma k scriva il file il problema è ke nopn capisco la struttura di questi programmi cioè sarebbe semplice indicare il file da scrivere in una stringa e poi darlo a qualche comando il problema è ke non c'è nulla del genere c'è solo l'istruzione di scrittura di un settore senza riferimenti per quale file scrivere.
guardate http://www.htl-steyr.ac.at/~morg/pcinfo/hardware/interrupts/inte6xps.htm
cdimauro
28-04-2009, 09:24
Ottimo. :D
Quella è la funzione del BIOS di cui ti parlavo, ma ovviamente devi passarle il buffer da scrivere, e quello devi averlo già riempito coi dati letti da un file.
Guarda, in Turbo Pascal è roba che si realizza in pochi minuti. Ma ormai sono LEGGERMENTE arrugginito con questo linguaggio/IDE. :D
in Windows é sufficiente aprire la periferica del floppy con CreateFile passando la stringa "\\\\.\\A:" al parametro lpFileName e a quel punto ci puoi scrivere anche con WriteFile. piccolo hack: dal momento che le funzioni dei runtime C e C++ sono basate sulle API, funziona anche con fopen e col costruttore di std::ostream :asd:
comunque leggi qui al paragrafo "Physical Disks and Volumes":
http://msdn.microsoft.com/en-us/library/aa363858.aspx
cavolo è vero col C++ fopen e poi scriverlo nel settore 1 grandioso ragazzi. Mi si è presentato un altro problema i caratteri stampati sono strani probabilmente non vengono riconosciuti da BIOS uff chae lavoraccio
StateCity
28-04-2009, 23:10
il problema è che a macchina nuda, il sistema riconosce solo,
testina, settore e traccia del floppy... quindi nessun filesystem e roba del genere.. :rolleyes:
Scrivere il boot sector è facile, basta prendere gli esadecimali del compilato semplice
che rientra nelle dimensioni di 512 byte.. :rolleyes:
Per i caratteri bisognerebbe utilizzare l'int 10 della VGA.. :rolleyes:
cdimauro
29-04-2009, 04:52
cavolo è vero col C++ fopen e poi scriverlo nel settore 1 grandioso ragazzi. Mi si è presentato un altro problema i caratteri stampati sono strani probabilmente non vengono riconosciuti da BIOS uff chae lavoraccio
Mi sembra normale: al reset la VGA carica il set di caratteri del DOS. :D
mmm se carica il DOS quindi gli ascii??? gli ho dato i codici ascii in un v ettore e stampati con un loop con l int10h servizio elementare ma il cursore cammina e non si vede nulla mentre se uso il servizio stampa stringhe escono simboletti strani se volete posto il codice
cdimauro
30-04-2009, 07:30
Mi sembra strano. Posta il codice, così vediamo se riusciamo a cavare fuori qualcosa.
#make_boot
org 7c00h
jmp inizio
pre db 'A cura di xxxxxxxxxxx xxxxxx',0
func db 'Inserisci h per la lista funzioni',0
rebo db '1-reboot, premere o per continuare',0
inizio:
stringa1:
lea bp,pre ;caricamento dell'indirizzo della stringa
mov ah,13h ;servizio stampa stringhe
mov al,01h ;setta lo spostamento del cursore e attributi
mov bh,0h ;pagina 1
mov bl,0fh ;colore bianco
mov cx,28 ;caratteri
mov dx,0h ;inizio stringa
int 10h
posizione1:
;mov ah,03h ;calcolo posizione cursore
;int 10h
inc dh ;riga successiva
mov dl,0h
mov ah,02h ;setta posizione cursore
int 10h
stringa2:
lea bp,func
mov ah,13h ;servizio stampa stringhe
mov al,01h ;setta lo spostamento del cursore e attributi
mov bh,0h ;pagina 1
mov bl,0fh ;colore bianco
mov cx,34 ;caratteri
int 10h
posizione2:
mov dh,17h
mov dl,0h
mov ah,02h ;setta posizione
int 10h
carattere:
mov cx,01h
mov ah,09h
mov al,'\' ;stampa \
mov bl,0fh
int 10h
cursore3:
inc dl ;colonna successiva
mov ah,02h ;setta posizione cursore
int 10h
input:
mov ah,00h ;servizio input
int 16h
cmp ah,23h ;controllo numero h
je stringa3
cmp ah,4fh ;controllo 1
je reboot
jne input
stringa3:
lea bp,rebo
mov ah,13h ;servizio stampa stringhe
mov al,0h ;setta lo spostamento del cursore e attributi
mov bh,0h ;pagina 1
mov bl,0fh ;colore bianco
mov cx,35 ;caratteri
int 10h
cursore4:
inc dh ;colonna successiva
mov ah,02h ;setta posizione cursore
int 10h
input1:
mov ah,00h ;servizio input
int 16h
cmp ah,18h
je input
jne input1
reboot:
int 19h
HLT ; halt!
cdimauro
01-05-2009, 06:46
A me sembra tutto corretto.
Senti, puoi fare una prova più specifica? Stampa tutti i caratteri a gruppi di 32 con entrambe le funzioni (quella di stampa stringa e di stampa singolo carattere).
Così otterrai una griglia 32x8 realizzata con la prima funzione, e sotto un'altra 32x8 realizzata con l'altra.
In questo modo visualizzerai l'intero charset e ti sarà più facile vedere a occhio le differenze, e riportarle.
Questo forse è ciò k intendevi stampa i caratteri alfanumerici e i numeri in 4 diversi servizi del dos e ti poosto un immagine col risultato ogni riga è uns ervizio di stampa diversa,
#make_boot#
org 7c00h ; set location counter.
; add your code here
jmp inizio
msg db 'abcdefghilmnopqrstuvz0123456789\',0
msg1 db 97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,48,49,50,51,52,53,54,55,56
inizio:
lea bp,msg
mov ah,13h
mov al,01h
mov dx,0h
mov cx,32
mov bh,0h ;pagina 1
mov bl,0fh ;colore bianc
int 10h
parte2:
mov ah,02h
inc dh
mov dl,0h
int 10h
mov si,0h
ciclo:
mov ah,09h
mov al,msg[si]
inc si
mov cx,01h
int 10h
mov ah,02h
inc dl
int 10h
cmp si,32
jne ciclo
mov ah,02h
inc dh
mov dl,0h
int 10h
mov si,0h
ciclo1:
mov ah,0eh
mov al,msg[si]
inc si
mov cx,01h
int 10h
mov ah,02h
inc dl
int 10h
cmp si,32
jne ciclo1
parte3:
mov ah,02h
inc dh
mov dl,0h
int 10h
mov si,0h
ciclo2:
mov ah,0ah
mov al,msg[si]
inc si
mov cx,01h
int 10h
mov ah,02h
inc dl
int 10h
cmp si,32
jne ciclo2
parte4:
lea bp,msg1
mov ah,13h
mov al,01h
mov dl,0h
inc dh
mov cx,32
mov bh,0h ;pagina 1
mov bl,0fh ;colore bianc
int 10h
input:
mov ah,00h
mov bh,0h
int 16h
cmp al,61h
jne input
INT 19h ; reboot
http://img60.imageshack.us/img60/5958/dso.jpg
rеpne scasb
01-05-2009, 21:39
■
rеpne scasb
01-05-2009, 21:47
■
Cosi' non puo' funzionare. Al boot ES non vale CS.
ehm forse nn ne so abbastanza ma nn capisco, forse vuoi dire che non è CS che deve essere settato a 7c00?
Aggiungo: non utilizzare l'int 19h per il reboot ma fai un salto a 0FFFFh:0000h ponendo prima 1234h in 0000h:0472h (se vuoi un cold boot mettici 0000h).
Dato che ci sei aggiungi il codice anche per spegnere il PC:
mov ax,5301h
xor bx,bx
int 15h
mov ax,530Eh
mov cx,102h
int 15h
mov ax,5307h
mov bl,1h
mov cx,3h
int 15h
guarda per programmare uso l'emu 8086 perchè mi da in anteprima il risultato e non è supportato l'interrupt 15 magari lo aggiungo con il MASM
rеpne scasb
01-05-2009, 22:10
■
rеpne scasb
01-05-2009, 22:12
■
Chissa' cosa succede all'APM-off da dentro un emulatore. Magari si chiude la virtual machine.
o magari esce una bella scritta k ti indica ke l'interrupt nn è supportato :D :D cosa che accade
Stai utilizzando la funzione 13h dell int 10h per stampare una stringa. In ES:BP c'e' il puntatore alla stringa da stampare. Devi caricare correttamente ES, altrimenti stampera' una sequela di caratteri a casaccio. Per caricare correttamente ES devi fare in modo che sia uguale a CS. Quindi nel punto "inizio:" aggiungi un mov ax,cs e un mov es,ax.
faccio la modifica e vi aggiorno
Stai utilizzando la funzione 13h dell int 10h per stampare una stringa. In ES:BP c'e' il puntatore alla stringa da stampare. Devi caricare correttamente ES, altrimenti stampera' una sequela di caratteri a casaccio. Per caricare correttamente ES devi fare in modo che sia uguale a CS. Quindi nel punto "inizio:" aggiungi un mov ax,cs e un mov es,ax.
Gandissimo 6 un mito grazie ora lo stampa :D:D
rеpne scasb
01-05-2009, 22:21
■
vi ringrazio dell'aiuto ora va tutto liscio ora vorrei sapere come si fa a dire in che indirizzo di memoria caricare il buffer del settore 2 per poi eseguirlo utilizzando il seguente interrupt
Input AH 02h
AL numero di settori da leggere
CH numero della traccia di partenza (10 bit[7])
CL numero del settore di partenza
DH numero della testina (cioè del lato)
DL numero del drive (0 = A:)
ES:BX indirizzo (seg:off) del buffer in cui vengono memorizzati i settori letti
cdimauro
02-05-2009, 05:40
Come c'è scritto nel link che ti ho postato all'inizio del thread, a questo punto hai praticamente tutta la memoria a disposizione, a partire dall'indirizzo 0x00501 fino a 0x9FFFF.
In pratica sono quasi tutti i primi 640KB, tranne la manciata di byte che sono usati dal BIOS. All'indirizzo 0xA0000 parte il l'area riservata alla VGA, e a seguire altre aree riservate, quindi è meglio non arrivare fin qui.
A quanto leggo MS fa partire il suo codice da 0x00600, quindi se vuoi seguire la stessa strada puoi impostare il segmento ES a 0x0060 e BX a 0 per caricare lì i dati dal settore 2 in poi. Per impostare il segmento ES fai così:
MOV AX,0060H
MOV ES,AX
Sta soltanto attento a non sovrascrivere l'indirizzo 7C00H in cui si trova la tua routine. :D
ma una volta caricato in memoria un pezzo di codice per eseguirlo bisogna fare una JUMP all'indirizzo di memoria di inizio del codice?
cdimauro
02-05-2009, 14:03
Sì.
Grz a tutti per l'aiuto secondo voi cosa potrei aggiungere?ho bisogno di spunti XD
cdimauro
04-05-2009, 20:14
Comincia a elencare le periferiche PCI disponibili, e le loro informazioni.
Poi puoi passare a una forza primitiva di kernel. :cool:
caspita bella discussione
peccato/per fortuna che ho abbandonato secoli fa assembler :)
In settimana presenterò il progetto al prof di sistemi speriamo apprezzi XD cavolo poi si passerà alla creazione dei moduli, tipo gestione periferiche, disco, memoria ecc... studierò studierò XD
cdimauro
07-05-2009, 10:12
Se non apprezzo questo, non so cosa potrebbe "smuoverlo". :p
Buon divertimento! :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.