Ile adresów pamięci możemy uzyskać za pomocą 32-bitowego procesora i RAM 1GB?

12

Ile adresów pamięci możemy uzyskać za pomocą procesora 32-bitowego i RAM 1 GB, a ile za pomocą procesora 64-bitowego?

Myślę, że to coś takiego:

1 GB pamięci RAM podzielonej przez 32 bity lub podzielonej przez 4? uzyskać liczbę adresów pamięci?

Ale nie jestem pewien. Właśnie dlatego pytam.

Na Wikipedii zaznaczam, że 1 adres pamięci ma szerokość 32 bity lub 4 oktety (1 oktet = 8 bitów), w porównaniu do 64-bitowego procesora, w którym 1 adres pamięci lub 1 liczba całkowita ma szerokość 64 bitów lub 8 oktetów. Ale nie wiem, czy dobrze to zrozumiałem.

John Smohan
źródło
Praktycznie wszystkie nowoczesne systemy są adresowane bajtowo, co oznacza, że ​​32 bity mogą adresować około 4 gigabajtów (jeśli zainstalowano tyle pamięci RAM). Historycznie istniały schematy adresowane słowem, przy czym „słowo” wynosi 12, 15, 16, 17, 24, 32, 36 lub 48 bitów i prawdopodobnie niektóre inne, a także maszyny dziesiętne, które adresowały 4 lub 6 bitów jednostka. Należy jednak pamiętać, że większość nowoczesnych systemów wykorzystuje pamięć wirtualną, co oznacza, że ​​procesor może zająć nawet więcej pamięci niż to, co jest zainstalowane.
Daniel R Hicks
@DanielRHicks Pamięć wirtualna nie wpływa na ilość pamięci RAM, którą można zaadresować.
Jamie Hanrahan,
@JamieHanrahan - Aby pamięć wirtualna działała, musi istnieć mechanizm adresowania obejmujący zakres adresów wirtualnych (jednego procesu). Można tego dokonać za pomocą symulacji programowej, ale jest to dość nieefektywne, więc w większości systemów zasięg adresowania procesora jest wystarczająco duży, aby uwzględnić maksymalną przestrzeń adresową procesu.
Daniel R Hicks
@DanielRHicks Pewnie, ale to nie wpływa na ilość pamięci RAM, którą można rozwiązać. RAM to pamięć fizyczna, a nie wirtualna. Adresy wirtualne nie są adresami RAM, a pamięć wirtualna nie jest RAM.
Jamie Hanrahan,
@JamieHanrahan - Nie masz żadnego sensu. Jeśli nie można adresować stron pamięci RAM w wirtualnej przestrzeni adresowej, pamięć RAM jest bezużyteczna. (Wiem bardzo dobrze, jak działa pamięć wirtualna, pracując nad projektami pamięci wirtualnej od 1972 r.)
Daniel R Hicks

Odpowiedzi:

38

Krótka odpowiedź: liczba dostępnych adresów jest mniejsza od tych:

  • Rozmiar pamięci w bajtach
  • Największa liczba całkowita bez znaku, którą można zapisać w słowie maszyny CPU

Długa odpowiedź i wyjaśnienie powyższego:

Pamięć składa się z bajtów (B). Każdy bajt składa się z 8 bitów (b).

1 B = 8 b

1 GB pamięci RAM to w rzeczywistości 1 GiB (gibibajt, nie gigabajt). Różnica polega na:

1 GB  = 10^9 B = 1 000 000 000 B
1 GiB = 2^30 B = 1 073 741 824 B

Każdy bajt pamięci ma swój adres, bez względu na to, jak duże jest słowo maszyny CPU. Na przykład. Procesor Intel 8086 był 16-bitowy i adresował pamięć bajtami, podobnie jak nowoczesne 32-bitowe i 64-bitowe procesory. To jest przyczyną pierwszego limitu - nie możesz mieć więcej adresów niż bajtów pamięci.

Adres pamięci to tylko liczba bajtów, które procesor musi pominąć od początku pamięci, aby dostać się do tego, którego szuka.

  • Aby uzyskać dostęp do pierwszego bajtu, musi pominąć 0 bajtów, więc adres pierwszego bajtu to 0.
  • Aby uzyskać dostęp do drugiego bajtu, musi pominąć 1 bajt, więc jego adres to 1.
  • (i tak dalej...)
  • Aby uzyskać dostęp do ostatniego bajtu, procesor pomija 1073741823 bajtów, więc jego adres to 1073741823.

