Gdzie jest przechowywany bootloader - w ROM, RAM lub gdzie indziej?


30

Zgodnie z wpisem wikipedia, bootloader to mały program przechowywany w pamięci ROM (część pamięci głównej (RAM), prawda?), Który można tylko odczytać, a nie skasować. Jestem trochę zaskoczony. Czy to oznacza, że ​​każda kupowana pamięć RAM ma domyślnie zainstalowany moduł ładujący? A także czytam z książki, która mówi, że na dysku twardym jest zwykle obszar o nazwie MBR (Master Boot Record), który zawiera bootloader ...

Gdzie dokładnie znajduje się ten bootloader? Czy różne systemy operacyjne przechowują swoje programy ładujące w różnych miejscach?

Odpowiedzi:


43

ROM to odrębny układ od pamięci RAM. Nie wymaga zasilania, aby zachować swoją zawartość, i pierwotnie nie mógł być modyfikowany w żaden sposób, ale został dostarczony fabrycznie. Później PROM lub programowalna pamięć tylko do odczytu zastąpiła prawdziwą pamięć ROM. Te czipy zostały fabrycznie puste i można je było zapisać raz przy użyciu specjalnej procedury, która zasadniczo wypaliła bity układu, powodując zmianę ich stanu. Zostało to następnie zastąpione przez EPROM lub Eraseable Programmable Memory. Te czipy miały małe okienko, a jeśli podświetliłeś je ultrafioletem, można je było usunąć, umożliwiając ich ponowne zaprogramowanie. Zostały one następnie zastąpione EEPROM lub pamięcią programowalną elektrycznie kasowalną. Te układy mają specjalną procedurę programową, aby je usunąć, aby można je było przeprogramować.

Płyta główna ma jakiś układ ROM, który przechowuje oprogramowanie układowe, które w języku PC nazywa się zwykle BIOS lub Basic Input Output System, choć obecnie jest zastępowane oprogramowaniem układowym EFI. Jest to oprogramowanie, które procesor zaczyna od uruchomienia po włączeniu zasilania. Całe oprogramowanie układowe wykonuje inicjalizację sprzętu, zazwyczaj zapewnia dane wyjściowe diagnostyczne i umożliwia użytkownikowi konfigurację sprzętu, a następnie lokalizuje i ładuje moduł ładujący, który z kolei lokalizuje i ładuje system operacyjny.

W systemie BIOS komputera po prostu ładuje się i wykonuje pierwszy sektor z dysku, z którego zdecyduje się uruchomić komputer, który zwykle jest pierwszym wykrytym dyskiem twardym. Zgodnie z konwencją pierwszy sektor dysku twardego, zwany głównym rekordem rozruchowym, zawiera tablicę partycji DOS z listą lokalizacji partycji na dysku i pozostawia miejsce dla modułu ładującego. Ubuntu używa modułu ładującego GRUB, który umieszcza wystarczającą ilość kodu w MBR, aby załadować i wykonać /boot/grub/core.img. Zwykle kopia tego pliku jest umieszczana w sektorach następujących po MBR, ale przed pierwszą partycją, i to właśnie ładuje MBR, ponieważ znalezienie lokalizacji /boot/grub/core.imgjest zbyt trudne do prawidłowego wykonania w bardzo ograniczonej przestrzeni dostępnej w MBR .

Obraz rdzenia grub zawiera podstawowy kod grub, plus wszystkie moduły potrzebne do uzyskania dostępu, /boot/grubaby mógł tam załadować dodatkowe moduły, a także plik konfiguracyjny grub, który opisuje, jakie systemy operacyjne można uruchomić i gdzie można je znaleźć.

Oprogramowanie układowe EFI używane na komputerach Mac z procesorami Intel i staje się dostępne jako zamiennik systemu BIOS na najnowszych płytach głównych do komputerów PC, wymaga dedykowanej partycji przechowującej pliki modułu ładującego rozruch, a oprogramowanie układowe jest wystarczająco inteligentne, aby znaleźć te pliki i załadować jeden zamiast ładować i wykonywać cokolwiek znajduje się w pierwszym sektorze dysku.


