Domanda

Attualmente sto leggendo il boot.s File nella fonte per il primo kernel Linux in assoluto (supponendo che 0,01 sia effettivamente la prima versione pubblica).

Conosco C e ASM, il secondo considerevolmente meno del primo. Anche così, mi sembra di essere in grado di capire e essenzialmente cogliere il codice nei file di origine.

Questo file mi ha confuso però. Ora mi rendo conto che è perché è in modalità reale, non in modalità protetta. Inutile dire che non ho mai visto il codice ASM scritto in modalità reale prima. La modalità protetta era la modalità Defacto X86 OSES corse prima ancora di nascere, quindi è prevedibile.

Ecco una routine che voglio capire meglio:

/*
 * This procedure turns off the floppy drive motor, so
 * that we enter the kernel in a known state, and
 * don't have to worry about it later.
 */
kill_motor:
    push dx
    mov dx,#0x3f2
    mov al,#0
    outb
    pop dx
    ret

Alzando gli occhi outb, Trovo che sia usato per passare i byte alle porte sul computer. Ricorderò un'ipotesi basata sulla documentazione C che questo scenario passa il byte "Stop Motor" come primo argomento e come numero di porta di unità floppy come secondo.

Questa interfaccia è fornita dal BIOS? O dall'unità floppy direttamente? Suppongo che il BIOS abbia "driver" frugali per un funzionamento molto semplice di tutti i dispositivi fondamentali.

Ecco dove sono sconcertato: sembra che i numeri siano come #0x3f2 vengono estratti dal nulla. Sono chiaramente numeri di porta hardware o qualcosa del genere. Questo file è cosparso di tali numeri, senza spiegazioni a cosa si riferiscono. Dove posso trovare un riferimento completo che mostra tutte le porte hardware e i numeri di controllo che possono ricevere dalla modalità reale? Inoltre, sembra che il file sposta il kernel in memoria durante i processi di avvio, con indirizzi di memoria con codifica dura. Dove posso trovare una guida per quali intervalli di indirizzo sono disponibili per scrivere in modalità reale?

Ho anche letto un commento di Linus sulla riprogrammazione degli interrupt per evitare una collisione tra il BIOS e gli interrupt hardware interni. Non mentirò, mi è andato proprio sopra la mia testa.

L'aiuto sarebbe fantastico; Google sembra scarso sull'argomento, nel caso ti stia chiedendo.

È stato utile?

Soluzione

In primo luogo, benvenuto nel mondo dell'assemblatore RealMode! Probabilmente ti sei già reso conto che l'assemblatore effettivo è più o meno lo stesso tra RealMode e la modalità protetta: le differenze primarie sono le dimensioni dell'opera e la gestione/gestione della memoria.

Ci sono alcune risorse per RealMode là fuori su Internet: devi solo cacciarle! Una risorsa molto importante è L'interrupt di Ralf Brown Elenco (noto come RBIL): fornisce molte informazioni sui vari interrupt utilizzati nella programmazione RealMode. Un altro è Bioscentrale Mappa di memoria CMOS che descrive quali informazioni il BIOS memorizza (o dovrebbe archiviare) in varie posizioni di memoria.

Per rispondere ad alcune delle tue domande sul codice Linux che hai pubblicato:outb è l'istruzione per scrivere il byte in al a portare dx - 0x3f2 è la porta del controller floppy. Wikipedia Può aiutarti con l'elenco di base dei numeri di porta X86, ma dovrai scavare per informazioni dettagliate sul formato effettivo del al bit.

Quali intervalli di indirizzo di memoria sono disponibili per scrivere durante il RealMode?

Dovresti fare qualche ricerca su Int 15H, AX = E820H - Restituisce una mappa di memoria che descrive quali aree di memoria possono essere utilizzate e quali sono riservate. Prendi nota però: quando si guarda gli interrupt, è importante vedere quanto sono "nuovi" perché le biosi più vecchie potrebbero non supportarli.

... Riprogrammazione interruzioni per evitare una collisione tra il BIOS e gli interrupt hardware interni

Molti dispositivi hardware hanno interrupt programmabili (che vengono utilizzati per servire l'hardware quando necessita di attenzione). In genere il BIOS risolverà un incarico iniziale durante le sue routine di avvio, ma non è insolito che OS racherrà gli interruzioni dell'hardware per i propri scopi o per prevenire incompatibilità note.

Un'ultima nota: it seems that numbers like #0x3f2 are being pulled out of thin air. La risposta è si. Gran parte della fonte di stivale Linux è orribile (sì, è solo la mia opinione) e sembra cospargere un indirizzo apparentemente casuale, numeri di porta e altri bit senza alcuna spiegazione significativa. Resta con esso, cerca altre risorse RealMode e alla fine avrà senso. Oh, e se ti imbatti in un Riferimento completo - Dillo a tutti (perché attualmente non esiste).

Altri suggerimenti

Questi indirizzi sono stati lanciati in pietra 30 anni fa quando IBM ha rilasciato il primo PC IBM. 0x3f0 è il primo indirizzo per i registri del controller disco floppy primari. Un elenco di indirizzi è disponibile qui.

Una mossa insolita da parte del team di progettazione IBM è stata che hanno messo insieme la macchina da parti standard. La maggior parte dei chip proveniva da Intel, il controller del disco floppy era un design NEC. Garantire involontariamente tutti potrebbe costruire un clone. Tali cloni hanno utilizzato gli stessi indirizzi per garantire la compatibilità del software, trasformando la scelta IBM in uno standard del settore che potrebbe essere codificato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top