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?
printfnon è 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 libcche 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_mediao PyObject_GetAttr, tranne per il fatto che alcune printfimplementazioni sono garantite collegabili senza l'aggiunta di ulteriori non standard -l.