2014-09-11 9 views
5

Mam ogromny kod źródłowy, który działa na PowerPC. Muszę przenieść go do ARM. Ale ARM generuje wyjątek h/w na niewyrównanych dostępach do pamięci. Tak więc chcę znaleźć wszystkie możliwe przypadki, w których może wystąpić niewyrównany wyjątek dostępu do pamięci. Rozważyłem następujące opcje.Generowanie niewyrównanego wyjątku dostępu do pamięci w PowerPC

  1. Użyj opcji -Wstaw-wyskalowanie w gcc, która powodowałaby wyświetlanie ostrzeżeń o braku dostępu.
  2. Wykonaj PowerPC, generując niepodpisany wyjątek. W przypadku ARM istnieje opcja/proc/cpu/alignment, dzięki której użytkownik może zdecydować, w jaki sposób obsłużyć wyjątek. Ale nie ma takiej opcji dla PowerPC.

Moje pytania są

  1. Czy istnieje sposób, aby generować PowerPC aligné wyjątek dostępu do pamięci?
  2. Czy istnieje lepszy sposób na wykrycie wszystkich przypadków braku dostępu do pamięci w kodzie źródłowym?
+0

sposób na wygenerowanie przez PowerPC niewyrównanego dostępu do pamięci - niektóre opcje w jądrze (CONFIG_ALIGNMENT_TRAP, itp.)? – someuser

+0

Możesz także przesyłać, przechwytywać i naprawiać. :) – someuser

+0

PowerPC zawsze generuje wyjątki wyrównania, z wyjątkiem ładunków/zapasów AltiVec. Oczywiście twój system operacyjny może w milczeniu poradzić sobie z tymi wyjątkami, ale to już inna historia. –

Odpowiedz

2
  1. To zależy od procesora PowerPC. Wysokiej klasy procesory serwerowe, takie jak POWER8, prawie nigdy nie wygenerują wyjątków wyrównania. Biorąc to pod uwagę, często występuje bit SPID HID, który sprawia, że ​​wyjątki wyrównania występują częściej. Tak czy inaczej, pod Linuksem jądro obsłuży je, a użytkownik go nie zobaczy, poza utratą wydajności. Możesz ustawić prctl (PR_UNALIGN_SIGBUS), co spowoduje, że jądro wygeneruje SIGBUS, zamiast obsługiwać je.

  2. W systemie Linux z wydarzeniami perf można używać zdarzeń alignment-faults. np. "walizka testowa perf stat -e alignment-faults". Również jeśli włączysz CONFIG_PPC_EMULATED_STATS, otrzymasz wpis debugfs o nazwie "emulated_instructions", który ma wpis dla niealarmowanych dostępów.

+0

Zamiast wykonywać wszystkie te czynności, czy nie lepiej jest skompilować za pomocą funkcji "Wyczyść-wyrównanie" i naprawić wszystkie problemy? – linuxfreak

+0

Tak, najlepiej unikać takich sytuacji, gdy jest to możliwe. Czasem nie jest to możliwe i możesz chcieć to sprawdzić. –

2
  1. Tak i nie. Sprzęt PowerPC ma 32-bitowy, niewyrównany dostęp w sprzęcie, którego nie można łatwo przesłonić. Ale jeśli używasz "gołego metalu" w przeciwieństwie do systemu operacyjnego, możesz wymusić wygenerowanie wyjątku przez mapowanie obszaru pamięci jako przestrzeni we/wy. Takie podejście jest jednak skomplikowane i prawdopodobnie lepiej byłoby przejrzeć kod ręcznie.

    W przypadku dostępu 64-bitowego większość PowerPC już generuje wyjątki w przypadku braku dostępu, jeśli tak jest w przypadku sprzętu, który można zamknąć w pułapce. Znowu musi to się zdarzyć w jądrze, więc jeśli używasz systemu operacyjnego, nie możesz tego łatwo zrobić (jądro będzie wtedy obsługiwać niewyrównany dostęp w oprogramowaniu bez informowania Cię o tym).

  2. Nie do końca tak naprawdę można to określić tylko w czasie wykonywania, szczególnie jeśli wykonujemy wiele arytmetyki wskaźników.

+0

1) Używam go w systemie operacyjnym, a nie na "gołym metalu". Czy jest możliwe utworzenie wpisu/proc/cpu/wyrównania i obsłużenie wyjątku w jądrze? 2) Wygląda na to, że nie ma innej możliwości zrobienia tego w czasie wykonywania. Czy możemy użyć statycznego analizatora, aby znaleźć wszystkie wystąpienia? – linuxfreak

+2

Zawsze można obsłużyć ten rodzaj wyjątku w jądrze, emulując nieudany dostęp. Tak samo jest w MIPS. Ale jest ciężka kara za wydajność, więc najlepszym sposobem jest wyeliminowanie jak największej ilości kodu źródłowego i emulacja jako back-stop. Możesz mieć licznik dla niealarmowanych dostępów odsłoniętych w/proc fs, możesz również rejestrować adresy, do których dostęp ma dostęp, a następnie retrospektywnie naprawiać je w kodzie źródłowym. Nie wiem o żadnym narzędziu do analizy statycznej, które mogłoby złapać wszystkie te rzeczy, i nie sądzę, że można to zrobić w 100%. – ThomasH

Powiązane problemy