Oto akapit zaczerpnięty z Glenn Brookshear's Computer Science, Przegląd A small portion of a computer's main memory where the CPU expects to find its initial program is constructed from special nonvolatile memory cells. Such memory is known as read-only memory(ROM) Według niego. Główna pamięć składa się z dwóch części: RAM i ROM. Chcę tylko wiedzieć, czy tak zwany bootloader jest zainstalowany w części ROM pamięci głównej ... @Sergey
xczzhh

@xczzhh - tak BIOS jest przechowywany w pamięci ROM, która wykrywa Bootloader obecny w partycjach. Po zainstalowaniu dowolnego systemu operacyjnego tworzy w BIOS-ie rodzaj flagi wejścia w celu wykrycia odpowiedniego BOOTLOADERA.
atenz

1
@xczzhh, nie, moduł ładujący znajduje się na dysku twardym lub innym dysku. Jest instalowany wraz z systemem operacyjnym. O ile nie pobierzesz i nie zainstalujesz aktualizacji od producenta płyty głównej, pamięć ROM nigdy się nie zmieni.
psusi

Zamiast tego EFI korzysta z aplikacji EFI. Ładuje aplikację EFI do pamięci NVRAM
Suici Doga,

@ SuiciDoga, nie, aplikacje EFI (które są zasadniczo ograniczone do kilku narzędzi do aktualizacji oprogramowania układowego i programów ładujących rozruch) są przechowywane na partycji systemowej EFI dysku twardego. NVRAM to miejsce, w którym EFI przechowuje niektóre zmienne konfiguracyjne, takie jak kolejność rozruchu.
psusi

23

ROM nie znajduje się w pamięci głównej:

ROM nie jest częścią pamięci głównej. Jest to osobny układ, który przez większość czasu jest wbudowany w większy układ scalony. Więcej przykładów: Twój komputer może składać się z kilku ROM. Te są wbudowane w twoją płytę główną.

Ogólnie:

  • Pamięć ROM ma bardzo mały rozmiar pamięci. Pamięć ta jest nieulotna, w tym sensie, że program przechowywany w pamięci ROM nie jest kasowany po wyłączeniu zasilania.
  • ROM są używane do przechowywania stałych programów, które są bardzo niezbędne do prawidłowego działania sprzętu.
  • Typowym przykładem ROM jest układ BIOS. Gdzie przechowywany jest program bardzo niskiego poziomu sprzętu do uruchamiania i inicjalizacji

Wspomniałeś o tym, czytasz artykuł, w którym autor powiedział: „ROM jest częścią pamięci głównej”. Jest to mylące, ponieważ zazwyczaj pamięć główna odnosi się do pamięci rodzajów lotnych, takich jak RAM. Ale tak, jeśli użyjesz terminu Pamięć główna dla całej przestrzeni pamięci komputera, to pamięć ROM jest częścią tego miejsca. Należy zauważyć, że ogólnie pamięć główna wyklucza pamięć rodzajów jako ROM .

Gdzie jest przechowywany Bootloader:

Nowoczesny system wykorzystuje dwustopniowy rozruch. W pierwszym kroku mały program jest ładowany z sektora (zwanego częściej sektorem rozruchowym) dysku twardego. Ten mały program z kolei ładuje program z jakiegoś miejsca na dysku, który nazywa się bootloaderem. I w końcu bootloader ładuje system operacyjny.

W przypadku systemu Ubuntu proces wygląda następująco:

  1. Po włączeniu komputera system BIOS (zapisany w pamięci ROM) automatycznie uruchamia się i inicjuje różne części sprzętu komputerowego. Następnie sprawdza określony sektor w zdefiniowanym pierwszym urządzeniu rozruchowym (zazwyczaj na dysku twardym). Ten sektor jest sektorem rozruchowym o rozmiarze 512 bajtów.

  2. Program w sektorze rozruchowym jest ładowany do pamięci (1. etap). Ten mały program zawiera informacje, które programy powinny następnie załadować do pamięci i gdzie ten program znajduje się na dysku lub urządzeniu rozruchowym. Ładuje ten program. W Ubuntu tak jest /boot/grub/core.img.

  3. W drugim etapie program ładujący system operacyjny, GRUB, ładuje Ubuntu, ładując jądro i początkowy dysk RAM do pamięci i przekazując kontrolę do jądra. Następnie jądro uruchamia się i ładuje wszystkie niezbędne programy, takie jak menedżer wyświetlania, GUI itp.

