Sono interessato allo sviluppo di un tipo di debugger in modalità kernel ring0 per x86-64 in Common Lisp che verrebbe caricato come un modulo del kernel Linux e come preferisco Common Lisp a C nella programmazione generale, mi chiedo in che modo Common Lisp le implementazioni si adatterebbero a questo tipo di attività di programmazione.È possibile scrivere un debugger in modalità kernel Linux per Intel x86-64 in Common Lisp e con quale implementazione Common Lisp [s]?
Il debugger utilizzerà una libreria di disassemblaggio esterna, ad esempio udis86 tramite alcuni FFI. Mi sembra che sia più facile da scrivere moduli del kernel in C come hanno bisogno di contenere funzioni C int init_module(void)
e void cleanup_module(void)
(The Linux Kernel Module Programming Guide), in modo che il codice del modulo del kernel-terra sarebbe chiamare il codice Common Lisp da C utilizzando CFFI. L'idea sarebbe quella di creare un debugger ring0 per Linux a 64 bit ispirato all'idea di Rasta Ring 0 Debugger, che è disponibile solo per Linux a 32 bit e richiede la tastiera PS/2. Penso che la parte più difficile sarebbe il codice attuale del debugger con i breakpoint hardware e software e la gestione dei dispositivi di input video, tastiera o USB di basso livello. Inline assembly sarebbe di grande aiuto in questo, mi sembra che in SBCL l'assembly inline possa essere implementato utilizzando VOP (SBCL Internals: VOP) (SBCL Internals: Adding VOPs), e questo IRC log menziona che ACL (Allegro Common Lisp), CCL (Clozure Common Lisp) e CormanCL hanno LAP (Lisp Programmi di assemblaggio). Sia ACL che CormanCL sono proprietari e quindi scartati, ma CCL (Clozure Common Lisp) potrebbe essere un'opzione. Anche la capacità di creare file eseguibili standalone è un requisito; SBCL che sto usando attualmente ce l'ha, ma dato che sono immagini Lisp intere, le loro dimensioni sono abbastanza grandi.
La mia domanda è: è praticabile per creare un debugger del kernel-mode ring0 per Intel x86-64 in Common Lisp, con il codice di basso livello implementato in C e/o il montaggio, e se lo è, quali Common Implementazioni Lisp per Linux best-suit a 64 bit per questo tipo di attività, e quali sono i pro e i contro se esistono più di una implementazione Common Lisp adatta? Lo schema può essere anche una possibile opzione, se offre alcuni vantaggi rispetto a Common Lisp. Sono ben consapevole del fatto che la grande maggioranza dei moduli del kernel sono scritti in C, e conosco abbastanza bene l'assembly C e x86 per poter scrivere il codice di basso livello richiesto in C e/o assembly. Questo non è un tentativo di portare il kernel Linux in Lisp (vedi: https://stackoverflow.com/questions/1848029/why-not-port-linux-kernel-to-common-lisp), ma un piano per scrivere in Common Lisp un modulo del kernel Linux che verrebbe usato come un debugger ring0.
Probabilmente si può eseguire la parte Lisp in un processo utente e solo comunicare con esso dal debugger.. –
@AlexeyFrunze Questa potrebbe essere una buona idea, probabilmente rende le cose molto più semplici – nrz
Un downvote, un upvote Mi piacerebbe sapere perché un downvote? – nrz