W systemach Linux i Windows jestem przyzwyczajony do sytuacji, że potrzebuję 64-bitowego jądra, aby mieć system z wieloma procesami / WoW, w którym mogę uruchamiać oprogramowanie 32-bitowe i 64-bitowe obok siebie.
A potem, lata temu, oszalało mi na myśl, gdy ktoś pokazał mi, że MacOS 10.6 Snow Leopard może uruchamiać 64-bitowe aplikacje z jądrem w trybie 32-bitowym. Można to teraz w dużej mierze zapomnieć, ponieważ była to jednorazowa zmiana technologii. Ze sprzętem wyprzedzającym krzywą w przestrzeni mobilnej, o ile wiem, nigdy nie było to potrzebne w przejściu na 64-bit dla iOS i Androida.
Moje pytanie: Czego potrzeba, aby uzyskać taką samą funkcjonalność w 32-bitowym jądrze Linuksa (i386 lub armhf)?
Rozumiem, że to prawdopodobnie nie jest trywialne. Gdyby tak było, Microsoft mógłby umieścić tę funkcję w 32-bitowym systemie Windows XP. Jakie są jednak ogólne wymagania? Czy kiedykolwiek zaproponowano łatkę lub weryfikację koncepcji?
W świecie osadzonym myślę, że byłoby to szczególnie pomocne, ponieważ obsługa 64-bitowa może pozostawać w tyle przez długi czas w sterownikach urządzeń.
Odpowiedzi:
Uruchamianie aplikacji 64-bitowych wymaga pewnej obsługi z jądra: jądro musi co najmniej skonfigurować tabele stron, tabele przerwań itp., Jeśli jest to konieczne do obsługi działania 64-bitowego kodu na procesorze, i musi zapisać pełne 64-bitowe kontekst podczas przełączania między aplikacjami (oraz z aplikacji na jądro iz powrotem). Zatem czysto 32-bitowe jądro nie obsługuje 64-bitowej przestrzeni użytkownika.
Jednak jądro może uruchamiać 32-bitowy kod w przestrzeni jądra, jednocześnie obsługując 64-bitowy kod w przestrzeni użytkownika. Obejmuje to obsługę podobną do obsługi wymaganej do uruchamiania 32-bitowych aplikacji z 64-bitowym jądrem: w zasadzie jądro musi obsługiwać 64-bitowe interfejsy, których oczekują aplikacje. Na przykład musi udostępnić mechanizm 64-bitowego kodu do wywołania do jądra i zachować znaczenie parametrów (w obu kierunkach).
Pytanie brzmi zatem, czy warto. Na Macu i niektórych innych systemach można zrobić przypadek, ponieważ obsługa 32-bitowego kodu jądra oznacza, że sterowniki nie muszą wszyscy przełączać się jednocześnie. W Linuksie model programowania jest inny: wszystko w jądrze jest migrowane w razie potrzeby, gdy wprowadzane są duże zmiany, a wszystko poza jądrem nie jest tak naprawdę obsługiwane przez programistów jądra. Obsługa 32-bitowej przestrzeni użytkownika za pomocą 64-bitowego jądra jest z pewnością przydatna i warta wysiłku (przynajmniej było to, gdy dodana została obsługa x86-64), nie jestem pewien, czy istnieje uzasadnienie dla wersji 64-bitowej na 32 -kawałek...
źródło
Snow Leopard był w stanie uruchomić 64-bitowe pliki binarne w 64-bitowym procesorze Intel.
Był także w stanie uruchomić się z 64-bitowym jądrem, gdy efi miał już 64 bity (moja partia produkcyjna Macbooka „model przejściowy” pro była już taką maszyną).
Nie było żadnej emulacji, po prostu zapłaciłeś mniejszy koszt wydajności podczas rozruchu w trybie 32-bitowym.
W czysto 32-bitowych procesorach nie będziesz w stanie tego zrobić, ponieważ nie mają pojęcia, jak interpretować 64-bitowy kod. Chyba że emulujesz za pomocą oprogramowania, które byłoby wolniejsze dla tego rodzaju tradycyjnie słabej klasy wbudowanych maszyn.
źródło