Obecnie używam funkcji do_gettimeofday()
do mierzenia czasu w jądrze, co daje mi dokładność mikrosekundy. Czy jest coś, co jest bardziej precyzyjne niż to (być może rzędu nanosekund)?Czas pomiaru w przestrzeni jądra Linuksa z sub-mikro-sekundową precyzją
Odpowiedz
Funkcja zwraca ktime_t
, która ma rozdzielczość nanosekund.
Poniższy kod używający tych funkcji wydaje się tworzyć 0: long long int nsTime = ktime_to_ns (ktime_get()); \t printk ("czas rozpoczęcia w ns to% d", nsTime); Każdy pomysł, dlaczego? –
@JohnRoberts: Musisz użyć '% lld', aby wydrukować' long long int'. – caf
@caf: Mam podobny problem, tj. Otrzymuję 0 ns. kod wygląda mniej więcej tak ... Start = ktime_get(); ... Funkcja(); ... end = ktime_get(); actual_time = ktime_to_ns (ktime_sub (end, start)); printk (KERN_INFO "Czas zajęty =% lld \ n", (długa długa) actual_time); –
Z tego co wiem, najbardziej dokładnym zegarem powinien być rejestr liczników specyficzny dla procesora (taki jak TSC w x86). Jądro Linux dostarcza makra rdtsc, rdtscl, rdtscll z pliku "./arch/x86/include/asm/msr.h", aby odczytać tę wartość rejestru. Dla ARM, cycle counter register.
Te rejestry różnią się od procesora do procesora. Wspólnym interfejsem dostępu do niego jest funkcja "get_cycles", która jest zadeklarowana w pliku.
Może, this document może być pomocne.
Czy TSC nie jest zbyt wiarygodne, jeśli chodzi o maszyny wielordzeniowe? –
Masz rację. W maszynie wielordzeniowej należy zachować ostrożność przy korzystaniu z rejestru TSC z określonego procesora. – Wonil
- 1. Programowanie jądra Linuksa: makefile
- 2. Zmień timer jądra Linuksa
- 3. Niepowodzenie kompilacji jądra Linuksa
- 4. Funkcjonalność jądra linuksa
- 5. Kodowanie jądra Linuksa w stylu
- 6. Debugowanie jądra Linuksa w panice
- 7. Jądro Linuksa Czas odbioru UDP
- 8. Obniżanie częstotliwości zegara jądra Linuksa
- 9. Pobieranie konfiguracji z obrazu jądra Linuksa
- 10. Funkcja mprotect() podobna do jądra Linuksa
- 11. ustawianie powinowactwa wątku w module jądra Linuksa
- 12. Przeniesienie kodu przestrzeni użytkownika do przestrzeni jądra
- 13. Jak spać w jądrze Linuksa?
- 14. Zrzuty jądra Linuksa są zbyt duże!
- 15. Jak korzystać z ioctl() z przestrzeni jądra w systemie Linux?
- 16. Co robi "make oldconfig" dokładnie w pliku make jądra Linuksa?
- 17. Czas na Linuksa dla gniazd TCP
- 18. SELECT FLOAT z zadaną precyzją
- 19. Wysyłanie struct z jądra do przestrzeni użytkownika poprzez netlink
- 20. Czy strony jądra są zamieniane?
- 21. Funkcja pomiaru MFC w milisekundach
- 22. Operacje matematyczne z jedną precyzją w .NET?
- 23. Jak echo pakietu w przestrzeni jądra za pomocą hooków netfiltra?
- 24. Rozmiar bufora do przechwytywania pakietów w przestrzeni jądra?
- 25. Uzyskaj aktualny czas w sekundach w module jądra
- 26. Wybierz zmiennoprzecinkowe z MySQL z poprawną precyzją
- 27. Czy istnieją narzędzia jądra dostępne do pomiaru opóźnienia przerwania z odpowiednią dokładnością?
- 28. Czy możemy wywołać wywołanie systemowe w przestrzeni jądra?
- 29. Sygnał modułu jądra Linux w procesie przestrzeni użytkownika zabity
- 30. Wynik pomiaru z odpowiedzi OData
Co dokładnie chcesz zmierzyć tak "dokładnie" ...? A twój sprzęt nie jest tak deterministyczny, jak ci się wydaje (luki w pamięci podręcznej mogą często zmieniać czas). –
Chcę zmierzyć czas potrzebny do wykonania określonej operacji na określonym sprzęcie. Zmierzam to w swoim kierowcy. –