Come eseguire un programma senza un sistema operativo?


239

Come si esegue un programma da solo senza un sistema operativo in esecuzione? È possibile creare programmi di assemblaggio che il computer può caricare ed eseguire all'avvio, ad esempio avviare il computer da un'unità flash ed eseguire il programma che si trova sulla CPU?


4
Su quale architettura? x86? BRACCIO?
Kissiel,

1
Stavo parlando in generale, ma molto probabilmente x86 o x64
user2320609,

2
sì, è esattamente così che si avviano i processori. non deve essere assemblato, C è spesso usato con un po 'di asm per un bootstrap e forse qualche altro supporto.
old_timer,

24
Pensaci: se non ci fosse tale capacità, come si avvia e si avvia il sistema operativo stesso? :)
Seva Alekseyev il

Risposte:


153

Come si esegue un programma da solo senza un sistema operativo in esecuzione?

Metti il ​​tuo codice binario in un posto dove il processore cerca dopo il riavvio (ad es. Indirizzo 0 su ARM).

È possibile creare programmi di assemblaggio che il computer può caricare ed eseguire all'avvio (ad es. Avviare il computer da un'unità flash ed esegue il programma che si trova sull'unità)?

Risposta generale alla domanda: si può fare. Viene spesso definita "programmazione bare metal". Per leggere dall'unità flash, vuoi sapere cos'è l'USB e vuoi avere un driver che funzioni con questo USB. Il programma su questa unità dovrebbe anche essere in un formato particolare, su un particolare filesystem ... Questo è qualcosa che i caricatori di avvio di solito fanno, ma il tuo programma potrebbe includere il proprio bootloader quindi è autonomo, se il firmware solo carica un piccolo blocco di codice.

Molte schede ARM ti consentono di fare alcune di queste cose. Alcuni hanno boot loader per aiutarti con la configurazione di base.

Qui puoi trovare un ottimo tutorial su come eseguire un sistema operativo di base su un Raspberry Pi.

Modifica: questo articolo e l'intero wiki.osdev.org risponderanno alla maggior parte delle tue domande http://wiki.osdev.org/Introduzione

Inoltre, se non vuoi sperimentare direttamente sull'hardware, puoi eseguirlo come una macchina virtuale usando hypervisor come qemu. Scopri come eseguire "ciao mondo" direttamente sull'hardware ARM virtualizzato qui .


723

Esempi eseguibili

Creiamo ed eseguiamo alcuni minuscoli programmi di bare metal hello world che funzionano senza un sistema operativo su:

Li proveremo anche sull'emulatore QEMU il più possibile, poiché è più sicuro e più conveniente per lo sviluppo. I test QEMU sono stati su un host Ubuntu 18.04 con il QEMU preconfezionato 2.11.1.

Il codice di tutti gli esempi x86 di seguito e altro è presente in questo repository GitHub .

Come eseguire gli esempi su hardware reale x86

Ricorda che eseguire esempi su hardware reale può essere pericoloso, ad esempio potresti cancellare per errore il tuo disco o bloccare l'hardware: fallo solo su macchine vecchie che non contengono dati critici! O ancora meglio, usa devboard semi-usa e getta economici come il Raspberry Pi, vedi l'esempio ARM di seguito.

Per un tipico laptop x86, devi fare qualcosa del tipo:

  1. Masterizza l'immagine su una chiavetta USB (distruggerà i tuoi dati!):

    sudo dd if=main.img of=/dev/sdX
    
  2. collegare l'USB su un computer

  3. accendilo

  4. digli di avviarsi dall'USB.

    Ciò significa che il firmware deve selezionare USB prima del disco rigido.

    Se questo non è il comportamento predefinito del tuo computer, continua a premere Invio, F12, ESC o altre chiavi così strane dopo l'accensione fino a quando non ottieni un menu di avvio in cui è possibile selezionare per l'avvio da USB.

    Spesso è possibile configurare l'ordine di ricerca in quei menu.

Ad esempio, sul mio T430 vedo quanto segue.

Dopo l'accensione, questo è quando devo premere Invio per accedere al menu di avvio:

inserisci qui la descrizione dell'immagine

Quindi, qui devo premere F12 per selezionare l'USB come dispositivo di avvio:

inserisci qui la descrizione dell'immagine

Da lì, posso selezionare l'USB come dispositivo di avvio in questo modo:

inserisci qui la descrizione dell'immagine

