Odpowiedzi:
Wszelkie operacje we / wy są obsługiwane przez wywołanie systemowe wywołane przez proces. W końcu takie wywołanie systemowe spłynie w dół do odpowiedniej funkcji sterownika niskiego poziomu w celu wykonania faktycznej operacji we / wy.
We / wy może być trudne - aby faktycznie pobrać i wyjąć dane z urządzenia, konieczne może być wykonanie różnych kroków, w kolejności i ewentualnie z wymaganiami dotyczącymi czasu. Jeśli te kroki nie zostaną wykonane atomowo, przy następnej próbie urządzenie może nie zareagować, źle się zachowywać, a nawet spowodować zablokowanie systemu. Kroki te mogą być różne i unikalne dla każdego urządzenia, dlatego jest tak wiele sterowników urządzeń.
Dobrze napisany sterownik urządzenia powinien wiedzieć, jak postępować z urządzeniem, które usiłuje serwisować, więc normalnie nie powinien napotykać problemów, chyba że wystąpi błąd sterownika, używasz niewłaściwego sterownika urządzenia lub urządzenie fizyczne nie działa.
Teraz, gdy przeczytałem książkę „Projektowanie systemów operacyjnych Unix” Maurice'a Bacha, pozwól, że sam odpowiem na to pytanie.
Krótko mówiąc, uczynienie I / O nieprzerwanym ma na celu sprawienie, aby zadanie I / O zakończyło się JAK NAJSZYBCIEJ, bez ingerencji w sygnały.
Powiązana wiedza, którą zdobyłem z książki:
Niektóre ścieżki kodu w jądrze są oznaczone jako nieprzerywalne, głównie dlatego, że kod musi być zgodny z ścisłym wyczuciem czasu (aby odpowiedzieć na urządzenie) lub dlatego, że robi coś, co nie dopuszcza interferencji. W przypadku Linuksa większość z tych pierwszych została wypchnięta na niezależne stopnie wbudowane w jądro, a drugie były w większości błędne (podejrzewam, że głównie pod presją obecnych maszyn wieloprocesorowych). Tj. Minęło już trochę czasu, gdy nie widziałem procesu w nieprzerwanym śnie.
write(2)
może wrócić wcześniej, zwracając rzeczywistą liczbę zapisanych bajtów, która może być mniejsza niż długość bufora przekazana jako trzeci argument.