İlk olarak, bunun RAM ile ilgisi yok, gerçekten. Burada adres alanından bahsediyoruz - yalnızca 16 MiB belleğiniz olsa bile, 32 bitlik bir CPU'da hala 32 bit adres alanına sahipsin.
Bu zaten ilk sorunuzu yanıtlıyor, gerçekten - bu tasarlandığında, gerçek dünya bilgisayarlarının tam 4 GiB belleğe yakın hiçbir yeri yoktu; daha çok 1-16 MiB bellek aralığındaydı. Adres alanı, tüm amaç ve amaçlar için serbest kaldı.
Şimdi, neden tam olarak 0xFFFFFFF0? CPU ne kadar BIOS olduğunu bilmiyor. Bazı BIOS'lar yalnızca birkaç kilobayt sürebilirken, diğerleri tam megabayt bellek alabilir - ve isteğe bağlı olarak çeşitli RAM'lere bile giremiyorum. İşlemcinin başlayabilmesi için bir adrese bağlanmış olması gerekir - işlemciyi yapılandıracak bir yer yoktur. Ancak bu yalnızca adres alanının eşleşmesidir - adres doğrudan BIOS ROM yongasına eşlenir (evet, bu sayede 4 GiB RAM'in tamamına erişemezsiniz.) bu özel bir şey değil, birçok cihaz adres alanında kendi aralığını gerektiriyor). 32-bit bir işlemcide, bu adres size çok temel başlatma işlemini yapmak için tam 16 bayt verir - bu da segmentlerinizi ve gerekirse adres modunu ayarlamak için yeterlidir (unutmayın,Gerçek önyükleme "yordam". Bu noktada, hiç RAM kullanmazsınız - hepsi sadece eşlenmiş ROM'dur. Aslında, RAM bu noktada kullanıma hazır bile değil - bu BIOS POST'un işlerinden biri! Şimdi, düşünüyor olabilirsiniz - 16 bitlik bir gerçek mod 0xFFFFFFF0 adresine nasıl erişir? Elbette, segmentler var, yani 20 bitlik adres alanınız var, ama bu hala yeterince iyi değil. Eh, bir hile var - adresin 12 yüksek biti ilk uzun atlayışınızı gerçekleştirene kadar ayarlanır, yüksek adres alanına erişmenize izin verir (0xFFF00000'den daha düşük herhangi bir şeye erişimi reddederken - uzun bir atlayış yapana kadar) .
Bütün bunlar, modern işletim sistemlerinde çoğunlukla programcılardan (kullanıcılardan bahsetmiyorum bile) gizlenen şeylerdir. Genelde bu kadar düşük seviyeli hiçbir şeye erişiminiz yoktur - bazı şeyler zaten kurtarılmayacak kadar yüksektir (CPU modlarını değiştiremezsiniz), bazıları sadece işletim sistemi çekirdeği tarafından yönetilir.
Bu yüzden daha eski bir görünüm MS DOS üzerindeki eski okul kodlamasından geliyor. Doğrudan adres alanına eşlenen cihaz belleğinin başka bir tipik örneği video belleğine doğrudan erişimdir. Örneğin, ekrana hızlı bir şekilde metin yazmak istiyorsanız, doğrudan adrese B800:0000
yazdınız (artı ofset - 80x25 metin modunda, bu, (y * 80 + x) * 2
hafızamın bana doğru hizmet etmesi durumunda - her karakter için iki bayt, satır satır). Piksel piksel çizmek istiyorsanız, bir grafik modu ve başlangıç adresini A000:0000
(tipik olarak piksel başına 8 bit olarak 320x200) kullandınız. Yüksek performanslı herhangi bir şey yapmak, doğrudan nasıl erişileceğini bulmak için genellikle cihaz kılavuzlarına dalmak anlamına gelir.
Bu, bu güne kadar hayatta kalır - sadece gizlidir. Windows'ta, Aygıt yöneticisindeki aygıtlarla eşlenen bellek adreslerini görebilirsiniz - yalnızca ağ kartınız gibi bir şeyin özelliklerini açın, Kaynaklar sekmesine gidin - tüm Bellek Aralığı öğeleri aygıt belleğinden ana adres alanınıza eşleme yapar. Ve 32-bit'de, bu cihazların çoğunun, kullanıcının kullanabileceği hafıza ile olan çatışmaları en aza indirgemek için 2 GiB (daha sonra 3 GiB) işaretinin üzerinde eşlendiğini göreceksiniz, ancak bu gerçekten sanal hafıza ile ilgili bir sorun değil ( uygulamalar gerçek, donanım adres alanının yakınında hiçbir yere ulaşamazlar - örneğin RAM, ROM, aygıtlar veya sayfa dosyasına eşlenebilecek kendi sanallaştırılmış bellek yığınlarına sahiptirler).
Yığın gelince, varsayılan olarak, yığının üstten büyüdüğünü anlamak için yardımcı olmalıdır. Yani, eğer yaparsanız push
, yeni yığın işaretçisi olacaktır 0xFFFFFEC
- başka bir deyişle, BIOS init adresine yazmaya çalışmazsınız :) Tabii ki, BIOS init yordamları, yeniden göndermeden önce yığını güvenle kullanabileceği anlamına gelir. daha kullanışlı bir yer. Eski okul programlarında, disk belleği fiili varsayılan hale gelmeden önce, yığın genellikle RAM'in sonunda başladı ve uygulama belleğinizin üzerine yazmaya başladığınızda "yığın taşması" gerçekleşti. Bellek koruması bundan çok değişti, ancak genel olarak mümkün olduğunca geriye dönük uyumluluğu koruyor - en modern x86-64 işlemcinin bile MS DOS 5'i nasıl önyükleyebileceğini unutmayın - Windows nasıl disk belleği hakkında hiçbir fikri olmayan birçok DOS uygulamasını çalıştırabilir.