In alternativa, per cambiare l'ordine di avvio e scegliere l'USB che abbia una precedenza più alta, quindi non devo selezionarlo manualmente ogni volta, vorrei premere F1 nella schermata "Startup Interrupt Menu", quindi navigare a:

inserisci qui la descrizione dell'immagine

Settore di avvio

Su x86, la cosa più semplice e di livello più basso che puoi fare è creare un Master Boot Sector (MBR) , che è un tipo di settore di avvio , e quindi installarlo su un disco.

Qui ne creiamo uno con una sola printfchiamata:

printf '\364%509s\125\252' > main.img
sudo apt-get install qemu-system-x86
qemu-system-x86_64 -hda main.img

Risultato:

inserisci qui la descrizione dell'immagine

Nota che anche senza fare nulla, alcuni personaggi sono già stampati sullo schermo. Quelli sono stampati dal firmware e servono per identificare il sistema.

E sul T430 abbiamo solo uno schermo vuoto con un cursore lampeggiante:

inserisci qui la descrizione dell'immagine

main.img contiene quanto segue:

  • \364in ottale == 0xf4in esadecimale: la codifica di hltun'istruzione, che indica alla CPU di smettere di funzionare.

    Pertanto il nostro programma non farà nulla: solo avviare e arrestare.

    Usiamo ottale perché i \xnumeri esadecimali non sono specificati da POSIX.

    Potremmo ottenere facilmente questa codifica con:

    echo hlt > a.S
    as -o a.o a.S
    objdump -S a.o
    

    che produce:

    a.o:     file format elf64-x86-64
    
    
    Disassembly of section .text:
    
    0000000000000000 <.text>:
       0:   f4                      hlt
    

    ma è anche documentato nel manuale Intel ovviamente.

  • %509sprodurre 509 spazi. Necessario per compilare il file fino al byte 510.

  • \125\252in ottale == 0x55seguito da 0xaa.

    Questi sono 2 byte magici richiesti che devono essere byte 511 e 512.

    Il BIOS passa attraverso tutti i nostri dischi alla ricerca di quelli avviabili e considera avviabili solo quelli che hanno quei due byte magici.

    Se non presente, l'hardware non lo tratterà come un disco di avvio.

Se non sei un printfmaestro, puoi confermare il contenuto di main.imgcon:

hd main.img

che mostra l'atteso:

00000000  f4 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |.               |
00000010  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
*
000001f0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 55 aa  |              U.|
00000200

dove si 20trova uno spazio in ASCII.

Il firmware del BIOS legge quei 512 byte dal disco, li mette in memoria e imposta il PC sul primo byte per iniziare a eseguirli.

Ciao settore di avvio del mondo

Ora che abbiamo creato un programma minimo, spostiamoci in un mondo di ciao.

La domanda ovvia è: come fare IO? Alcune opzioni:

  • chiedere al firmware, ad esempio BIOS o UEFI, di farlo per noi

  • VGA: area di memoria speciale che viene stampata sullo schermo se scritta. Può essere utilizzato in modalità protetta.

  • scrivere un driver e parlare direttamente con l'hardware del display. Questo è il modo "corretto" per farlo: più potente, ma più complesso.

  • porta seriale . Questo è un protocollo standardizzato molto semplice che invia e riceve caratteri da un terminale host.

    Sui desktop appare così:

    inserisci qui la descrizione dell'immagine

    Fonte .

    Sfortunatamente non è esposto sulla maggior parte dei laptop moderni, ma è il modo comune di utilizzare schede di sviluppo, vedere gli esempi ARM di seguito.

    Questo è davvero un peccato, dal momento che tali interfacce sono davvero utili per il debug del kernel Linux, ad esempio .

  • utilizzare le funzionalità di debug dei chip. ARM chiama ad esempio il loro semihosting . Sull'hardware reale, richiede un supporto hardware e software aggiuntivo, ma sugli emulatori può essere un'opzione conveniente gratuita. Esempio .

Qui faremo un esempio di BIOS in quanto è più semplice su x86. Ma nota che non è il metodo più robusto.

main.S

.code16
    mov $msg, %si
    mov $0x0e, %ah
loop:
    lodsb
    or %al, %al
    jz halt
    int $0x10
    jmp loop
halt:
    hlt
msg:
    .asciz "hello world"

GitHub a monte .

link.ld

SECTIONS
{
    /* The BIOS loads the code from the disk to this location.
     * We must tell that to the linker so that it can properly
     * calculate the addresses of symbols we might jump to.
     */
    . = 0x7c00;
    .text :
    {
        __start = .;
        *(.text)
        /* Place the magic boot bytes at the end of the first 512 sector. */
        . = 0x1FE;
        SHORT(0xAA55)
    }
}