Teraz musisz wiedzieć, co właściwie oznacza wersja 32-bitowa. Jak wspomniałem wcześniej, jest to wielkość słowa maszynowego.

Słowo maszynowe to ilość pamięci używanej przez procesor do przechowywania liczb (w pamięci RAM, pamięci podręcznej lub rejestrach wewnętrznych). 32-bitowy procesor wykorzystuje 32 bity (4 bajty) do przechowywania liczb. Adresy pamięci również są liczbami, więc na 32-bitowym procesorze adres pamięci składa się z 32 bitów.

Pomyśl o tym: jeśli masz jeden bit, możesz zapisać na nim dwie wartości: 0 lub 1. Dodaj jeszcze jeden bit i masz cztery wartości: 0, 1, 2, 3. Na trzech bitach możesz zapisać osiem wartości : 0, 1, 2 ... 6, 7. To jest w rzeczywistości system binarny i działa w ten sposób:

Decimal Binary
0       0000
1       0001
2       0010
3       0011
4       0100
5       0101
6       0110
7       0111
8       1000
9       1001
10      1010
11      1011
12      1100
13      1101
14      1110
15      1111

Działa dokładnie tak jak zwykłe dodawanie, ale maksymalna cyfra to 1, a nie 9. Liczba dziesiętna to 0 0000, następnie dodajesz 1 i dostajesz 0001, dodajesz jeszcze raz i masz 0010. To, co się tutaj dzieje, jest po przecinku 09i dodaniu jednego: zmieniasz 9 na 0 i zwiększasz kolejną cyfrę.

Z powyższego przykładu widać, że zawsze istnieje maksymalna wartość, którą można zachować w liczbie ze stałą liczbą bitów - ponieważ gdy wszystkie bity mają wartość 1, a Ty próbujesz zwiększyć wartość o 1, wszystkie bity staną się równe 0, co spowoduje przerwanie numer. Nazywa się to przepełnieniem liczb całkowitych i powoduje wiele nieprzyjemnych problemów, zarówno dla użytkowników, jak i programistów.

   11111111    = 255
+         1
-----------
  100000000    = 0   (9 bits here, so 1 is trimmed)
  • Dla 1 bitu największą wartością jest 1,
  • 2 bity - 3,
  • 3 bity - 7,
  • 4 bity - 15

Największa możliwa liczba to zawsze 2 ^ N-1, gdzie N jest liczbą bitów. Jak powiedziałem wcześniej, adres pamięci jest liczbą i ma również wartość maksymalną. Dlatego rozmiar słowa maszynowego jest również ograniczeniem liczby dostępnych adresów pamięci - czasami twój procesor po prostu nie może przetworzyć liczb wystarczająco dużych, aby zająć więcej pamięci.

Na 32 bitach możesz przechowywać liczby od 0 do 2 ^ 32-1, a to 4 294 967 295. To więcej niż największy adres w 1 GB pamięci RAM, więc w twoim przypadku ilość pamięci RAM będzie czynnikiem ograniczającym.

Limit pamięci RAM dla 32-bitowego procesora wynosi teoretycznie 4 GB (2 ^ 32), a dla 64-bitowego procesora - 16 EB (eksabajtów, 1 EB = 2 ^ 30 GB). Innymi słowy, 64-bitowy procesor mógłby adresować cały Internet ... 200 razy;) (oszacowany przez WolframAlpha ).

Jednak w rzeczywistych systemach operacyjnych 32-bitowe procesory mogą obsługiwać około 3 GiB pamięci RAM. Wynika to z wewnętrznej architektury systemu operacyjnego - niektóre adresy są zarezerwowane do innych celów. Możesz przeczytać więcej o tak zwanej barierze 3 GB na Wikipedii . Możesz podnieść ten limit za pomocą rozszerzenia adresu fizycznego .


Mówiąc o adresowaniu pamięci, jest kilka rzeczy, o których powinienem wspomnieć: pamięć wirtualna , segmentacja i stronicowanie .

Pamięć wirtualna

