2009-06-27 6 views
12

Je sais qu'au démarrage, le BIOS charge le premier secteur (512 octets) d'un lecteur de périphérique prédéfini sur la mémoire 0x7c00, puis saute à cette adresse.Quelles informations le BIOS charge-t-il dans la RAM?

Ainsi, la mémoire de 0x7c00 à 0x7dff est occupée. Y a-t-il une autre section de RAM qui est occupée? Si je suis en train de programmer un système d'exploitation, est-ce que je peux utiliser toute la RAM sauf 0x7c00 à ox7dff à mes propres fins ?, ou y at-il une autre section remplie d'informations "précieuses" au démarrage que je ne dois pas écraser ?

Je sais qu'à un moment donné, je peux écraser MBR chargé en mémoire (chainloading), ma question est centrée sur ... quelle partie de la mémoire est disponible pour un système d'exploitation?

Désolé pour mon mauvais anglais. Merci pour vos réponses !!

Répondre

0

Si vous écrivez un système d'exploitation, dès que vous passez en mode protégé, vous oubliez le BIOS (sauf si vous travaillez avec un périphérique défectueux) et utilisez tout ce que vous avez.

Ou écrivez-vous un chargeur de démarrage?

+0

Vous ne pouvez pas oublier le BIOS. Il peut avoir besoin de certaines zones de mémoire protégées pour les régions MMIO, ou pour une utilisation par le code SMM. – bdonlan

+0

De nombreuses zones de mémoire physiques ne sont pas utilisables spécifiquement avec du matériel mappé en mémoire. – clemahieu

7

Avec tout BIOS récent, vous pouvez obtenir des informations sur la carte mémoire en utilisant le BIOS Int 15/AX=E820h call. Cela vous dira quelle mémoire vous pouvez utiliser pour votre système d'exploitation.

Une explication plus détaillée sur comment detect available memory, et le contenu du BIOS memory map peut être trouvé à OSDev.

8

Le mode réel x86 Memory Map est la suivante:

- 0x00000000 - 0x000003FF - Real Mode Interrupt Vector Table 
- 0x00000400 - 0x000004FF - BIOS Data Area 
- 0x00000500 - 0x00007BFF - Unused 
- 0x00007C00 - 0x00007DFF - Our Bootloader 
- 0x00007E00 - 0x0009FFFF - Unused 
- 0x000A0000 - 0x000BFFFF - Video RAM (VRAM) Memory 
- 0x000B0000 - 0x000B7777 - Monochrome Video Memory 
- 0x000B8000 - 0x000BFFFF - Color Video Memory 
- 0x000C0000 - 0x000C7FFF - Video ROM BIOS 
- 0x000C8000 - 0x000EFFFF - BIOS Shadow Area 
- 0x000F0000 - 0x000FFFFF - System BIOS 

Dans ma vraie programmation en mode je colle habituellement de 0x00007E00 - 0x0009FFFF (Pas tout) .. J'utilise le segment: offset d'adressage à utiliser la mémoire .. pour passer d'une étape 1 bootloader à un noyau ou une bootloader 2ème étape, j'utilise:

; bootloader.s 

BITS 16 
ORG 0x7C00 

    CLI 
    JMP 0xE000  ; Can also be JMP 0x7C00:200 
    HLT 

TIMES 510 - ($-$$) DB 0 
DW 0xAA55 

-

; Something.s 

BITS 16 
ORG 0x7E00  ; Can also be ORG 0x7C00:200 

; Code goes here for your purposes.. whether it be a 2nd stage 
; bootloader or your 16bit kernel.. 

CLI 
HLT 

Si vous allez en mode protégé, vous aurez toujours besoin d'un talon comme indiqué ci-dessus .. Dans Something.s, vous pouvez programmer dans vos routines en mode protégé (GDT, A20, Set mode vidéo, etc.)

Pour expliquer l'emplacement de la mémoire à 0x7C00 (Bootloader Entry Point), 0x7C00 - 0x7DFF est l'endroit où vous placez votre bootloader (le bootloader.s ci-dessus). Vous le placez là parce que le BIOS saute à cet endroit après avoir fait ses routines. Le bootloader doit avoir une taille de 512 octets (remarquez la directive TIMES). À partir de là, votre code peut être de n'importe quelle taille (tant qu'il tient dans la carte mémoire), et vous serez en mesure de travailler entièrement sur l'OS.

Si vous partez en mode protégé 32 bits, vous serez en mesure d'utiliser N'IMPORTE QUOI à propos de la marque 1MiB.

+0

Je n'ai pas remarqué la date avant que je poste .. Désolé d'avoir ramené cela. –

+1

"- 0x00007E00 - 0x0009FFFF - Non utilisé" - Ce n'est pas tout à fait vrai. La plage garantie est 0x00007E00 - 0x0007FFFF.Au-dessus de cette plage, vous aurez l'EBDA (généralement à 0x0009FC00 - \t 0x0009FFFF, mais je l'ai déjà vu à 0x00096C00 et d'autres emplacements) et potentiellement du code BIOS. Certains BIOS ont un code de démarrage PXE dans cette plage. Une approche conservatrice consiste à éviter tout ce qui est au-dessus de 0x00080000. – Timo

Questions connexes