Obliczenia adresów w C i nie tylko

Aktualnie znajduję się na przykład w 0x000000 i chce zostawić sobie miejsce w pamieci, tak na później.

 

Zostawiam 1Gb i robie to tak?

1Gb to 1024Mb

1024Mb to 1048576Kb

1048576Kb to 1,07374 * 10^9b (bajtów)

 

Teraz zamieniam na bity:

1,07374 * 10^9b to 8,58993 * 10^9B (bitów)

 

to wskaźnik poza taki segment to ma adres:

8589930000 (bitów) na hex to 1FFFFEE10

 

więc mój segment pamieci zajmuje:

+-------------------------+
|          0x000000       |
|              .          |
|              .          |
|              .        |
|     0x1FFFFEE10   |
+-------------------------+

to wskaznik wskazuje na 0x1FFFFEE10 po odstawieniu 1Gb miejsca w pamieci na później ???

 

Dobrze to obliczam?

Programujesz na x86? Tutaj słowem są bajty, a nie bity. Pisząc słowo nie mam na myśli typu WORD w wielu assemblerach.

Nie, programuje na amd64, szczerze moge przerzucić się na x86 ponieważ 32bitowe rzeczy działają na 64bitowych, wiec nie ma problemów.

Tworze prymitywny systemik wg kursu “From zero to hero” by się czegoś nowego nauczyć, i potrzebuje utworzyć 4 segmenty i adresy musze wyliczyć :-/

 

Dobrze wyliczam koniec koniec segmentu??

Bajt dalej jest najmniejszą jednostką do której możesz się odwołać, w procesorach x86 (x86 i x86_64) możesz wskazać tylko na bajty, do konkretnego bitu na około, ale Ciebie nie powinno to obchodzić, jeżeli skaczesz z miejsca o adresie 0 o gigabajt dalej to twoim celem jest 10737441824. bajt, sprawdź sobie ile to w hexie i skacz :slight_smile:

 

Skąd Ci wyszło 10737441824 ??

 

 

1,07374 * 10^9 Bajtów = 1073740000 (dec) = 3FFFF8E0 (hex)

wiec skacze o 1Gb to wskaznik na koniec bloku(1gb) to 0x3FFFF8E0

 

???

1GB to 2^30 czyli 0x40000000, to koniec bloku 0x3FFFFFF

  1. Może ktos mi to krok po kroku wytłumaczyć? jak się oblicza te adresy.

 

  1. Co się konkretnie deklaruje (adresy) w GDT? Jak tam ta pamieć się adresuje te limity i bazy, … ?

Może ktoś mi wytłumaczyć obliczanie tych adresów?

I jakie adresy się konkretnie deklarowane w GDT (global descriptor table) i co to są za adres w gdt (co pokazuję, dokąd się odnoszą) ?

O ile dobrze pamiętam, to w strukturach dla procesora segmenty deklaruje się w jednym z dwóch trybów:

  • Ilość bajtów (Możesz wtedy chyba zadeklarować do 64kB lub 1MB - nie chce mi się przeliczać)

  • Jakaś większa jednostka, chyba po 4kB(wtedy chyba możesz określić rozmiar do 4GB)

W procesorach 64 bitowych (patrz myślnik 2) musi być więc jakieś rozszerzenie, pozwalające na deklarację powyżej 4GB.

 

Mam taką sytuacje:

 

http://wiki.osdev.org/GDT_Tutorial

http://lukaszsowa.pl/wp-content/uploads/2010/10/segmentacja.png

I jako baze definiujemy adres wewnetrzny segmentu a limit jego długość np. ja chce 1gb to 2^30 w hexie?