Jak zauważył @Daniel R. Hicks w innej odpowiedzi, systemy operacyjne używają pamięci wirtualnej. Oznacza to, że aplikacje faktycznie nie działają na prawdziwych adresach pamięci, ale na tych dostarczonych przez system operacyjny.

Ta technika pozwala systemowi operacyjnemu przenieść niektóre dane z pamięci RAM do tak zwanego pliku stronicowania (Windows) lub zamiany (* NIX). Dysk twardy jest o kilka wielkości wolniejszy niż pamięć RAM, ale nie stanowi poważnego problemu w przypadku rzadko uzyskiwanych danych i umożliwia systemowi operacyjnemu dostarczenie aplikacji więcej pamięci RAM niż faktycznie zainstalowano.

Stronicowanie

To, o czym mówiliśmy do tej pory, nazywa się schematem adresowania płaskiego.

Stronicowanie jest alternatywnym schematem adresowania, który pozwala zaadresować więcej pamięci niż zwykle przy użyciu jednego słowa maszynowego w modelu płaskim.

Wyobraź sobie książkę wypełnioną 4-literowymi słowami. Powiedzmy, że na każdej stronie jest 1024 liczb. Aby zaadresować numer, musisz znać dwie rzeczy:

  • Liczba stron, na których to słowo jest drukowane.
  • Które słowo na tej stronie jest tym, którego szukasz.

Właśnie tak nowoczesne procesory x86 obsługują pamięć. Podzielony jest na 4 strony KiB (po 1024 słowa maszynowe), które mają numery. (w rzeczywistości strony mogą być również 4 MiB duże lub 2 MiB z PAE ). Aby zaadresować komórkę pamięci, potrzebujesz numeru strony i adresu na tej stronie. Zauważ, że do każdej komórki pamięci odwołuje się dokładnie jedna para liczb, co nie będzie miało miejsca w przypadku segmentacji.

Segmentacja

Ten jest bardzo podobny do stronicowania. Został użyty w Intel 8086, żeby wymienić tylko jeden przykład. Grupy adresów są teraz nazywane segmentami pamięci, a nie stronami. Różnica polega na tym, że segmenty mogą się nakładać i bardzo często się pokrywają. Na przykład w 8086 większość komórek pamięci była dostępna z 4096 różnych segmentów.


Przykład:

Powiedzmy, że mamy 8 bajtów pamięci, wszystkie z zerami, z wyjątkiem 4 bajtu, który jest równy 255.

Ilustracja modelu płaskiej pamięci:

 _____
|  0  |
|  0  |
|  0  |
| 255 |
|  0  |
|  0  |
|  0  |
|  0  |
 -----

Ilustracja pamięci stronicowanej z 4-bajtowymi stronami:

 PAGE0
 _____
|  0  |
|  0  |
|  0  |  PAGE1
| 255 |  _____
 -----  |  0  |
        |  0  |
        |  0  |
        |  0  |
         -----

Ilustracja podzielonej pamięci z 4-bajtowymi segmentami przesuniętymi o 1:

 SEG 0
 _____   SEG 1
|  0  |  _____   SEG 2
|  0  | |  0  |  _____   SEG 3
|  0  | |  0  | |  0  |  _____   SEG 4
| 255 | | 255 | | 255 | | 255 |  _____   SEG 5
 -----  |  0  | |  0  | |  0  | |  0  |  _____   SEG 6
         -----  |  0  | |  0  | |  0  | |  0  |  _____   SEG 7
                 -----  |  0  | |  0  | |  0  | |  0  |  _____
                         -----  |  0  | |  0  | |  0  | |  0  |
                                 -----   -----   -----   -----

Jak widać, czwarty bajt można adresować na cztery sposoby: (adresowanie od 0)

  • Segment 0, przesunięcie 3
  • Segment 1, przesunięcie 2
  • Segment 2, przesunięcie 1
  • Segment 3, przesunięcie 0

To zawsze ta sama komórka pamięci.

W rzeczywistych implementacjach segmenty są przesuwane o więcej niż 1 bajt (dla 8086 było to 16 bajtów).

Co jest złe w segmentacji jest to, że jest skomplikowane (ale myślę, że już to wiesz;) Co dobre, to że możesz użyć sprytnych technik do tworzenia programów modułowych.

