Sisteme de Operare 2 - UPB 2021: https://linux-kernel-labs.github.io/refs/heads/master/
Fisierul contine setarile pentru VS Code cu care intelliSense functioneaza (destul de) corect.
Introducere in infrastructura de laborator si in dezvoltarea de module de kernel.
Se aplica urmatoarele concepte in dezvoltarea modulelor de kernel:
- alocarea si eliberarea memoriei
- utilizarea listelor din Kernel
- utilizarea unor primitive de sincroniozare (
spinlock_t
sirwlock_t
)
Se implementeaza un driver pentru un dispozitiv de tip caracter,
respectiv apelurile open
, read
, write
, close
si ioctl
.
Se implementeaza un keylogger care retine tastele apaste intr-un buffer. La fieca apasare, se declanseaza o intrerupere al carei handler salveaza tasta. Se foloseste registrul de date controllerului i8042, in care sunt scrise coduri care indica tastele apasate.
Continutul bufferului poate fi citit sau sters accesand fisierul /dev/kbd
.
Se creaza un dispozitiv caracter controlabil din user space prin ioctl()
, care
in functie de comenzile primite (catre /dev/deferred
) realizeaza o serie de
apeluri (mai mult sau mai putin blocante) sau seteaza timere pentru a demonstra
mecanismele deferred work
Labul presupune 2 module care implementeaza apelul mmap()
, precum si
operatiile de citire si scriere din si in memoria mapata cu mmap
. Cele 2
module difera prin faptul ca unul aloca memoria continuu d.p.d.v fizic, cu
kmalloc()
, pe cand celalalt nu, folosind vmalloc()
.
O relativa continuare a labului trecut, se implementeaza un dispozitiv bloc "virtual", care tine datele in RAM.
Labul asta si urmatorul se implementeaza 2 sisteme de fisiere, unul cu (minfs)
si celalalt fara suport fizic (myfs). La labul 8 se implementeaza doar
operatiile necesare pentru mount
si umount
, iar in labul 9 se implementeaza
operatiile pentru crearea fisierelor si directoarelor.
Un subsistem misto si un lab la misto. Cumva similar cu tema 1, se intercepteaza
trafic TCP si UDP (folosind netfilter
).
O mizerie facuta doar ca sa fie si pt ca NXP. Nu merita. Mai bine faceam
networking mai ca lumea. Sau mai bine mai faceam un lab in care se explicau
bio
-urile.
Un cacat de rulat perf
si alte utilitare similare ca sa inspectam module sau
binare. Inca nu stiu cum se face ultimul exercitiu :(.
Se implementeaza un modul de kernel care prin scrieri catre
/proc/list/management
, retine si modifica o lista interna. Comenzile posibile
sunt:
addf <str>
- adauga<str>
la prima pozitie din listaadde <str>
- adauga<str>
la ultima pozitie din listadelf <str>
- sterge prima aparitie a sirului<str>
din listadela <str>
- sterge toate aparitiile sirului<str>
in lista
Lista poate fi vizualizata, cate un string pe linie, citind din fisierul
/proc/list/preview
.
Se folosesc Kretprobes pentru a monitoriza urmatoarele functii apelate de procesele din Kernel:
kmalloc
kfree
mutex_lock_nested
mutex_unlock
schedule
up
down_interruptible
Se numara apelurile functiilor de mai sus, iar, pentru cele ce aloca sau dealoca memorie, se si contorizeaza memoria alocata, respectiv eliberata.
Prin apeluri de ioctl()
din user space pe /dev/tracer
, se pot adauga sau
scoate de sub observatie anumite procese. Statisticile colectate prin probele
de mai sus pot fi vazute citind din /proc/tracer
.
Practic PM 2.0. Se implementeaza un driver care stie sa comunice printr-un
port serial UART16550. Poate sa comunice fie cu un singur port (COM1
sau
COM2
), fie prin amandoua. Expune operatiile blocante de read
si write
,
iar bufferele interne sunt implementate folosind kfifo
-uri.
Destul de jegoasa. Multumiri speciale @Adina, care s-a ocupat de partea de registre si de frecat datasheetul.
Se implementeaza schema de replicare RAID 1 intre 2 discuri fizice. Fiecarui
sector de 512 octeti dintr-un disc i se calculeaza un CRC care este scris
intr-o zona de la finalul discului. Scrierile recalculeaza si rescriu
CRC-urile pe ambele discuri, iar citirile verifica CRC-urile sectoarelor
citite, iar in cazul in care unul dintre acestea (de pe oricare disc) e gresit,
se inlocuieste cu cel de pe celalalt disc. Daca ambele CRC-uri sunt sunt
gresite, atunci se semnaleaza o eroare de I/O folosind bio_io_error()
.
Da, se folosesc bio
-uri... :(. Foarte obscure structuri si prost documentate,
atat in lab, cat si pe net.
Un protocol de transport mai dubios care functioneaza direct peste nivelul 2.
Practic creeaza un nou tip de socket pe care se pot executa send
si recv
si
care functioneaza cu datagrame, similar cu UDP (de altfel, headerul e foarte
similar cu al UDP-ului).
Tot mi s-a parut ca a fost mult prea mult de sapat de-a-n pulea pe LXR pentru ca la labul de networking se face o pula. O tema nu trebuie sa presupuna sa cautam acul in carul cu fan. Ce e asta, ML?