Pytanie Implementacja sygnałów zegarowych sprzętowych w jądrze Linux


Patrzę na kilka wskazówek dla zrozumienia, w jaki sposób jądro Linux implementuje konfigurację różnych zegarów sprzętowych. Zasadniczo odnosi się to do pracy z ustawianiem różnych zegarów, których będą używać funkcje sprzętowe, takie jak wyświetlacz LCD, UART itp. Na przykład, kiedy Linux uruchamia się, jak radzi sobie z ustawianiem zegarów dla UART lub USB. Może coś takiego jak menedżer zegara albo coś takiego.

Zasadniczo próbuję zaimplementować coś podobnego dla innego systemu operacyjnego na nowym sprzęcie, nad którym pracuję. Każda pomoc będzie naprawdę doceniona.

[Edytować]
Dziękuję za odpowiedzi i linki. Oto co zaimplementowałem do tej pory. To powinno dać ci wyobrażenie, dokąd zmierzam.

Sprawdziłem instrukcję obsługi sprzętu dla konkretnego systemu, którego szukam, i napisałem kod do monitorowania / modyfikowania sygnałów / pinów urządzeń peryferyjnych, którymi jestem zainteresowany, tj. Włączania ich / wyłączania z linii poleceń. Teraz zbiór tych zegary / sygnały razem sterują urządzeniem peryferyjnym. HRM powiedziałby, że jeśli chcesz włączyć UART lub coś takiego, włącz takie i takie sygnały / piny. I @BjoernD tak używam czegoś podobnego do funkcji mmap (), aby porozmawiać z urządzeniami peryferyjnymi.

Mięso z mojego pytania jest takie, że chcę zrozumieć projekt i implementację Clock / Peripheral Manager, który używa narzędzia, które już napisałem. Ten menedżer zegara / urządzeń peryferyjnych dałby mi kontrolę nad włączaniem / wyłączaniem potrzebnych urządzeń peryferyjnych. Zasadniczo ten menedżer umożliwiłby mi wprowadzanie zmian w kodzie inicjującym, który jest właśnie uruchomiony. Również podczas pracy proces może wywołać tego menedżera, aby włączyć / wyłączyć urządzenia, aby zoptymalizować zużycie energii. To mogło nie mieć sensu, ale ja sam próbuję to objąć.

Teraz jestem pewien, że coś takiego zostałoby zaimplementowane w Linuksie lub w jakimkolwiek systemie operacyjnym pod kątem problemów z wydajnością (nikt nie chciałby marnować energii, włączając wszystkie urządzenia peryferyjne podczas startu systemu). Chcę zrozumieć jego architekturę oprogramowania. Odniesienia z dowolnego systemu operacyjnego sprawiłyby, że przynajmniej uzyskają przewagę. Nie piszę też własnego systemu operacyjnego, istnieje system operacyjny, ale szukam więcej na poziomie oprogramowania na poziomie boarda, inaczej BSP. Ale dzięki za link OS i tak, są naprawdę dobre. Doceniam to.

Dzięki!


12
2017-07-01 19:53


pochodzenie




Odpowiedzi:


To, co chcesz osiągnąć, jest ściśle związane z a) platformą, z której korzystasz, oraz b) urządzeniem, z którego chcesz korzystać. Na przykład na x86 istnieją 3 sposoby komunikacji z urządzeniem:

  1. Przerwania pozwalają urządzeniu zasygnalizować procesor. System operacyjny zazwyczaj zapewnia mechanizmy do rejestrowania procedur obsługi przerwań - funkcje, które są wywoływane po wystąpieniu przerwania. W systemie Linux zobacz request_irq () i znajomych w linux / include / interrupt.h
  2. Mapowane na pamięć I / O jest fizyczną pamięcią urządzenia, które BIOS platformy udostępnia w taki sam sposób, jak dostęp do zwykłej pamięci fizycznej - wystarczy, że zapiszesz na adres pamięci. To, co dokładnie znajduje się za taką pamięcią (np. Rejestry konfiguracyjne interfejsu sieciowego lub bufor ramki LCD) zależy od urządzenia i jest zwykle określone w arkuszu danych urządzenia.
  3. Wejścia I / O są dostępne poprzez specjalną przestrzeń adresową i specjalne instrukcje (INB / OUTB i wsp.). Poza tym działają podobnie do pamięci I / O.