Możemy więc wyraźnie powiedzieć, że program ładujący nie jest ani przechowywany w pamięci ROM, ani w pamięci RAM, w rzeczywistości jest przechowywany na dysku twardym (lub innym urządzeniu rozruchowym, takim jak rozruchowy CDROM, napędy USB itp.), Mówiąc dokładnie o pierwszym sektorze dysk twardy, który ma rozmiar 512 bajtów i często nazywany sektorem rozruchowym . I ten program ładujący ładuje moduł ładujący system operacyjny (w Ubuntu jest to grub), który również znajduje się na dysku twardym (tj. /boot/grub/Folderze), a jego zadaniem jest ładowanie systemu operacyjnego (powiedzmy Ubuntu).

W ramach testu usuń dysk twardy (i wszystkie inne urządzenia rozruchowe) i spróbuj uruchomić komputer. Możesz przejść do kroku BIOS, ale po tym kroku nie możesz nic uruchomić. Najprawdopodobniej BIOS powie: „ Nie znaleziono urządzenia rozruchowego ” lub „ Nie znaleziono systemu operacyjnego ” lub coś podobnego.

Mam nadzieję, że ta odpowiedź pomoże.


Aby uzyskać więcej informacji, możesz odwiedzić te linki:

  1. http://en.wikipedia.org/wiki/Read-only_memory
  2. http://en.wikipedia.org/wiki/Random-access_memory

2
Pamięć ROM nie była szybsza niż pamięć RAM od około dekady. W rzeczywistości jedną z pierwszych rzeczy, które robi współczesny BIOS, jest kopiowanie się do pamięci RAM, ponieważ pamięć RAM jest o wiele szybsza.
David Schwartz

1
@DavidSchwartz, Minęło już ponad dziesięć lat. Każdy BIOS komputera, którego używałem w połowie lat 90., miał opcję cieniowania BIOS-u w pamięci RAM w celu zwiększenia szybkości.
psusi

@Anwar, link do głównej pamięci jest martwy.
Matt

15

Procesor kompatybilny z x86 zawsze uruchamia się w tak zwanym trybie „rzeczywistym”, który jest trybem 16-bitowym z dostępnym 1 megabajtem pamięci adresowalnej. Z tej przestrzeni adresowej dostępnych jest 640 KB dla programów, a powyższe adresy są mapowane na różne urządzenia.

Na przykład adresy zaczynające się od 0xA000: 0x0000 są odwzorowywane na RAM wideo, więc zapisywanie danych faktycznie zapisywałoby dane do pamięci karty wideo wyświetlającej piksele na ekranie.

Podobnie BIOS ROM zaczyna się od 0xF000: 0000, więc procesor po włączeniu po prostu zaczyna wykonywać instrukcje jeden po drugim, zaczynając od tego wstępnie zdefiniowanego adresu. BIOS ROM zawiera program początkowy, który rozpoczyna się od wykonania „autotestu po włączeniu” lub testu POST. Z Wikipedii:

Oprogramowanie BIOS jest wbudowane w komputer i jest pierwszym kodem uruchamianym przez komputer po włączeniu („oprogramowanie rozruchowe”). Po uruchomieniu komputera pierwszym zadaniem systemu BIOS jest autotest po włączeniu, który inicjuje i identyfikuje urządzenia systemowe, takie jak procesor, pamięć RAM, karta graficzna, klawiatura i mysz, dysk twardy, napęd dysków optycznych i inny sprzęt. Następnie BIOS lokalizuje oprogramowanie ładujące przechowywane na urządzeniu peryferyjnym (oznaczonym jako „urządzenie rozruchowe”), takim jak dysk twardy lub CD / DVD, i ładuje i uruchamia to oprogramowanie, zapewniając mu kontrolę nad komputerem. 2 Ten proces nazywa się uruchamianiem lub uruchamianiem, co jest skrótem od ładowania początkowego.