Na przykład możesz załadować jakiś moduł do segmentu, a następnie udawać, że segment jest mniejszy niż jest w rzeczywistości (wystarczy na tyle, aby pomieścić moduł), a następnie wybierz pierwszy segment, który nie zachodzi na ten pseudo-mniejszy i załaduj następny moduł , i tak dalej. Zasadniczo otrzymujesz w ten sposób strony o zmiennej wielkości.

gronostaj
źródło
1
System operacyjny może nadać procesowi użytkownika pełną wirtualną przestrzeń adresową 4GiB (prawdopodobnie minus jedna strona - 4KiB dla x86), ale powoduje, że wywołania systemowe są droższe, ponieważ przestrzeń adresowa musi zostać zmieniona. Dzięki PAE i podobnym mechanizmom ilość pamięci fizycznej adresowalnej przez system można zwiększyć, chociaż adresy są nadal ograniczone do 32 bitów.
Paul A. Clayton
Nie tego szukałem, ale i tak to dobra informacja! Dziękujemy za dobre wyjaśnienie maks. cyfra (1 = maks. jak w binarnym 9 to maks.) dla porównania tabeli binarnej i dziesiętnej. Naprawdę dobry sposób myślenia o tym. Nauczyłem się czegoś nowego. :) Dzięki!
John Smohan
To Gibi i Giga są tak mylące ... Ponieważ na niektórych stronach czytam, że pamięć jest mierzona w Gibi, a na innych w Giga ... Czy masz jakieś dobre / niezawodne źródło?
John Smohan
Wikipedia ma artykuł na temat prefiksów binarnych, w tym historycznych. Większość liczb związanych ze sprzętem używa dziesiętnych prefiksów, najbardziej znaczącymi wyjątkami są prawdopodobnie pamięć RAM i być może skala kolorów - np. Wyświetlacze LCD z 16 milionami kolorów mają trzy 8-bitowe kanały kolorów (2 ^ 24). Bezpośrednia odpowiedź na pytanie: w tym przypadku liczba dostępnych adresów jest równa liczbie bajtów pamięci, ponieważ pamięć RAM jest adresowana na podstawie bajtów. 32-bitowy procesor może obsłużyć do 2 ^ 32 B, 64-bitowy - 2 ^ 64.
gronostaj
Dzięki! Potrzebuję tego do egzaminów szkolnych. :) Myślę, że teraz rozumiem najwięcej rzeczy. Jedyne, co wciąż mnie niepokoi, to dlaczego 2 ^ 32 B, jeśli jest to procesor 32-bitowy, a nie 32-bajtowy?
John Smohan
3

Oprócz powyższego należy pamiętać, że używane jest adresowanie wirtualne wraz z wieloma przestrzeniami adresowymi . Tak więc, nawet jeśli masz tylko 1 GB pamięci RAM, program może koncepcyjnie wykorzystać do 4 GB pamięci wirtualnej (chociaż większość systemów operacyjnych ogranicza ją do mniejszej liczby). I możesz koncepcyjnie mieć (prawie) nieskończoną liczbę takich przestrzeni adresowej 4 GB.

Rozmiar pamięci RAM nie ogranicza (tak bardzo) maksymalnego rozmiaru programu ani liczby programów, które można uruchomić, ale ogranicza wydajność. Kiedy rzeczywista pamięć staje się „nadmiernie zaangażowana”, a system zaczyna „drżeć”, gdy „zamienia” „strony” tam iz powrotem między RAM a dyskiem, wydajność spada.

Daniel R. Hicks
źródło
2

1 GB pamięci RAM zajmowałby 1024 * 1024 * 1024 bajtów lub 1 073,741,824 bajtów.

Procesor 32-bitowy zawsze ma 4 * 1024 * 1024 * 1024 bajtów lub 4 294 967 296 bajtów przestrzeni adresowej 1 GB pamięci RAM pojawia się w tej przestrzeni. W procesorach Intel część pamięci RAM musi pojawić się pod adresem 0 dla wektorów przerwań, więc fizyczna pamięć RAM zaczyna się pod adresem 0 i idzie w górę.

Inne rzeczy pojawiają się w tej przestrzeni adresowej, takie jak BIOS i opcjonalne ROM-y (w górnych 384 kilobajtach w ciągu pierwszego 1 MB), urządzenia I / O (takie jak APIC) i RAM wideo. Dziwne rzeczy dzieją się także w trybie zarządzania systemem „SMRAM”, którego jeszcze nie rozumiem.

