Czy można uruchomić procesor klasy x86 bez ramek?

9

Nowoczesne procesory x86 mają co najmniej 512 KB pamięci podręcznej L2. Istnieją aplikacje, które pasowałyby całkowicie do tej ilości pamięci. Czy możesz uruchomić te układy bez podłączonej pamięci RAM? Jeśli tak, to czy istnieje sposób, aby to zrobić, eliminując karę czasową zapisu zwrotnego, gdy procesor próbuje utrzymać spójność pamięci RAM?

Nie mam na myśli konkretnej aplikacji, to tylko bezczynna ciekawość. Jestem pewien, że gdzieś jest niszowa aplikacja, w której byłoby to przydatne.

Mark Ransom
źródło

Odpowiedzi:

12

Tak, możesz. Udając odczyty z kolejnych (nieistniejących) lokalizacji pamięci fizycznej, ustawiasz tagi w pamięci podręcznej. Następnie wyłączasz dalsze wypełnianie cachelines i wchodzisz do zapisu zwrotnego, ograniczając w ten sposób odczyt / zapis do bufora i będzie on zachowywał się jak normalna pamięć RAM.

Niektóre projekty zastępujące bios to robią, ponieważ wtedy możesz wydać znacznie więcej kodu na konfigurację chipsetu i kontrolera pamięci chipsetu, więc możesz na przykład napisać go w C.

Ta praktyka jest szeroko stosowana w procesorach klasy wbudowanej, a także do obsługi programów ładujących. Metody zmiany pamięci podręcznej w tryb przypominający pamięć RAM różnią się nieco.

Krótkie wprowadzenie na niskim poziomie można sprawdzić w tej prezentacji.

Zauważ, że jak zauważyli inni, nadal musisz skądś załadować kod startowy.

Bjorn Wesen
źródło
W rzeczywistości myślę, że prawie wszystkie współczesne BIOS-y używają tego i prawie wszystkie współczesne procesory x86 mają z tego powodu oficjalne wsparcie.
Yuhong Bao
7

Po zresetowaniu procesora pamięć podręczna jest wyłączana. BIOS jest tym, co początkowo konfiguruje i czyści pamięć podręczną. Więc nie, nie można uruchamiać go bez pamięci RAM, ponieważ nie ma pamięci RAM do uruchomienia.


źródło
1
Czy kilka pierwszych instrukcji z pamięci ROM nie mogło zainicjować i włączyć pamięci podręcznej bez użycia pamięci RAM?
Mark Ransom,
1
@ Mark Ransom Nowoczesne procesory Intel (i wiele innych procesorów) używają Serial Flash do przechowywania BIOS-u. Ale nie może wykonać kodu z szeregowej pamięci flash. Zamiast tego CPU kopiuje tę pamięć flash szeregową do pamięci RAM, a następnie wykonuje ją.
Hah, moja ignorancja pokazuje - możesz zobaczyć, ile lat minęło, odkąd zaprojektowałem sprzęt. Więc CPU kopiuje flash automatycznie przed wykonaniem pierwszej instrukcji? To byłby paskudny problem z kurczakiem / jajkiem do rozwiązania.
Mark Ransom,
@David Ściśle mówiąc, nie jest to „seryjny” flash, ale „Firmware Hub”. Różni się to od „seryjnego” tym, że przesyła 4 bity naraz zamiast 1.
Majenko
1
@ Mark Ransom Istnieje wiele procesorów / MCU / DSP, które uruchamiają się przez łącze szeregowe (Serial Flash, RS-232, SPI itp.). Wszyscy osiągają to, mając małą pamięć ROM w procesorze, z którego uruchamia się, a kod ten załaduje „prawdziwy” kod z dowolnego miejsca. Uruchomienie systemu bez pamięci RAM teoretycznie byłoby możliwe, gdyby Intel zmodyfikował ten kod, aby używał pamięci podręcznej zamiast zewnętrznej pamięci RAM. Ale wątpię, czy Intel to zrobi.
3

Nie wiem, jak dokładne to jest, ale oto moje przemyślenia:

Nie sądzę, aby można było uzyskać programowy dostęp do pamięci podręcznej. Nie możesz zagwarantować z jednej instrukcji do drugiej, co będzie w pamięci podręcznej i gdzie będzie się znajdować, więc nie możesz jej używać niezawodnie jako pamięci RAM, nawet jeśli możesz uzyskać do niej bezpośredni dostęp.

Możesz uruchomić x86 bez pamięci RAM, ale nie byłbyś w stanie sprawić, by był bardzo użyteczny. Będziesz ograniczony do zwykłego korzystania z wewnętrznych rejestrów do przechowywania danych.

Majenko
źródło
2
Protokoły wypełniania i opróżniania pamięci podręcznej są dokładnie udokumentowane i konfigurowalne w większości procesorów, w tym x86. Zawartość podręcznej pamięci nie jest losowo opróżniana między instrukcjami. Zobacz moją odpowiedź na temat tego, jak zwykle ustawiasz go, by zachowywał się jak liniowa pamięć RAM.
Bjorn Wesen
Napisałem narzędzie do ładowania hexów dla klonu 80x86, który działałby poprawnie bez pamięci RAM; IIRC, zaimplementowałem jednopoziomowy stos wywołań za pomocą SP do przechowywania adresu zwrotnego. Ponieważ pamięć ROM znajdowała się w tej samej magistrali co pamięć RAM, nie było strasznie prawdopodobne, że wystąpiłby problem, który pozwoliłby na pracę ROM, gdy pamięć RAM nie działała, ale w takim przypadku moduł ładujący mógł zdiagnozować problem. Na niektórych innych mikrach z zewnętrznymi szynami kodu, ale niewielką ilością wewnętrznej przestrzeni kodu, możliwość uruchomienia kodu w systemie z uszkodzoną magistralą była przydatnym narzędziem diagnostycznym.
supercat
@ Mogę się mylić, ale czy pamięć RAM nie jest przeznaczona do kodu binarnego oraz do odczytu i zapisu przez procesor?
Victor Mehta