Mi piacerebbe creare un kernel incorporato per una macchina x86 usando Visual C++. Ho alcuni file di codice assembly e C da compilare e mi piacerebbe collegarli tutti insieme in un modo che sia compatibile con un bootloader Multiboot come GRUB.Come si costruisce un'immagine del kernel usando Visual Studio?
risposta
OSDev ha un wiki entry on Visual Studio, che potrebbe fornire qualche informazione, in particolare con i link ai Kaushik Srenevasan di blogentries sul tema del kernel PE progettate per essere caricato da bootloader multiboot-based (come GRUB).
un paio di grandi, ampio colpi cose che dovreste sapere:
- Nell'intestazione multiboot, è necessario utilizzare il kludge AOUT.
- È necessario specificare l'argomento/BASE: 0x100000 sul linker, quindi il codice binario finale è basato sul punto in cui il bootloader lo inserisce.
- Il punto di ingresso del tuo kernel (di solito chiamato "
kmain
") deve avere__declspec(noreturn)
su di esso e sarà necessario eseguire un__asm { hlt }
anziché restituirlo.
Copia-e-incolla non funziona qui, ma indica l'errore: sembra "... kernel-using% 5F03.html", ma dovrebbe essere "... kernels-using_03.html". –
Non so perché, ma sto copiando e incollandolo dalla barra degli indirizzi qui, e ha un letterale '_' quando modifico - SO sembra che lo stia sostituendo per qualsiasi motivo. –
Ok, ho inviato una e-mail al Team SO, e hanno sottolineato che ci sono altri modi per creare un collegamento, quindi l'ho passato a uno che funziona. –
Sei davvero sicuro di voler percorrere il percorso MSVC? È un ottimo compilatore, ma penso che sarebbe molto più semplice con GCC/MingW –
Penso che GCC/MinGW genererà anche eseguibili PE. Dovrò apportare le modifiche necessarie per ELF a PE in entrambi gli ambienti. VS è proprio un piacere usare, penso che lo preferirei. –