Assembla e collega con:

as -g -o main.o main.S
ld --oformat binary -o main.img -T link.ld main.o
qemu-system-x86_64 -hda main.img

Risultato:

inserisci qui la descrizione dell'immagine

E sul T430:

inserisci qui la descrizione dell'immagine

Testato su: Lenovo Thinkpad T430, UEFI BIOS 1.16. Disco generato su un host Ubuntu 18.04.

Oltre alle istruzioni standard di assemblaggio per l'utente, abbiamo:

  • .code16: dice a GAS di emettere codice a 16 bit

  • cli: disabilita gli interrupt software. Questi potrebbero far ricominciare il processore dopo ilhlt

  • int $0x10: esegue una chiamata BIOS. Questo è ciò che stampa i personaggi uno per uno.

I flag di link importanti sono:

  • --oformat binary: genera codice assembly binario non elaborato, non racchiuderlo in un file ELF come nel caso dei normali eseguibili userland.

Per comprendere meglio la parte dello script del linker, familiarizzare con la fase di trasferimento del collegamento: cosa fanno i linker?

Programmi bare metal x86 più freddi

Ecco alcune configurazioni bare metal più complesse che ho ottenuto:

Usa C invece di assemblare

Riepilogo: usa il multiboot di GRUB, che risolverà molti fastidiosi problemi a cui non hai mai pensato. Vedi la sezione sotto.

La principale difficoltà su x86 è che il BIOS carica solo 512 byte dal disco in memoria e che è probabile che tu faccia esplodere quei 512 byte quando usi C!

Per risolverlo, possiamo usare un bootloader a due stadi . Ciò effettua ulteriori chiamate BIOS, che caricano più byte dal disco in memoria. Ecco un esempio minimo di assemblaggio di fase 2 da zero utilizzando le chiamate BIOS int 0x13 :

In alternativa:

  • se ne hai bisogno solo per funzionare in QEMU ma non in hardware reale, usa l' -kernelopzione, che carica un intero file ELF in memoria. Ecco un esempio ARM che ho creato con quel metodo .
  • per Raspberry Pi, il firmware predefinito si occupa del caricamento delle immagini per noi da un file ELF chiamato kernel7.img, proprio come -kernelfa QEMU .

Solo a scopo educativo, ecco un esempio C minimo di una fase :

main.c

