So che quando viene compilato il codice sorgente, ad esempio C ++, l'output del compilatore è il codice macchina (eseguibile) che pensavo fossero istruzioni direttamente alla CPU. Recentemente stavo leggendo i kernel e ho scoperto che i programmi non possono accedere direttamente all'hardware ma devono passare attraverso il kernel.
Quindi quando compiliamo un semplice codice sorgente, diciamo con una sola printf()
funzione, e la compilazione produce il codice macchina eseguibile, ciascuna istruzione in questo codice macchina verrà eseguita direttamente dalla memoria (una volta che il codice è stato caricato in memoria dal sistema operativo) o ogni comando nel codice macchina deve ancora passare attraverso il sistema operativo (kernel) per essere eseguito?
Ho letto una domanda simile . Non ha spiegato se il codice macchina che viene generato dopo la compilazione è direttamente un'istruzione per la CPU o se sarà necessario passare nuovamente attraverso il kernel per creare le istruzioni corrette per la CPU. Cioè, cosa succede dopo che il codice macchina è stato caricato in memoria? Passerà attraverso il kernel o parlerà direttamente con il processore?
printf
non è un grande esempio. È esplicitamente definito dalla specifica C come una funzione disponibile solo in implementazioni "ospitate" (ovvero in esecuzione su un kernel, anziché "indipendente", che potrebbe non richiederne una). E sulla maggior parte delle piattaforme, printf
è solo una funzione fornita da te libc
che fa un sacco di cose per tuo conto (che alla fine include una syscall da stampare su stdout). Non è davvero diverso dal chiamare libvlc_media_list_add_media
o PyObject_GetAttr
, tranne per il fatto che alcune printf
implementazioni sono garantite collegabili senza l'aggiunta di ulteriori non standard -l
.