Istnieje wiele sposobów, aby dowiedzieć się, jakie zasoby zapewnia urządzenie i gdzie je zmapował BIOS. Niektóre platformy używają tabel ACPI (google dla specyfikacji strony 1000k), PCI dostarcza informacje o urządzeniach w znormalizowany sposób poprzez przestrzeń konfiguracyjną PCI, USB ma podobne sposoby odkrywania urządzeń podłączonych do magistrali i niektórych urządzeń, np. UARTS , są po prostu określone, aby były dostępne we wstępnie skonfigurowanym zakresie we / wy, który jest ustawiony dla twojej platformy.

Jako początek zrozumienia Linuksa, polecam "Zrozumienie jądra Linux". Aby poznać szczegóły na temat tego, jak Linux obsługuje urządzenia i co jest do napisania sterowników, spójrz na Sterowniki urządzeń Linux. Ponadto musisz przyjrzeć się osobliwościom swojej platformy i urządzenia, które chcesz prowadzić.

Jeśli chcesz uruchomić własny system operacyjny, UART jest z pewnością czymś, co będzie bardzo pomocne przy drukowaniu danych wyjściowych debugowania, więc możesz chcieć tego najpierw.

Teraz, gdy to zapisałem, wydaje się, że twoje aktualne pytanie brzmi: jak zacząć projektowanie systemu operacyjnego. To pytanie powinno być dla Ciebie bardzo cenne: Jakie są zasoby potrzebne do rozpoczęcia pracy nad rozwojem systemu operacyjnego?


6
2017-07-01 20:36



Więc to, co zasadniczo próbuję zrobić, to mieć jakiś system na miejscu, tak, że mogę odpowiednio włączyć wymagane sygnały / zegary dla odpowiedniego h / w. - The Stig
Contd (klawisz Return rzekomo wkleja komentarz) Na przykład podczas rozruchu może tylko UART może być włączony, ale reszta może być wyłączona, aby oszczędzać energię. Później, gdy LCD musi uruchomić, może wysłać żądanie do narzędzia / menedżera, aby włączyć pewne sygnały (będą one znane ze specyfikacji h / w). Tak więc narzędzie podejmie odpowiednie działanie, ustawiając wymagane bity w rejestrze kontrolnym dla LCD "HIGH". - The Stig
Jestem pewien, że zostało to rozwiązane w zorganizowany sposób w jądrze Linuksa, po prostu nie wiem, gdzie szukać. - The Stig
Ok, rozumiem. Jest to naprawdę specyficzne dla sprzętu i urządzenia. Edytuję moją odpowiedź. - BjoernD
Zmieniłem moje pytanie, aby dodać więcej szczegółów i odpowiedzieć na kilka rzeczy, które opublikowałeś. - The Stig


Dwóch potężnych użytkowników na większości komputerów to procesor i dyski. Oba te mają możliwości oszczędzania energii w systemie Linux. Zegar procesora może zostać spowolniony, gdy system nie jest zajęty, a silniki dyskowe mogą zostać zatrzymane, gdy nie ma żadnych operacji we / wy. W przypadku UART, nawet jeśli zaoszczędzimy całą moc, którą zużyje, wyłączając jego zegar, nadal jest mały w porównaniu do innych, ponieważ UART nie ma w sobie wiele logiki.

Najlepsze sposoby na oszczędzanie energii są 1) bardziej wydajny zasilacz 2) Zamień dysk obrotowy na SSD 3) Zwolnij procesor i magistralę pamięci


0
2017-07-10 23:41



Jaka jest twoja odpowiedź na pytanie? - BjoernD
Steve: Doceniam, że wspomniałeś o sposobach oszczędzania energii, ale szukam sposobu na efektywne zarządzanie urządzeniami peryferyjnymi, by oszczędzać energię, jak to określiłem szczegółowo w moim pytaniu. Wiem, że dynamiczne skalowanie częstotliwości procesora jest dobrym rozwiązaniem, ale nie pracuję nad nim od teraz. I nie mówię tylko o UART, raczej o menadżerze obsługującym wszystkie urządzenia peryferyjne, w tym LCD, USB itd., Które, jak przypuszczam, zgodzisz się zużywać dużo energii. - The Stig