Hlavní navigace

Názor k článku Pro více než 4 GB RAM nepotřebujete 64 bitů - je tu PAE od BLEK. - To by pak už nešlo programovat v C....

  • Článek je starý, nové názory již nelze přidávat.
  • 24. 3. 2009 22:50

    BLEK. (neregistrovaný)
    To by pak už nešlo programovat v C. V C může tentýž pointer ukazovat na read-only data, na read-write data, na zásobník nebo na haldu (nebo i na funkci ... ale ten nemůžeš dereferencovat, pouze volat). A když bys ten pointer dereferencoval, tak bys musel rozhodnout, kam ten pointer patří a podle toho použít segmentový registr.

    Buď bys to testoval automaticky ve vygenerovaném kódu --- to by ti zpomalovalo každé hrábnutí do paměti přes pointer.

    Nebo bys musel programátora nutit, aby ke každému pointeru určoval, do jakého segmentu patří --- a pak by ti na tom obyčejné C programy nechodily.

    Třeba by to šlo programovat ve starém Fortranu (nemá pointery vůbec) nebo v původním Wirthově Pascalu (má pointery, ale nejde tam pointerem ukazovat na jiné proměnné nebo pole, pouze na haldu; ukazování pointerem na proměnné tam přidal snad až Borland v jejich Turbo Pascalu).

    Třeba OS/2 v kernel módu má odlišnou bázi SS a DS segmentu. Má to blbý důsledek, nejde tam napsat něco jako void f() { int X; int *P = &X; ... } --- protože do P se uloží adresa vůči SS segmentu, ale v momentě, kdy se to dereferencuje, tak se použije segment DS --- takže v momentě, kdy se odkaz na zásobník v kódu vyskytne, musí se ten kód ručně upravovat a musí se k tomu uměle přičítat rozdíl DS a SS bází.

    Čtyřmi segmentovými registry DS,ES,FS,GS vlastně stejně současně nenaadresuješ 16GB. Každý z nich má totiž pouze 32-bitovou bázi a délku. Jediná možnost, jak byses přes těch 4GB dostal, by bylo, že bys opravdu musel při každém přístupu do paměti nahrát segmentový register a při výpadku segmentu jiný segment odmapovat, abys pro nový segment udělal místo v tom 4G rozsahu.