Zmieniam jądro Linuksa i próbujędowiedzieć się, gdzie w źródle jądra bloki danych są fizycznie zapisywane na partycjach dysku, takich jak ubd0. Gdzie to się dzieje w źródle jądra? Rzeczywiste fizyczne wezwanie do zapisu? Nie mogę tego znaleźć. Dzięki!
Edycja: Celem końcowym jest lista numerów bloków, które zostały zapisane na kilku różnych partycjach. Ponieważ dane są fizycznie zapisywane na liście, zapisywane numery bloków są zwracane i utrzymywane.
Odpowiedzi:
1 dla odpowiedzi № 1Zależy to od konkretnego sterownika i urządzeniarodzaj. W przypadku urządzenia SCSI polecenia SCSI przechodzą do sterownika urządzenia. Są one generowane w warstwie SCSI i wysyłane do urządzenia przez sterownik urządzenia, a następnie do urządzenia.
Istnieje wiele abstrakcji w wywołaniu systemowym sys_write, dopóki dane nie zostaną przekazane do urządzenia, a sam sterownik urządzenia może nawet nie wiedzieć, że wykonuje zapis.
Do edycji zajrzyj na blktrace: http://linux.die.net/man/8/blktrace
Ok, kolejna odpowiedź; bardziej ci się spodoba. Dzieje się tak w generic_make_request. Komentarze mają charakter opisowy: http://lxr.linux.no/#linux+v2.6.32/block/blk-core.c#L1380
Struktura biologiczna w tej funkcji, widziana tutaj: http://lxr.linux.no/#linux+v2.6.32/include/linux/bio.h#L58
pokazuje bio_vec, czyli listę rzeczy trafiających do urządzenia.
q-> make_request_fn (q, bio); to rzeczywiste wywołanie wskaźnika funkcji do samego urządzenia.
http://lxr.linux.no/#linux+v2.6.32/include/linux/types.h#L126
Pokazuje, w jaki sposób indeksy są używane do zapisu na partycji. Należy zauważyć, że nie służy to tylko do zapisu.
0 dla odpowiedzi nr 2
Jeśli naprawdę chcesz wymyślić to konkretne koło od zera, skorzystałbym z funkcji kolejki żądań. Na przykład, aby zarejestrować żądanie wchodzące do kolejki, możesz wstawić kod submit_bio()
.
Nie jestem pewien, czy jest to najlepsze miejsce do zaczepienia się o wyjście z kolejki. Być może elv_next_request()
na starszych jądrach lub blk_start_request()
na nowsze.
0 dla odpowiedzi № 3
Jest w sterownikach urządzeń i zwykle odbywa się to poprzez połączenie transferów DMA i przerwań sygnalizujących zakończenie operacji we / wy. Są one różne dla każdego konkretnego urządzenia sprzętowego. Spójrz tutaj jak skomplikowane jest to w przypadku zwykłej dyskietki.
Edytować:
Zbadać Harmonogram we / wy kod.