2011-07-12 6 views
6

W przeciwieństwie do (większości) łuku RISC instrukcje x86 mają zmienną długość. Początek/koniec instrukcji nie musi być wyrównany. Jeśli kompilator nie może po prostu kłaść jednej instrukcji na marginesie strony.W jaki sposób sprzęt i kompilator radzą sobie z instrukcją x86, która przechodzi w stronę, która nie jest wykonywalna?

Załóżmy, że jeśli pierwszy bajt instrukcji jest na ostatnim bajcie strony, który jest oznaczony jako plik wykonywalny. Pozostałe bajty instrukcji znajdują się na drugiej stronie, która jest oznaczona jako niewykonywalna.

W takim przypadku, co stanie się w CPU, gdy wykonanie osiągnie tę instrukcję?

Czy kompilator musi zajmować się takimi przypadkami?

+1

Wzniesiono niewyjaśnione potępienie. – EJP

+0

Gdy następna strona * jest * wykonywalna, po prostu działa. Pobieranie odbywa się w porcjach wyrównanych, tworząc kolejkę dla dekoderów. Łączenie bajtów z oddzielnych stron dzieje się po pewnym czasie po zakończeniu pobierania, po sprawdzeniu TLB, więc nie jest to jak ładowanie danych podzielone na strony. –

Odpowiedz

5

Sprzęt (powinien, nie przetestowany) wygeneruje GPF.

Kompilator nie powinien się przejmować.

+3

Przypominam sobie błąd związany z tym z wczesnymi chipami iapx286 w trybie chronionym. Albo nie udałoby się GPF na polecenie przekraczające granicę, albo błędnie GPF z instrukcją, która powinna pasować do środka. Nie pamiętam w tej chwili ... #trivia :-) –