Oprogramowanie układowe systemu BIOS odpowiada za odczytanie pierwszego sektora z dysku do pamięci i przekazanie sterowania do małego programu, który ponownie znajduje się pod określonym adresem. Program ładujący MBR może następnie rozpocząć ładowanie systemu operacyjnego bezpośrednio (jak miało to miejsce w przypadku MS-DOS) lub załadować „drugi etap”, który nie jest ograniczony do sektora jednego dysku.

Programy ładujące, które wykorzystują podejście wieloetapowe, mogą być dość złożone z interfejsem tekstowym lub graficznym, który pozwala użytkownikowi wybrać, z którego dysku lub partycji załadować system operacyjny.

Jeśli więc, jak sugeruje Uri, jesteś zainteresowany tym, czy moduł ładujący systemu Windows i GRUB mogą istnieć razem, odpowiedź brzmi: rzeczywisty MBR może zawierać tylko jeden moduł ładujący pierwszego etapu (daj spokój, cały sektor ma tylko 512 bajtów) , ale drugi etap programu ładującego może „ładować łańcuchowo” systemy operacyjne z różnych partycji. Program ładujący Windows jest w stanie rozpoznać i załadować system Windows, podczas gdy GRUB jest w stanie załadować Linuksa lub przekazać kontrolę innemu programowi ładującemu przechowywanemu w rekordzie rozruchu woluminu jednej z partycji, co pozwala na uruchomienie systemu Windows lub innego systemu operacyjnego. Ten ostatni proces nazywa się ładowaniem łańcuchowym.

Kiedy zainstalujesz Ubuntu na komputerze z Windows, GRUB zostanie zainstalowany w MBR i będziesz mógł uruchomić zarówno Ubuntu, jak i Windows.

Jeśli jednak system Windows zostanie zainstalowany po Ubuntu, GRUB zostanie zastąpiony bootloaderem Windows i będziesz musiał ponownie zainstalować GRUB, aby móc ponownie uruchomić Ubuntu.


Przypuszczam, że chce wiedzieć, czy moduł ładujący Windows i GRUB mogą istnieć razem, czy nie. Dyski UEFI, GPT nie używają MBR, jak to na nich wpływa ?.
Uri Herrera

BIOS ROM znajduje się w segmencie F000:, który jest nieco poniżej 1 MB. 640k pochodzi z segmentów poniżej A000 :, które są dostępne dla systemu operacyjnego i programów w trybie rzeczywistym.
psusi

@psusi: masz rację, powtórzyłem tę część
Siergiej

Dziękuję za Twoją odpowiedź. Czy masz na myśli, że istnieje wiele programów ładujących (jeden w BIOSie, a drugi w MBR?) Zaangażowanych w uruchomienie systemu operacyjnego? Dla mnie to nowość ... :)
xczzhh

@xczzhh Cóż, ok, kod w BIOSie nie nazywa się „bootloaderem”, tak jak to ma miejsce na dysku. Zaktualizowałem swoją odpowiedź, aby to wyjaśnić.
Siergiej

4

Konflikt między tym, co mówisz o tym, że bootloader znajduje się w ROM-ie a MBR, może być spowodowane tym, że bootloader jest używany do każdego kodu, który sprawdza, jak zrobić minimum załadowania kodu, aby komputer zrobił coś użytecznego, w tym każdego stan w rozruchu wielostopniowym.

Tak więc stanem początkowym jest posiadanie komputera, który jest urządzeniem programowalnym, ale nie wie, jak załadować oprogramowanie do uruchomienia, ponieważ nie ma załadowanego żadnego oprogramowania. (I stąd boot z wyciągania się z pasków startowych ).

Historycznie istniało kilka różnych rozwiązań tego problemu, ale obecnie zaczynamy od kodu w ROM (najczęściej prawdopodobnie EEPROM), który wystarczy, aby spojrzeć na różne urządzenia i wypróbować je kolejno, aż znajdzie takie, które bootowalny.

