Administració i Manteniment de Sistemes i Aplicacions (AMSA)
No bootable device) en l’etapa on probablement ha fallat.De CPU reset a bootloader

El sistema operatiu no pot carregar-se a si mateix. Algú l’ha de carregar primer.
CPU reset \[\Downarrow\] firmware \[\Downarrow\] bootloader \[\Downarrow\] kernel

Adreça on la CPU busca la primera instrucció després d’un reset. La fixa l’arquitectura (o la implementació), no el sistema operatiu.
x86, estat després del reset:
CS.selector = 0xF000
CS.base = 0xFFFF0000
EIP = 0x0000FFF0
──────────────────────────────────────
1a instrucció a base + EIP = 0xFFFFFFF0
Aquesta adreça la serveix el xip flash SPI que conté el firmware: el chipset el mapeja a l’espai d’adreces de la CPU. La primera instrucció sol ser un jmp al codi d’entrada del firmware.
La CPU no comença executant el kernel. Comença executant codi de firmware en una ubicació definida per l’arquitectura.


El firmware no és el sistema operatiu: prepara la màquina i cedeix el control al primer codi que carrega.
BIOS i UEFI són dos models de firmware i d’interfície d’arrencada. Difereixen en:
Respondrem aquestes quatre preguntes primer per al BIOS (bloc B) i després per a UEFI (bloc C).

Primer sector (512 B, LBA 0) del dispositiu d’arrencada, acabat en la signatura 0x55 0xAA (bytes 510 i 511).
55 AA.0x7C00–0x7DFF.0x7C00: transfereix el control al codi carregat.Load address = 0x7C00
0x7C00 és una convenció del BIOS de l’IBM PC, no una propietat de la CPU.

$ = posició actual,$$ = inici de la secció.dw 0xaa55 es guarda en little-endian: primer 55, després AA.En el model BIOS, el primer sector és el boot sector. Només quan el disc té taula de particions MBR, aquest sector és també l’MBR.

Només tres adreces ens importen ara mateix:
0x7C00 → Stage 1 (on el carrega el BIOS)0x8000 → Stage 2 (on el carregarem nosaltres)0xA0000 → vídeo (no hi escriurem per error)La regió entre el boot sector i l’EBDA és convencionalment disponible per al bootloader, subjecta a les regions reservades del sistema.
segment:offset
físic = segment × 16 + offset
0000:7C00 → 0x00000 + 0x7C00 = 0x07C00
07C0:0000 → 0x07C00 + 0x00000 = 0x07C00
Les dues formes apunten a la mateixa adreça física, però el BIOS no garanteix quina d’elles fa servir. Amb org 0x7c00, els salts absoluts pressuposen CS = 0.
![A dalt, configuració correcta: el codi NASM porta [org 0x7C00] (link address), s'assembla a un .bin, el BIOS el carrega a 0x7C00 (load address) i les etiquetes calculades coincideixen amb l'adreça de càrrega. A sota, configuració incorrecta: el codi NASM porta [org 0x8000], però el BIOS continua carregant el boot sector a 0x7C00. Les etiquetes s'han calculat amb base 0x8000, de manera que mov si, msg apunta a 0x8000 més un desplaçament, una zona de la RAM fora del boot sector que no conté el missatge (fletxa vermella discontínua). Els salts relatius no es veuen afectats.](figures/load-vs-link.png)
Què passa si el programa assumeix 0x8000 però el firmware el carrega a 0x7C00?
Les referències absolutes (dades, salts far) apunten a un altre lloc. Els salts relatius segueixen funcionant, per això l’error pot ser subtil.
El programa s’ha de construir assumint l’adreça on serà carregat.
0x7C00DL = número de la unitat d’arrencada (convenció)CS:IP concret (0000:7C00 o 07C0:0000)DS i ES correctes per al nostre programaSS/SP útilsLa primera feina de Stage 1 és construir un entorn mínim conegut.
![Codi NASM d'inicialització del boot sector, instrucció per instrucció: cli, xor ax ax, mov ds ax, mov es ax, mov [boot_drive] dl, mov ss ax (marcada amb una advertència: convé fer-ho amb interrupcions deshabilitades), mov sp 0x7c00, sti i la variable boot_drive al final del fitxer. Als costats: per què cli abans de canviar SS:SP, l'advertència sobre mov ss amb interrupcions habilitades, la pila a 0x7C00 com a elecció nostra i no una regla del BIOS, i un mini-mapa de memòria amb adreces baixes a dalt on la pila creix cap a adreces més baixes, per sobre del boot sector.](figures/fig10.png)

Stage 1:
512 B no són suficients per a controladors de sistemes de fitxers, menús, etc. Stage 1 només carrega la següent etapa, no el sistema operatiu.

LBA 2048 no és l’adreça 0x2048: és el sector número 2048 del disc (2048 × 512 B = 1 MiB).
0x7C00 és la convenció del BIOS i 0x8000 i LBA 2048 són una elecció nostra. El BIOS només carrega el sector 0.

INT 13h, AH = 0x42 — lectura de disc estesa (LBA):
INT 10h, AH = 0x0E — escriure un caràcter:

Stage 1 carrega Stage 2 i li transfereix el control. Cada etapa s’assembla amb l’org de la seva adreça de càrrega: Stage 1 → 0x7C00, Stage 2 → 0x8000.
Un missatge apunta al punt on probablement ha fallat l’arrencada, però no determina una única etapa. Per exemple, No bootable device pot ser: (a) sense signatura 55 AA vàlida al sector 0, (b) ordre d’arrencada apuntant a un altre dispositiu, o (c) mode BIOS/UEFI incompatible amb el disc.

En el model BIOS que estudiem, el firmware carrega directament un sector. En UEFI, el firmware disposa d’una interfície de sistema de fitxers i pot carregar una aplicació EFI, que en x86-64 s’executa en long mode (64 bits).

.EFI: executable en format PE/COFF.BOOTX64.EFI: ruta de fallback per a x86-64.En Linux, l’ESP sol muntar-se a /boot/efi. Les entrades de NVRAM (Part 2) tenen prioritat sobre la ruta de fallback.

Una aplicació EFI és un executable PE/COFF. El format conté la informació perquè el loader pugui carregar-la en memòria i aplicar relocacions quan calgui.
SystemTable
El firmware ofereix serveis mitjançant una taula de punters, no interrupcions.


Mateix problema. Diferent contracte.
0xFFFFFFF0), on el chipset mapeja el xip flash que el conté, no la RAM.55 AA) carregat a 0x7C00, en mode real, amb DL = unitat.SystemTable.