2012-09-19 9 views
7

Jestem zainteresowany rozwijaniem pewnego rodzaju debuggera w stylu jądra ring0 dla x86-64 w Common Lisp, który byłby załadowany jako moduł jądra Linuksa i jak wolę Common Lisp do C w ogólnym programowaniu, zastanawiam się, jak różne są wspólne Lisp implementacje pasowałyby do tego rodzaju zadania programistycznego.Czy jest możliwe napisanie debuggera trybu jądra Linux dla Intel x86-64 w Common Lisp i z jakim implementacją Common Lisp [s]?

Do debuggera wykorzystano zewnętrzną bibliotekę do demontażu, taką jak udis86 za pośrednictwem jakiegoś FFI. Wydaje mi się, że najłatwiej jest napisać moduły jądra w C, ponieważ muszą zawierać funkcje C int init_module(void) i void cleanup_module(void) (The Linux Kernel Module Programming Guide), więc kod modułu jądra wywoła kod Common Lisp z C za pomocą CFFI. Pomysł polegałby na stworzeniu debora typu ring0 dla 64-bitowego systemu Linux zainspirowanego ideą Rasta Ring 0 Debugger, który jest dostępny tylko dla 32-bitowego systemu Linux i wymaga klawiatury PS/2. Myślę, że najtrudniejszą częścią byłby faktyczny kod debuggera ze sprzętowymi i programowymi punktami przerwania oraz niskopoziomowym sterowaniem urządzeniami wideo, klawiaturowymi lub wejściowymi USB. Montaż w trybie Inline bardzo by mi w tym pomógł, wydaje mi się, że w wbudowanym zestawie SBCL można zaimplementować za pomocą VOP (SBCL Internals: VOP) (SBCL Internals: Adding VOPs), a ten IRC log wspomina, że ​​ACL (Allegro Common Lisp), CCL (Clozure Common Lisp) i CormanCL mają LAP (Lisp Programy montażowe). Zarówno ACL, jak i CormanCL są zastrzeżone, a zatem odrzucone, ale CCL (Clozure Common Lisp) może być jedną z opcji. Konieczna jest także możliwość budowania samodzielnych plików wykonywalnych; SBCL, którego obecnie używam, ma to, ale ponieważ są to całe obrazy Lisp, ich rozmiar jest dość duży.

