# Mimiker: Prace dyplomowe
###### tags: `mimiker`
## Lista tematów
### Infrastruktura `evdev` dla urządzeń wprowadzania
:::info
Student: ?
:::
`evdev` to interfejs linuksowy unifikujący urządzenia wprowadzania, np.: mysz, klawiaturę, joystick, itp. Należałoby napisać sterownik myszy`PS/2`. Następnie udostępnić mysz i klawiaturę `atkbdc.c` jako urządzenia w `/dev/input`.
* [Linux input drivers v1.0](https://www.kernel.org/doc/Documentation/input/input.txt)
* [evdev.h](http://bxr.su/search?q=evdev.h&project=FreeBSD)
* [PS/2 keyboard](https://wiki.osdev.org/PS2_Keyboard) @osdev.wiki
* [Mouse](https://wiki.osdev.org/Mouse_Input) @osdev.wiki
:::warning
`libsdl2` wspiera `evdev`, ale wymaga jeszcze `libudev`.
:::
### Wersjonowanie przestrzeni adresowych
:::info
Student: ?
:::
Z grubsza chodzi o uzupełnienie bieżącej implementacji przestrzeni adresowych o możliwość współdzielenia obszarów pamięci. W grę wchodzi również obsługa _copy-on-write_. Trzeba umożliwić tworzenie prywatnych odwzorowań plików z ramdysku i współdzielonych urządzenia karty graficznej. Dalej można usprawnić `fork` o leniwe klonowanie przestrzeni adresowej.
### Kernel Concurrency Sanitizer + Lock Dependency Analyzer
:::info
Student: Jakub Urbańczyk
:::
Julian Pszczołowski dodał do Mimikera KASAN'a, który pomaga nam ze znajdowaniem błędów związanych z dostępami do pamięci. Zasadniczo mamy całe masy sanitizerów. Najtrudniejsze błędy do znajdowania mają związek z wyścigami. Dlatego powinniśmy do jądra dołożyć [KTSAN](https://github.com/google/ktsan/wiki).
Łatwiejsza praca to dorobienie [KUBSAN](https://man.openbsd.org/kubsan.4), który też mógłby być użyteczny.
### Profiling jądra i zarządzanie czasem
:::info
Student: Wiktor Pilarczyk (?)
:::
Nie mamy żadnych sensownych sposobów na pomiar wydajności jądra. Proponuję zacząć od zintegrowania [gprof](https://sourceware.org/binutils/docs/gprof/index.html) z jądrem Mimiker. Potem można się przyjrzeć innym rozwiązaniom: [Profiling and Debugging the FreeBSD* Kernel](https://people.freebsd.org/~vwe/files/321772.pdf). Przydałby się ktoś kto potrafi połączyć statystykę z rzeczywistością.
:::warning
`libsdl2` wymaga działającego `clock_gettime` albo `gettimeofday`.
:::
### Sterownik dysku twardego
:::info
Student: Tomasz Stachowski
:::
Należy zacząć od sterownika szyny IDE i identyfikacji urządzeń wejścia-wyjścia. Żeby transfery miały sensowną wydajność będzie trzeba zbudować infrastrukturę dla DMA.
* [ATAPI PIO](https://wiki.osdev.org/ATA_PIO_Mode)
### Sterownik hosta USB
:::info
Student: Michał Błaszczyk
:::
Chcemy wykryć urządzenia podpięte do szyny, tj. przeczytać ich deskryptor.
### Sterownik karty sieciowej
:::info
Student: Mikołaj Kowalik
:::
Trzeba znaleźć implementację stosu TCP/IP w user-space, która będzie współpracować ze sterownikiem TAP.
* [TUN/TAP](https://en.wikipedia.org/wiki/TUN/TAP) @wikipedia
* [Universal TUN/TAP device driver](
https://www.kernel.org/doc/Documentation/networking/tuntap.txt)
* [Am79C970A](https://wiki.osdev.org/AMD_PCNET) @osdev.wiki
## Niski priorytet
### Szybki alokator pamięci jądra
W chwili obecnej mamy _boundary tags_ i _segregated fit_. Można pokusić się o implementację [TLSF](http://www.gii.upv.es/tlsf/) z uwzględnieniem tego, że w przyszłości będziemy mieć jądro na wielordzeniowego _AArch64_. Trzeba byłoby zorganizować jakiś cache bloków per rdzeń. No i do tego dochodzi pomiar wydajności.
### (TODO) Sterownik karty graficznej
* https://wiki.osdev.org/Bochs_VBE_Extensions
* [fbio.h](http://bxr.su/FreeBSD/sys/sys/fbio.h)
* [Linux Frame Buffer](https://www.kernel.org/doc/html/latest/fb/index.html)
### Sterownik karty dźwiękowej
Przydałby się dźwięk do uruchamiania gier pod kontrolą Mimikera. Właściwie potrzebujemy tylko odtwarzania surowych próbek PCM. Na _Malcie_ pod `qemu` dysponujemy kartą Ensoniq 1370 wpiętą w szynę PCI.
* [audio(4)](https://man.netbsd.org/audio.4)
* [eap.c](http://bxr.su/NetBSD/sys/dev/pci/eap.c)
:::warning
`libsdl2` wspiera sterownik interfejs urządzeń audio z `NetBSD`!
:::
## Największe braki
Nikt teraz się tym nie zajmuje:
- dokumentacja :)
- więcej sterowników:
- mysz i klawiatura USB
- framebuffer dla RPi3
- dopracowanie:
- infrastruktury dla sterowników (pic, devfs+unit, ...)
- obsługi sygnałów (siginfo, SIGPIPE, SIGALRM)
- systemu budowania (?)
- skrypty gdb
- lepsza infrastruktura do testów:
- oddzielenie testów user- od kernel-space
- uruchamianie współbieżne
- portowanie testów z LTP metodą clean-room
- gruntowne przetestowanie potoków
- select i poll albo kevent
- blokady i referencje vnode'ów
## Plany na przyszłość
- gniazda domeny uniksowej
- konsolidator dynamiczny w przestrzeni użytkownika `ld.so` (**)
- scheduler bazowany na kolejkach kalendarzowych
- kernel [system call fuzzer](https://is.muni.cz/th/r82kv/final_thesis.pdf)
- emulator terminala na podstawie suckless terminal
- zastąpienie warstwy X-ów przy pomocy FB + evdev
- OpenRC: jako system rozruchu + init
- System plików ext2
Długofalowo MIPS -> RISC-V.