Zauważ, że jest to fizyczna przestrzeń adresowa z punktu widzenia jądra. MMU może zmienić to wszystko w dowolny sposób na proces przestrzeni użytkownika.

LawrenceC
źródło
Na Wikipedii zaznaczam, że 1 adres pamięci ma szerokość 32 bity lub 4 oktety (1 oktet = 8 bitów), w porównaniu do 64-bitowego procesora, w którym 1 adres pamięci lub 1 liczba całkowita ma szerokość 64 bitów lub 8 oktetów. Masz rację co do przestrzeni adresowej 4 * 1024 * 1024 * 1024 bajtów, ale szukałem przestrzeni adresowej pamięci, która moim zdaniem wynosi 1 GB / 32 bity, ale nadal nie wiem, czy mam rację, czy nie. :) Dziękuję za Twoją odpowiedź!
John Smohan
Np. Procesory Intel mają dwie przestrzenie adresowe: „Memory” i „I / O”. Rzeczy inne niż RAM pojawiają się w przestrzeni „Memory”. Inne rzeczy, takie jak urządzenia we / wy lub pamięć ROM, mogą znajdować się w miejscach niezajętych przez pamięć RAM. Zasadniczo w przestrzeni adresowej we / wy pojawiają się tylko urządzenia we / wy.
LawrenceC,
@johansmohan Ani twoje liczby, ani odpowiedź Lawrence'a są poprawne. Nie ma ustalonego związku między „szerokością bitów” procesora a szerokością adresów RAM, których może używać. Procesory x86 tylko do wersji 32-bitowej mogą adresować 64 GB pamięci RAM. Procesory x64 rozpoczęły się w 40-bitowej fizycznej przestrzeni adresowej i mają teraz 52 bity. Jeśli chodzi o wirtualną przestrzeń adresową, to też może być inna. Na x64, mimo że adresy wirtualne zajmują 64 bity, zaimplementowano tylko 48 bitów, dla VAS 256 TiB zamiast 16 EiB, którego można oczekiwać od 64 bitów.
Jamie Hanrahan
0

Procesor 32-bitowy może adresować maksymalnie 2 ^ 32 pojedyncze bajty pamięci (około 4 GB), ale posiadanie 1 GB pamięci sprawiłoby, że 1 * 1024 * 1024 * 1024 bajtów adresowalnych (choć prawdopodobnie nadal miałbyś wirtualną przestrzeń adresową 2 ^ 32 ). 64-bitowy procesor mógłby adresować 2 ^ 64 pojedynczych bajtów, ale myślę, że większość systemów używa tylko 48 bitów na adresy pamięci, co stanowi górną granicę. bajty adresowalne 2 ^ 48.