Moje pytanie brzmi: jest to opłacalne, aby utworzyć debugger ring0 trybu jądra Intel x86-64 w Common Lisp, kod niskiego poziomu realizowanego w C i/lub zespołu, a jeśli jest, co wspólne Implementacje Lisp dla 64-bitowego systemu Linux najlepiej nadają się do tego typu przedsięwzięć, a jakie są plusy i minusy, jeśli istnieje więcej niż jedna odpowiednia implementacja Common Lisp? Schemat może być jedną z możliwych opcji, jeśli oferuje pewne korzyści w porównaniu z Common Lisp. Doskonale zdaję sobie sprawę, że znakomita większość modułów jądra jest napisana w języku C, a ja znam układ C i x86 na tyle dobrze, aby móc napisać wymagany kod niskiego poziomu w C i/lub złożeniu. Nie jest to próba przeniesienia jądra Linuksa do Lisp (patrz: https://stackoverflow.com/questions/1848029/why-not-port-linux-kernel-to-common-lisp), ale plan napisania w Common Lisp modułu jądra Linux, który byłby używany jako debugger ring0.

+3

Prawdopodobnie może uruchomić Lisp udział w procesie obsługi i po prostu z nim komunikować z debuggera.. Powinno być znacznie łatwiejsze do osiągnięcia: –

+0

@AlexeyFrunze To może być dobry pomysł, pewnie czyni to o wiele łatwiejszym – nrz

+0

Jeden downvote, jeden uptoot.Chciałbym wiedzieć, dlaczego downward? – nrz

Odpowiedz

2

Nie, nie byłoby możliwe wdrożenie modułu jądra w CL z oczywistych powodów, że tylko po to, aby ta praca była potrzebna, aby zrobić wiele hacków i może skończyć się utratą wszystkich korzyści zapewnianych przez język LIPP i kod lisp będzie wyglądał jak kod C w wyrażeniach S.

Napisz moduł jądra, aby wyeksportować dowolną funkcjonalność/dane, które potrzebujesz z jądra, a następnie za pomocą ioctl lub operacji odczytu/zapisu, każdy program trybu użytkownika może komunikować się z modułem.

Nie jestem pewien, czy istnieje jakiś moduł jądra, który jest na tyle ogólny, że implementuje Lisp (lub może być jego podzbiorem) tak, że piszesz kod w Lispie i ten ogólny moduł czyta kod seplenieniowy i uruchamia go jako podskładnik , w zasadzie Kernel -> Ogólny moduł LISP -> Twój kod Lisp (który będzie działał w jądrze).

+2

+1 Wdrożenie kodu modułu jądra w C i kod obszaru użytkownika w Common Lisp byłby dobrą alternatywą. Jednak dowiedziałem się, że [ECL (Embedded Common-Lisp)] (http://ecls.sourceforge.net/) obsługuje wbudowane C i kompiluje do samodzielnych plików wykonywalnych, i są to dwa najważniejsze wymagania tutaj dla każdej implementacji CL, więc najpierw próbuję ECL z wbudowanym C. – nrz

+0

Po kilku dniach hackowania kodu modułu jądra, wydaje się, że osadzanie Common Lisp (ECL) byłoby trudnym zadaniem. W kodzie jądra możliwy jest tylko podzbiór C, więc nawet jeśli ECL tworzy kod C (co jest bardzo dobre), to kod C prawdopodobnie nie jest poprawnym kodem C jądra. Edycja kodu C wytworzonego przez ECL np. z regex tworzyłby inną warstwę programowania, zanim ten kod mógłby zostać skompilowany za pomocą 'gcc'. Tak więc zamiast instancji '.plp ->' ecl' -> '.c' ->' gcc' -> '.o' ->' ld' -> '.ko' byłoby to np. '.lisp' ->' ecl' -> '.c' ->' vim' lub 'perl' ->' .c' -> 'gcc' ->' .o' -> 'ld' ->'. rurociąg "ko". – nrz

+0

Wydaje mi się, że pisanie kodu modułu jądra w ECL może być możliwe przy niektórych (większych?) Zmianach w ECL, tak aby mógł opcjonalnie wyprowadzić kod C ważny dla modułów jądra. Znacznie łatwiej jest napisać moduł jądra w C i kod obszaru użytkownika w ECL, i wykonać komunikację między nimi za pośrednictwem '/ dev' i/lub portów. Jest to możliwe już teraz, i to jest sposób, aby pójść po mnie. – nrz

3

Być może zechcesz rzucić okiem na dyskusję na lispvan 2 lutego 2008 r. "Robiąc złe rzeczy z Common Lisp" Brada Beveridge'a na temat pracy ze sterownikiem systemu plików z SBCL.

Talk description & files

W nim wspomina:

„A C/C++ Debugger napisany w CL ??

Całkowicie pie in the sky teraz

Ale, jak fajnie byłoby to możliwe?

Nie, że wiele z odcinka, tylko trzeba umieć pisać do pamięci, gdzie biblioteka znajduje wstawić punkty przerwy & następnie sygnały pułapek na Lisp stronie

Przydałoby brudne sztuczki, aby zastąpić funkcje C z połączeń do Lisp funkcji

Oprócz pewnych szczegółów, to chyba nie takie trudne - na pewno nic „nowego”

brudna trik wiązałoby nadpisanie kodu C z innym skoku (oddział bez linku) do Lisp zwrotnego . Kiedy kod Lisp zwróci, może on przejść bezpośrednio z powrotem do pierwotnej funkcji wywołania za pośrednictwem rejestru linków.

Również jestem całkowicie tuszowanie prawdziwe trudności w pisaniu debugger - byłoby czasochłonne „

+1

+1 Zadanie wydaje się możliwe, ale dość czasochłonne, nawet jeśli dekompilacja jest o wiele trudniejsza niż demontaż. Mój plan polegałby na stworzeniu regularnego debuggera montażowego w stylu SoftIce, z wykorzystaniem wyszukiwań pamięci regex Vim/Perl. Wygląda na to, że debugger w trybie jądra napisany głównie w Common Lisp jest możliwy, szczególnie biorąc pod uwagę fakt, że [ECL (Embeddable Common-Lisp)] (http://ecls.sourceforge.net/) obsługuje wbudowane C z '(ffi: cline c-code *) 'i' (ffi: c-inline (lisp-value *)) 'special forms, więc myślę, że ECL byłaby jedną z najlepszych implementacji Common Lisp dla tego typu zadania. – nrz