(Dlatego wiele systemów uruchomi się z dysku CD lub DVD, jeśli włożysz dysk instalatora systemu operacyjnego z dysku twardego, inaczej BIOS [kod na ROM, w tym kod, o którym mówimy, i inne niskie -poziom, od którego zaczynają się rzeczy] ustawiono najpierw na napęd CD / DVD, a następnie na dysk twardy, jeśli niczego nie znajdzie, tweaker często ustawia go tak, aby ignorował napęd CD / DVD, chyba że zostanie o to ręcznie poproszony nie marnuje czasu na uruchamianie dysku, który nie został uruchomiony w napędzie).

Ten kod w pamięci ROM jest czasem nazywany programem ładującym .

Gdy wie, na jakim dysku należy spojrzeć, spojrzy na MBR, który zawiera informacje o podstawowych partycjach - jak możesz później spojrzeć na / lub / boot lub C: / (w systemie Windows), jeśli nawet nie wiesz, która część dysku była partycją, nie wspominając o tym, jak każda partycja została zamontowana? - i trochę kodu z dalszymi instrukcjami do wykonania. (Nawiasem mówiąc, wyjaśnia to, dlaczego niektóre systemy operacyjne - na przykład Windows - można zainstalować tylko na partycji podstawowej, szczegóły tych partycji znajdują się w MBR i to jedyne informacje o partycjach, które odczytał ich bootloader, i nie ładuje EBR do dowiedzieć się o partycjach logicznych, jeśli chodzi o te partycje nawet jeszcze nie istnieją).

Ten kod wykonywalny jest również nazywany programem ładującym . Kiedy chcemy rozróżnić to od tego, co nastąpi później, nazywa się to podstawowym programem ładującym (ponieważ chyba, że ​​tworzymy własny BIOS, ignorujemy bit ROM, ponieważ jest poza naszą kontrolą).

Ten kod będzie bardzo mały, ponieważ zmieści się w nim tylko około 400 bajtów, więc aby zrobić cokolwiek prawdziwego, załaduje trochę więcej kodu, który może być większy, ponieważ nie musi radzić sobie z tym ograniczeniem.

Ten kod jest również znany jako bootloader . Kiedy chcemy rozróżnić to od tego, co było wcześniej, nazywa się to drugim programem ładującym .

Ten kod może być prawdopodobnie ostatnim etapem tego procesu. Byłoby tak, jeśli masz tylko jeden system operacyjny lub jeśli wszystkie systemy w twoim systemie korzystają ze zgodnych programów ładujących (np. Dwie instalacje Linuksa, które używają GRUB, więc którykolwiek GRUB został zaktualizowany jako ostatni, może zaoferować uruchomienie dowolnego z nich) przedstawia menu (w razie potrzeby) obciążenia w jądrze i przekazuje kontrolę nad systemem operacyjnym.

W przypadku systemu operacyjnego, który nie jest zgodny z tym programem ładującym, może on zostać obciążony łańcuchem. Np. Jeśli masz Windows i Linux na tym samym komputerze, opcja GRUB do ładowania systemu Windows w rzeczywistości załaduje kolejny program ładujący, który wie tylko o instalacji systemu Windows, i przekaże go. Chociaż był to trzeci etap procesu, nadal jest nazywany dodatkowym programem ładującym , ponieważ ani nie wie, ani nie obchodzi go, że działał przed nim drugi program ładujący. Tak byłoby również w przypadku instalacji Linuksa, która korzystała z innego typu dodatkowego programu ładującego.

Przeważnie, gdy mówimy o bootloaderze w kontekście Linuksa, generalnie nie mamy na myśli kodu ROM (nie jest on częścią Linuksa ani nie został zmieniony przez instalację Linuksa). Kiedy to robimy update-grub, zmieniamy dodatkowy program ładujący, który zazwyczaj znajduje się w / boot konkretnej instalacji. Kiedy to robimy install-grub, zmieniamy go, a także główny program ładujący w MBR, aby miał wystarczającą ilość kodu, aby wiedzieć, gdzie jest / boot (być może uruchamianie programowej macierzy RAID w miarę upływu czasu) i ładuje i wykonuje to, gdy sam się uruchomi .