Kwas
źródło
Miałeś na myśli 1024 * 1024 * 1024, a nie 1 * 1024 * 1024 prawda?
John Smohan
Procesor 32-bitowy może adresować maksymalnie 2 ^ 32 oktetów lub bitów? Tylko sprawdzam, bo muszę to wiedzieć na pewno.
John Smohan
@johan smohan Prawidłowo, powinno być 1 * 1024 * 1024 * 1024
AcId
@ johan smohan 32-bitowy procesor może adresować maksymalnie 2 ^ 32 bajty, przy czym jeden bajt to 8 bitów (jeden
okt
0

Przyjęta odpowiedź stanowi dobre wyjaśnienie. Ale nie sądzę, że to jest odpowiedź. Nie zawiera niczego na temat magistrali adresowej . A jego rozmiar jest tak naprawdę głównym powodem ograniczeń pamięci. Na przykład 8080 jest 8-bitowym procesorem (rozmiar jego szyny danych wynosi 8 bitów), ale ma 16-bitową szynę adresową. Może adresować 2 ^ 16 = (2 ^ 6) * (2 ^ 10) = 64 * 1024 bajtów = 64 KB.

Więcej informacji znajdziesz tutaj (wersja 32-bitowa) w sekcji „Historia techniczna”.

Dmitriy Dokshin
źródło
Zgadzam się. Zauważ, że późniejsze modele 16-bitowego PDP-11 miały 22-bitową magistralę adresową (a więc mogły adresować 4 MB pamięci RAM), HP 1000MX, również „16-bitowy”, ostatecznie osiągnął 16 MB pamięci RAM (24 -bitowe adresy); VAX był 32-bitowym procesorem, ale miał 30-bitową fizyczną przestrzeń adresową, ale połowa była zarezerwowana na przestrzeń we / wy, dla limitu pamięci RAM wynoszącego 512 MB; „16-bitowy” 8086, 1 MB; „16-bitowy” 80286, 16 MB; itd. A kiedy PAE został wprowadzony wraz z Pentium Pro, 32-bitowy procesor x86 mógł adresować do 64 GB RAM (24-bitowa fizyczna przestrzeń adresowa, chociaż trzy bity niskiego rzędu nigdy tak naprawdę nie wychodzą z procesora).
Jamie Hanrahan,
-2

Wierzę, że w tej rozmowie zagubiono najbardziej podstawowe informacje, więc oto moja odpowiedź:

Powiedzenie „To jest procesor 32-bitowy” oznacza, że ​​rozmiar instrukcji lub rozmiar polecenia, który procesor może zrozumieć i pracować jednocześnie, to 32 bity. Podobnie w przypadku procesorów 64-bitowych: mogą obsługiwać instrukcje maksymalnie 64-bitowe.

Pomyśl o tym jak o starym mechanicznym kalkulatorze: masz tylko tyle cyfr, więc po prostu nie możesz wprowadzić żadnej liczby.

Teraz adres, którego może używać procesor, również musi mieścić się w tej samej przestrzeni, więc w przypadku procesora 32-bitowego adres, którego używa, może również mieć maksymalnie 32 bity. Stąd możemy po prostu obliczyć maksymalną liczbę adresów (tj. Maksymalną ilość pamięci RAM używaną przez procesor):

2 ^ 32 = 4294967296 (= 4 GB)

lub

2 ^ 64 = 18446744073709551616 (= znacznie więcej;)

Lub, jako zabawny przykład, mój stary Commodore 64 miał 16-bitowy procesor, więc był w stanie zarządzać pamięcią:

2 ^ 16 = 65536 bajtów (= 64 KB)

Jest to podstawowa logika, ale, jak wspomniano wcześniej, istnieją sposoby obejścia tego ograniczenia, takie jak wirtualne przestrzenie adresowe, mapowanie pamięci itp.

Tuncay Göncüoğlu
źródło
2
Istotną różnicą między procesorami 32- i 64-bitowymi jest zakres adresów (który wpływa bardziej na wirtualną przestrzeń adresową niż na „rzeczywistą”). Procesory używają tak wielu sztuczek, że w wielu przypadkach trudno jest powiedzieć, jaka jest rzeczywista szerokość ścieżki danych. Długość instrukcji jest w dużej mierze niezwiązana z „szerokością” procesora.
Daniel R Hicks,
Wyjaśnienie jest całkowicie poprawne. Zakładając, że nie masz na myśli rzeczywistego wymiaru układu w centymetrach, mówiąc „szerokość procesora”, w którym to przypadku miałbyś rację mówiąc, że jest on niepowiązany, mylisz techniki mapowania pamięci / wirtualne przestrzenie adresowe z fizycznym adresowaniem pamięci. Co więcej, to, co mówisz, jest bardziej związane z implementacjami jądra, możesz chcieć sprawdzić jądra linuksa PAE.
Tuncay Göncüoğlu
2
Długość instrukcji nie ma żadnego związku z „szerokością” procesora w nowoczesnych systemach. Najbardziej odpowiednie wartości to szerokość rejestrów (choć może to być zwodnicza), szerokość ścieżki transferu między procesorem a pamięcią oraz rozmiar w bitach adresu pamięci. Ale te 3 wartości mogą bardzo łatwo się od siebie różnić.
Daniel R Hicks
1
@DanielRHicks Daniel Hicks ma rację. „Szerokość bitowa” procesora niekoniecznie ma związek z „rozmiarem instrukcji lub rozmiarem polecenia”. Istnieją procesory zbudowane w ten sposób, ale nie ma wśród nich dzisiejszych procesorów towarowych (x86 / x64).
Jamie Hanrahan,