void main(void) {
    int i;
    char s[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
    for (i = 0; i < sizeof(s); ++i) {
        __asm__ (
            "int $0x10" : : "a" ((0x0e << 8) | s[i])
        );
    }
    while (1) {
        __asm__ ("hlt");
    };
}

entry.S

.code16
.text
.global mystart
mystart:
    ljmp $0, $.setcs
.setcs:
    xor %ax, %ax
    mov %ax, %ds
    mov %ax, %es
    mov %ax, %ss
    mov $__stack_top, %esp
    cld
    call main

linker.ld

ENTRY(mystart)
SECTIONS
{
  . = 0x7c00;
  .text : {
    entry.o(.text)
    *(.text)
    *(.data)
    *(.rodata)
    __bss_start = .;
    /* COMMON vs BSS: /programming/16835716/bss-vs-common-what-goes-where */
    *(.bss)
    *(COMMON)
    __bss_end = .;
  }
  /* /programming/53584666/why-does-gnu-ld-include-a-section-that-does-not-appear-in-the-linker-script */
  .sig : AT(ADDR(.text) + 512 - 2)
  {
      SHORT(0xaa55);
  }
  /DISCARD/ : {
    *(.eh_frame)
  }
  __stack_bottom = .;
  . = . + 0x1000;
  __stack_top = .;
}

correre

set -eux
as -ggdb3 --32 -o entry.o entry.S
gcc -c -ggdb3 -m16 -ffreestanding -fno-PIE -nostartfiles -nostdlib -o main.o -std=c99 main.c
ld -m elf_i386 -o main.elf -T linker.ld entry.o main.o
objcopy -O binary main.elf main.img
qemu-system-x86_64 -drive file=main.img,format=raw

Libreria standard C.

Le cose diventano più divertenti se si desidera utilizzare anche la libreria C standard, poiché non abbiamo il kernel Linux, che implementa gran parte delle funzionalità della libreria C standard tramite POSIX .

Alcune possibilità, senza passare a un sistema operativo completo come Linux, includono:

  • Scrivi il tuo. È solo un mucchio di intestazioni e file C alla fine, giusto? Destra??

  • newlib

    Esempio dettagliato su: /electronics/223929/c-standard-libraries-on-bare-metal/223931

    Implementa newlib tutte le cose noiose non-OS specifici per voi, per esempio memcmp, memcpy, etc.

    Quindi, fornisce alcuni stub per implementare le syscalls di cui hai bisogno.

    Ad esempio, possiamo implementare exit()su ARM tramite semihosting con:

    void _exit(int status) {
        __asm__ __volatile__ ("mov r0, #0x18; ldr r1, =#0x20026; svc 0x00123456");
    }
    

    come mostrato in questo esempio .

    Ad esempio, è possibile reindirizzare printfverso i sistemi UART o ARM o implementare exit()con semihosting .

  • sistemi operativi integrati come FreeRTOS e Zephyr .

    Tali sistemi operativi in ​​genere consentono di disattivare la pianificazione preventiva, offrendo quindi il pieno controllo sul runtime del programma.

    Possono essere visti come una sorta di Newlib pre-implementato.

GNU GRUB Multiboot

I settori di avvio sono semplici, ma non sono molto convenienti:

  • puoi avere solo un sistema operativo per disco
  • il codice di caricamento deve essere veramente piccolo e contenere 512 byte
  • devi fare molto l'avvio da solo, come passare alla modalità protetta

È per questi motivi che GNU GRUB ha creato un formato file più conveniente chiamato multiboot.

Esempio di lavoro minimo: https://github.com/cirosantilli/x86-bare-metal-examples/tree/d217b180be4220a0b4a453f31275d38e697a99e0/multiboot/hello-world

Lo uso anche sul mio repository di esempi GitHub per essere in grado di eseguire facilmente tutti gli esempi su hardware reale senza masterizzare l'USB un milione di volte.

Risultato QEMU:

inserisci qui la descrizione dell'immagine

T430:

inserisci qui la descrizione dell'immagine

Se prepari il tuo sistema operativo come file multiboot, GRUB è quindi in grado di trovarlo all'interno di un normale filesystem.

Questo è ciò che fanno la maggior parte delle distro, mettendo sotto le immagini del sistema operativo /boot.

I file multiboot sono fondamentalmente un file ELF con un'intestazione speciale. Sono specificati da GRUB su: https://www.gnu.org/software/grub/manual/multiboot/multiboot.html

È possibile trasformare un file multiboot in un disco di avvio con grub-mkrescue.

firmware

In verità, il tuo settore di avvio non è il primo software che gira sulla CPU del sistema.

Ciò che effettivamente viene eseguito per primo è il cosiddetto firmware , che è un software:

  • prodotto dai produttori di hardware
  • tipicamente sorgente chiusa ma probabilmente basato su C.
  • archiviato nella memoria di sola lettura e quindi più difficile / impossibile da modificare senza il consenso del fornitore.

I firmware ben noti includono:

  • BIOS : vecchio firmware x86 tutto presente. SeaBIOS è l'implementazione open source predefinita utilizzata da QEMU.
  • UEFI : successore del BIOS, meglio standardizzato, ma più capace e incredibilmente gonfio.
  • Coreboot : il nobile tentativo di open source ad arco incrociato

Il firmware fa cose come:

  • passa su ogni disco rigido, USB, rete, ecc. fino a quando non trovi qualcosa di avviabile.

    Quando eseguiamo QEMU, -hdadice che main.imgè un disco rigido collegato all'hardware, ed hdaè il primo da provare e viene utilizzato.

  • caricare i primi 512 byte nell'indirizzo di memoria RAM 0x7c00, inserire lì il RIP della CPU e lasciarlo funzionare

  • mostra cose come il menu di avvio o le chiamate di stampa del BIOS sul display

Il firmware offre funzionalità simili al sistema operativo da cui dipende la maggior parte dei sistemi operativi. Ad esempio, un sottoinsieme Python è stato portato per essere eseguito su BIOS / UEFI: https://www.youtube.com/watch?v=bYQ_lq5dcvM

Si può sostenere che i firmware non sono distinguibili dai sistemi operativi e che il firmware è l'unica "vera" programmazione in metallo nudo che si possa fare.

Come dice questo sviluppatore CoreOS :

La parte difficile

Quando si accende un PC, i chip che compongono il chipset (northbridge, southbridge e SuperIO) non sono ancora inizializzati correttamente. Anche se la ROM del BIOS è la più lontana possibile dalla CPU, ciò è accessibile dalla CPU, perché deve essere, altrimenti la CPU non avrebbe istruzioni da eseguire. Ciò non significa che la ROM del BIOS sia completamente mappata, di solito no. Ma quel tanto che basta è mappato per avviare il processo di avvio. Qualsiasi altro dispositivo, dimenticalo e basta.

Quando esegui Coreboot in QEMU, puoi sperimentare con i livelli più alti di Coreboot e con i payload, ma QEMU offre poche opportunità di sperimentare con il codice di avvio di basso livello. Per prima cosa, la RAM funziona fin dall'inizio.

Stato iniziale post BIOS

Come molte cose nell'hardware, la standardizzazione è debole e una delle cose su cui non dovresti fare affidamento è lo stato iniziale dei registri quando il codice inizia a funzionare dopo il BIOS.

Quindi fatevi un favore e utilizzate un codice di inizializzazione come il seguente: https://stackoverflow.com/a/32509555/895245

I registri piacciono %dse %eshanno effetti collaterali importanti, quindi dovresti azzerarli anche se non li stai usando esplicitamente.

Nota che alcuni emulatori sono più belli dell'hardware reale e ti danno un buono stato iniziale. Quindi quando corri su hardware reale, tutto si rompe.

El Torito

Formato che può essere masterizzato su CD: https://en.wikipedia.org/wiki/El_Torito_%28CD-ROM_standard%29

È anche possibile produrre un'immagine ibrida che funziona su ISO o USB. Questo può essere fatto con grub-mkrescue( esempio ), ed è anche fatto dal kernel di Linux make isoimageusando isohybrid.

BRACCIO

In ARM, le idee generali sono le stesse.

Non esiste un firmware preinstallato semi-standardizzato ampiamente disponibile come BIOS da utilizzare per l'IO, quindi i due tipi di IO più semplici che possiamo fare sono:

  • seriale, che è ampiamente disponibile su devboard
  • lampeggia il LED

Ho caricato:

Alcune differenze rispetto a x86 includono:

  • L'IO viene fatto scrivendo direttamente agli indirizzi magici, non ci sono ine outistruzioni.

    Questo si chiama IO mappato in memoria .

  • per alcuni hardware reali, come Raspberry Pi, puoi aggiungere tu stesso il firmware (BIOS) all'immagine del disco.

    Questa è una buona cosa, poiché rende l'aggiornamento del firmware più trasparente.

risorse


3
Gli Unikernels sono un'alternativa per le persone che non possono / non vogliono andare a un livello così basso e vogliono comunque beneficiare della loro impronta molto bassa.
AndreLDM,

1
@AndreLDM Stavo per aggiungere le notizie su Unikernel basate su Linux, ma mi sentivo ancora troppo nervoso: next.redhat.com/2018/11/14/ukl-a-unikernel-based-on-linux
Ciro Santilli 郝海东 冠状 病法轮功 事件 法轮功

14
Risposta davvero dettagliata ma "un programma che funziona senza un sistema operativo, è un sistema operativo" non è vero. Puoi scrivere un programma che accende / spegne un LED ma che non lo rende un sistema operativo. Alcuni codici firmware che eseguono il microcontrollore sull'unità flash non lo rendono un sistema operativo. Un sistema operativo è almeno un livello di astrazione per scrivere altri software più facilmente. Al minimo, oggigiorno, direi che se non c'è uno scheduler probabilmente non è un sistema operativo.
Vitali,

4
Buona risposta tranne l'assurdità assoluta che qualsiasi programma che non viene eseguito in un sistema operativo è un sistema operativo.
curiousdannii,

3
@MichaelPetch hey, solo per salvare il null nel settore di avvio :-) Probabilmente non ne vale la pena.
Ciro Santilli 4 冠状 病 六四 事件 法轮功