Podsumowując, pomyliłeś się, mówiąc, że ROM jest częścią pamięci głównej *, ponieważ jest osobny. (Rzeczywiście, pamięć RAM jest traktowana jako antonimiczna dla ROM). Miałeś rację zarówno mówiąc, że tam był bootloader, jak i w MBR, ponieważ są to dwa etapy procesu i oba są czasami wywoływane pod tą nazwą. I odpowiedź na pytanie „Czy różne systemy operacyjne przechowują swoje programy ładujące w różnych miejscach?” jest „głównie”, ponieważ jeśli niekompatybilne dodatkowe programy ładujące ukryją inne programy ładujące (jeśli instalujesz system Windows po zainstalowaniu Linuksa) lub zostaną załadowane do drugiego programu ładującego na żądanie (jeśli naprawisz tę sytuację lub zainstalujesz system Linux po systemie Windows), ale system operacyjny może współużytkować dodatkowy program ładujący, jeśli są one kompatybilne (jeśli instalujesz Linuksa po innym systemie Linux, który używa tego samego typu dodatkowego programu ładującego, i widzi inny system Linux [czasami oprogramowanie RAID dezorientuje i powoduje konieczność ładowania łańcucha).

* W dniach, w których można programowo korzystać zarówno z pamięci ROM, jak i pamięci RAM, było inaczej. Na przykład na ZX Spectrum ROM miałby 16 kB i zawierałby interpreter języka BASIC, a także dawałby punkt wyjścia do załadowania czegoś do 48 kB lub 128 kiB (stronicowany) lub pamięci RAM (w takim przypadku zasadniczo uruchamia się ten interpreter BASIC, a następnie użycie go do rozruchu na taśmie), z interpretera BASIC można było korzystać z wielu funkcji, z których mogłyby korzystać programy w pamięci RAM (po co pisać funkcję trygonometryczną, skoro komputer ma już taką pozycję w znanej pozycji ? szczególnie, gdy masz tylko 48 kB na uruchomienie całego kodu). Ta pamięć ROM była również widoczna w taki sam sposób jak pamięć RAM, tylko pod różnymi adresami. W takim przypadku pamięć ROM była tak samo częścią pamięci głównej, jak pamięć RAM, ale nie była zapisywalna.


0

Zrób minimalny działający przykład i uruchom go na emulatorze, aby zrozumieć te pojęcia:

printf '\364%509s\125\252' > main.img
qemu-system-x86_64 -hda main.img

Jest to bardzo prosty „bootloader”, który wykonuje pojedynczą hltinstrukcję. Więcej informacji na: https://stackoverflow.com/a/32483545/895245

Następnie możesz uruchomić go na prawdziwym sprzęcie za pomocą:

sudo dd if=main.img of=/dev/sdX

i podłączanie USB do komputera i uruchamianie z niego.

Gdy to zrobisz, staje się jasne, że bootloader to coś, co żyje na stałym dysku pamięci, takim jak USB lub dyski twarde.

To, co żyje w pamięci ROM, to kod, który uruchamia dla nas bootloader, nazywany oprogramowaniem układowym (lub mniej precyzyjnie BIOS).


0

W dawnych czasach program rozruchowy znajdował się na dziurkowanej taśmie papierowej podobnej do tej używanej przez maszyny telegraficzne lub nośniki z dziurkowanymi kartami („nie widzę już ich obu). proces ten nazywał się IPL, skrót od Initial Program Load. Czasami, jeśli nie jest dostępna taśma papierowa lub czytnik kart, trzeba wprowadzić binarny kod IPL bezpośrednio do procesora za pomocą konsoli na panelu przednim. uff!

Obecnie kod IPL znajduje się w pROM-ach, które po uruchomieniu ładują i wykonują dowolne dodatkowe programy ładujące dostosowane do ładowania (uruchamiania) pożądanego systemu operacyjnego. dodatkowy moduł ładujący może znajdować się na dowolnym nośniku w dowolnej części konfiguracji znanej lub adresowalnej przez kod IPL.


-1

Program ładujący zwykle znajduje się w pierwszym sektorze dysku twardego, zwykle nazywanym głównym rekordem rozruchowym.

Twoje zdrowie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.