2011-07-01 19 views
12

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.Implementacja sygnałów zegarowych sprzętowych w jądrze Linux

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.

[Edytuj]
Dzięki 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óre mnie interesują, tj. Włączania ich/wyłączania z linii poleceń.Teraz zbiór tych zegarów/sygnałów razem kontroluje urządzenie peryferyjne. 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ęsem mojego pytania jest to, że chcę zrozumieć projekt i wykonanie zegara/urządzenia peryferyjnego, 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 rozruchu). 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!

Odpowiedz

6

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 komputerze 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 Linuksie zobacz request_irq() i znajomych w linux/include/interrupt.h
  2. We/wy odwzorowane na pamięć jest fizyczną pamięcią urządzenia udostępnianą przez platformę BIOS w taki sam sposób, jak dostęp do zwykłej pamięci fizycznej - wystarczy zapisywanie 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. Dostęp do portów we/wy uzyskujemy dzięki specjalnej przestrzeni adresowej i specjalnym instrukcjom (INB/OUTB & co.). Poza tym działają podobnie do pamięci I/O.

Istnieje wiele sposobów, aby dowiedzieć się, jakie zasoby oferuje 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 "Understanding the Linux kernel". Aby poznać szczegóły na temat tego, jak Linux obsługuje urządzenia i co jest do napisania sterowników, spójrz na Linux Device Drivers. 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 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: What are some resources for getting started in operating system development?

+0

Więc co ja po prostu staramy się robić to mieć jakiś systemu w miejscu, dzięki czemu mogę odpowiednio włączyć wymagane sygnały/zegary dla odpowiedniego h/w. –

+0

Contd (klucz powrotny rzekomo wkleja komentarz) Tak 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ć w przypadku niektórych sygnałów (będą one znane ze specyfikacji h/w). Tak więc narzędzie podejmie odpowiednie działanie, ustawiając wymagane bity w rejestrze sterowania dla LCD "HIGH". –

+0

Jestem pewna, że ​​zostało to rozwiązane w zorganizowany sposób w jądrze Linuksa, to znaczy, że nie wiem, gdzie szukać. –

0

Dwoma potężnymi użytkownikami na większości komputerów są 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 oszczędzania energii są 1) bardziej wydajne zasilanie 2) zastąpić obrotową dysku z SSD 3) Zwalnianie procesora i pamięci autobus

+0

Jaka jest twoja odpowiedź na pytanie? – BjoernD

+0

Steve - Doceniam, że wspomniałeś o sposobach oszczędzania energii, ale szukam sposobu, by efektywniej zarządzać urządzeniami peryferyjnymi, aby 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. –