3

Sistema operativo come ispirazione

Anche il sistema operativo è un programma , quindi possiamo anche creare il nostro programma creando da zero o modificando (limitando o aggiungendo) le funzionalità di uno dei piccoli sistemi operativi , e quindi eseguendolo durante il processo di avvio (usando un'immagine ISO ) .

Ad esempio, questa pagina può essere utilizzata come punto di partenza:

Come scrivere un semplice sistema operativo

Qui, l' intero sistema operativo si inserisce interamente in un settore di avvio ( MBR ) da 512 byte !

Tale SO semplice o simile può essere utilizzato per creare un framework semplice che ci consentirà:

fare in modo che il bootloader carichi i settori successivi sul disco nella RAM e saltare a quel punto per continuare l'esecuzione . Oppure potresti leggere su FAT12, il filesystem usato su floppy drive, e implementarlo .

Vi sono tuttavia molte possibilità. Ad esempio, per vedere un sistema operativo di linguaggio assembly x86 più grande, possiamo esplorare MykeOS , il sistema operativo x86 che è uno strumento di apprendimento per mostrare il semplice funzionamento di sistemi operativi a 16 bit in modalità reale, con codice ben commentato e ampia documentazione .

Boot Loader come ispirazione

Altri tipi comuni di programmi eseguiti senza il sistema operativo sono anche i caricatori di avvio . Possiamo creare un programma ispirato a tale concetto, ad esempio utilizzando questo sito:

Come sviluppare il tuo Boot Loader

L'articolo di cui sopra presenta anche l' architettura di base di tali programmi :

  1. Caricamento corretto in memoria per 0000: indirizzo 7C00.
  2. Chiamata della funzione BootMain sviluppata nella lingua di alto livello.
  3. Mostra sul display il messaggio "" Ciao, mondo ... ", da basso livello".

Come possiamo vedere, questa architettura è molto flessibile e ci consente di implementare qualsiasi programma , non necessariamente un boot loader.

In particolare, mostra come utilizzare la tecnica del "codice misto" grazie alla quale è possibile combinare costruzioni di alto livello (da C o C ++ ) con comandi di basso livello (da Assembler ). Questo è un metodo molto utile, ma dobbiamo ricordare che:

per compilare il programma e ottenere il file eseguibile sono necessari il compilatore e il linker di Assembler per la modalità a 16 bit . Per C / C ++ è necessario solo il compilatore in grado di creare file oggetto per la modalità a 16 bit .

L'articolo mostra anche come vedere il programma creato in azione e come eseguirne i test e il debug.

Le applicazioni UEFI come ispirazione

Gli esempi precedenti hanno utilizzato il fatto di caricare il settore MBR sul supporto dati. Tuttavia, possiamo approfondire approfondendo, ad esempio, con le applicazioni UEFI :

Oltre a caricare un sistema operativo, UEFI può eseguire applicazioni UEFI, che risiedono come file sulla partizione di sistema EFI. Possono essere eseguiti dalla shell dei comandi UEFI, dal boot manager del firmware o da altre applicazioni UEFI. Le applicazioni UEFI possono essere sviluppate e installate indipendentemente dal produttore del sistema.

Un tipo di applicazione UEFI è un caricatore del sistema operativo come GRUB, rEFInd, Gummiboot e Windows Boot Manager; che carica in memoria un file del sistema operativo e lo esegue. Inoltre, un caricatore del sistema operativo può fornire un'interfaccia utente per consentire l'esecuzione della selezione di un'altra applicazione UEFI. Utilità come la shell UEFI sono anche applicazioni UEFI.

Se desideriamo iniziare a creare tali programmi , possiamo, ad esempio, iniziare con questi siti Web:

Programmazione per EFI: creazione di un programma "Hello, World" / UEFI - Primi passi

Esplorare i problemi di sicurezza come ispirazione

È noto che esiste un intero gruppo di software dannoso (che sono programmi) in esecuzione prima dell'avvio del sistema operativo .

Un vasto gruppo di essi opera nel settore MBR o nelle applicazioni UEFI, proprio come le soluzioni sopra menzionate, ma ci sono anche quelli che usano un altro punto di ingresso come il Volume Boot Record (VBR) o il BIOS :

Esistono almeno quattro virus di attacco BIOS noti , due dei quali a scopo dimostrativo.

o forse anche un altro.

Attacchi prima dell'avvio del sistema

I bootkit si sono evoluti dallo sviluppo di Proof-of-Concept alla distribuzione di massa e ora sono diventati effettivamente software open source .

Diversi modi per avviare

Penso anche che in questo contesto valga la pena ricordare che esistono varie forme di avvio del sistema operativo (o del programma eseguibile previsto per questo) . Ce ne sono molti, ma vorrei prestare attenzione al caricamento del codice dalla rete utilizzando l'opzione Network Boot ( PXE ), che ci consente di eseguire il programma sul computer indipendentemente dal suo sistema operativo e persino da qualsiasi supporto di archiviazione che sia direttamente collegato al computer:

Che cos'è l'avvio di rete (PXE) e come è possibile utilizzarlo?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.