Sanal adresin fiziksel adrese çevrilmesi. Üst bitler sayfa numarasını, alt bitler sayfa içindeki göreli konumu verir; yalnız sayfa numarası çevrilir.

Bellek adresi, bir bilgisayarın belleğindeki belirli bir konumu gösteren sayıdır. İşlemci belleğe her başvurduğunda önce bu sayıyı verir; bellek de karşılığında o konumda duran değeri döndürür ya da oraya yeni bir değer yazar. Adres, donanım açısından bellek yongasına gönderilen bir bit dizisidir; yazılım açısından ise işaretsiz bir tam sayı gibi ele alınır ve üzerinde toplama, çıkarma gibi işlemler yapılabilir.

Adresler yalnızca veriyi bulmaya yaramaz. Bir programın çalışması sırasında sıradaki buyruğun nerede olduğunu da bir adres söyler; bu adresi program sayacı tutar. Dizilerde bir sonraki ögeye geçmek, bir işlevden geri dönmek, bir yapının alanına erişmek adres hesabı gerektirir. Bu yüzden bellekle işlemci arasındaki trafiğin önemli bir bölümü verinin kendisi değil, verinin nerede olduğunu söyleyen adreslerdir.

Bir makinenin kaç bellek konumunu gösterebileceğini adresin bit sayısı belirler. n bitlik bir adres 2n ayrı konum gösterebilir; bu sayıya o makinenin adres uzayının büyüklüğü denir. Adres genişliği bu nedenle bir bilgisayar mimarisinin en temel niteliklerinden biridir ve makinenin ne kadar bellek kullanabileceğini doğrudan sınırlar.

Adreslenebilir birim

Bir adresin gösterdiği en küçük parça, o makinenin adreslenebilir birimidir. Bugünkü bilgisayarların hemen hepsinde bu birim bir bayttır; ardışık iki adres, bellekte ardışık iki baytı gösterir. Bayt adreslemenin yaygınlaşması, metin işleyen programların tek tek karakterlere erişmesini kolaylaştırmasıyla ilgilidir.

Bayt adresleme tek seçenek değildir. Kimi eski makinelerde en küçük adreslenebilir birim bir bayt değil bir sözcüktür; böyle bir makinede ardışık iki adres, ardışık iki sözcüğü gösterir ve sözcüğün içindeki tek bir bayta erişmek için ek işlem gerekir. Sözcük adresleme, aynı sayıda adres bitiyle daha çok belleğe erişilmesini sağlar; buna karşılık karakter işlemeyi zorlaştırır.

Adreslenebilir birim ile makinenin sözcük uzunluğu ayrı kavramlardır. Sözcük uzunluğu, işlemcinin bir bütün olarak işlediği veri genişliğidir ve genellikle yazmaçlarının genişliğine denk düşer. Bayt adresleyen 64 bitlik bir makinede adreslenebilir birim 1 bayt, sözcük ise 8 bayttır. Bu makinede bir sözcük okumak, ardışık sekiz baytı tek bir erişimde almak demektir.

Bellek erişimleri çoğu mimaride farklı boylarda yapılabilir. Bir yükleme buyruğu tek bir baytı, iki baytlık bir yarım sözcüğü, dört baytlık bir sözcüğü ya da sekiz baytlık bir çift sözcüğü getirebilir. Adres her durumda erişilecek ilk baytı gösterir; kaç bayt okunacağını buyruğun kendisi belirler.

Adres genişliği ve adres uzayı

Adresin bit sayısına adres genişliği denir. n bitlik bir adresle 2n ayrı konum gösterilebildiği için, bayt adresleyen bir makinede erişilebilecek en büyük bellek 2n bayttır. Bu ilişki üsteldir: adrese eklenen her bit, erişilebilen belleği iki katına çıkarır.

Adres genişliği ile bayt adresleyen bir makinenin adres uzayı
Adres genişliği Konum sayısı Bayt cinsinden
16 bit 216 64 KiB
20 bit 220 1 MiB
32 bit 232 4 GiB
48 bit 248 256 TiB
64 bit 264 16 EiB

Adres genişliği bilgisayar tarihinin sınırlarını da çizmiştir. Sekiz bitlik ev bilgisayarlarının çoğu 16 bitlik adres kullanıyordu ve 64 KiB belleğin ötesine geçemiyordu. Kişisel bilgisayarların uzun süre 4 GiB'de takılı kalmasının nedeni de 32 bitlik adres genişliğiydi. Bu sınırlar aşılırken her seferinde bankalama, parçalama gibi geçici çözümler denenmiş, kalıcı çözüm adres genişliğini büyütmek olmuştur.

Bugünkü 64 bitlik işlemciler adres yazmaçlarının 64 bitinin tamamını kullanmaz. 264 baytlık bir uzayın tamamını adreslemek, hiçbir makinenin yaklaşamadığı bir bellek büyüklüğü için donanım maliyeti demektir. Bu yüzden gerçekleştirimler adresin yalnızca alt bir bölümünü anlamlı sayar; geri kalan üst bitlerin, anlamlı bölümün en üst bitinin yinelenmesi olması beklenir. Bu koşulu sağlayan adreslere kurallı adres (İngilizce: canonical address) denir ve koşulu sağlamayan bir adresi kullanmak kural dışı durum üretir. Böylece bugün 48 bit kullanan bir gerçekleştirim, ileride 57 bite geçtiğinde eski programları bozmaz.

Adres uzayının tamamı belleğe ayrılmış da olmayabilir. Uzayın bir bölümü giriş çıkış birimlerine, bir bölümü de hiçbir şeye karşılık gelmeyebilir; bu son bölgeye erişmek kural dışı durum üretir. Bir makinede takılı bellek miktarı ile adres uzayının büyüklüğü bu nedenle birbirinden ayrı iki niceliktir.

Hizalama

Bir veri, adresi kendi boyuna tam bölünüyorsa doğal hizalı sayılır. Dört baytlık bir sözcük için bu, adresin dörde bölünmesi demektir; sekiz baytlık bir çift sözcük için sekize. Hizalama, belleğin ve önbelleğin sözcük sınırlarına göre bölümlenmiş olmasından doğar: hizalı bir erişim tek bir bellek sözcüğüne düşer, hizasız bir erişim ise iki sözcüğe yayılabilir.

Hizasız erişimin bedeli donanımdan donanıma değişir. Kimi mimariler bu erişimi hiç desteklemez ve hizasız bir adres verildiğinde kural dışı durum üretir; işi düzeltmek işletim sistemine ya da programa kalır. Kimi mimariler donanımda destekler, ama erişim iki ayrı bellek işlemine bölündüğü için yavaşlar. İkiye bölünen bir erişim ayrıca bölünmez olmayabilir; çok çekirdekli bir makinede iki parça arasında başka bir çekirdeğin araya girmesi olanaklıdır.

Bu nedenle derleyiciler yapı alanlarını hizalı adreslere yerleştirir ve gerektiğinde aralara kullanılmayan baytlar koyar. Bu boşluk doldurma, bir yapının alanlarının toplam boyundan daha çok yer kaplamasına yol açar. Alanların sırasını boydan büyüğe doğru yazmak boşluğu azaltır; bu, aynı verinin bellekte daha az yer tutması demektir.

Hizalama gereksinimi adresin alt bitlerini de serbest bırakır. Dört bayta hizalı bir adresin alt iki biti her zaman sıfırdır. Kimi gerçekleştirimler bu bitleri boş bırakmayıp küçük bir bayrak ya da etiket saklamakta kullanır; adres kullanılmadan önce bu bitler temizlenir. Aynı biçimde, buyrukların hizalı olması gereken mimarilerde dallanma hedefinin alt bitleri kodlamada hiç taşınmaz ve böylece daha uzak hedeflere atlanabilir.

Bayt sıralaması

Bir bayttan uzun bir değer belleğe yazılırken baytlarının hangi sırayla yerleştirileceği ayrıca kararlaştırılmalıdır. Adres her durumda ilk baytı gösterir; sorun, o ilk baytın sayının hangi ucu olduğudur. Değerin en düşük değerlikli baytı en küçük adrese konuyorsa düzen küçük sonlu, en yüksek değerlikli baytı en küçük adrese konuyorsa büyük sonludur. Buna bayt sıralaması denir.

Dört baytlık 0x0A0B0C0D değeri 100 adresine yazıldığında iki düzen şöyle ayrılır:

Adres Küçük sonlu Büyük sonlu
100 0D 0A
101 0C 0B
102 0B 0C
103 0A 0D

Her iki düzenin de gerekçesi vardır. Küçük sonlu düzende bir sayının düşük değerlikli bölümü hep aynı adreste durduğu için, dört baytlık bir değeri iki baytlık gibi okumak adres değiştirmeden yapılabilir. Büyük sonlu düzende ise bellek dökümü okunurken baytlar sayının yazılış sırasıyla göründüğü için insan gözüne daha kolay gelir. Ağ üzerinde taşınan başlıklarda geleneksel olarak büyük sonlu düzen kullanılır.

Bayt sıralaması yalnız aynı makinede kalan veri için görünmez bir ayrıntıdır. İki makine arasında ham bayt aktarıldığında ya da bir dosya bir makinede yazılıp başkasında okunduğunda düzen farkı sessiz bozulmaya yol açar. Bu yüzden taşınabilir dosya biçimleri ve ağ protokolleri düzenlerini açıkça belirtir; kimi biçimler ise başa bir imza koyup okuyanın düzeni anlamasını sağlar.

Adresin çeşitleri

Bir programın kullandığı adres ile bellek yongasına ulaşan adres aynı olmak zorunda değildir. Aradaki dönüşüm, bugünkü işletim sistemlerinin dayandığı temeldir.

Fiziksel adres

Fiziksel adres, bellek denetleyicisine giden ve gerçek bellek hücresini seçen adrestir. Adres uzayı makinede takılı belleğin ve giriş çıkış birimlerinin yerleşimiyle belirlenir. En basit makinelerde, örneğin küçük gömülü mikrodenetleyicilerde, programın gördüğü adres doğrudan fiziksel adrestir.

Sanal adres

Sanal adres, bir programın gördüğü ve kullandığı adrestir. Her sürecin kendi sanal adres uzayı vardır; iki farklı süreçteki aynı sanal adres, bellekte ayrı yerlere karşılık gelir. Bu ayrım üç şey kazandırır: süreçler birbirinin belleğini göremez, her program kendisini bütün adres uzayına sahipmiş gibi yazabilir, ve takılı bellekten daha büyük bir uzay kullanılabilir.

Sanal adresi fiziksel adrese çeviren donanıma bellek yönetim birimi denir. Çeviri sayfa denen sabit boylu bloklar üzerinden yapılır. Sanal adresin üst bitleri sayfa numarasını, alt bitleri sayfa içindeki göreli konumu verir; sayfa numarası bir sayfa tablosundan geçirilerek fiziksel sayfa numarasına dönüştürülür, göreli konum ise olduğu gibi taşınır. Sayfa boyu ikinin kuvveti seçildiği için bu ayrıştırma bit kaydırmayla yapılır, bölme gerekmez.

Her erişimde sayfa tablosuna gitmek pahalı olduğundan, son kullanılan çeviriler işlemcinin içindeki küçük bir çeviri ara belleğinde tutulur. Bu ara bellekte bulunamayan bir çeviri sayfa tablosundan getirilir; sayfanın kendisi bellekte hiç yoksa bir sayfa hatası doğar ve işletim sistemi sayfayı diskten yükler.

Mantıksal adres

Kimi mimarilerde program bir adresi tek parça olarak değil, bir parça seçicisi ile o parçanın içindeki göreli konum olarak verir. Buna mantıksal adres denir ve parçalama düzeninde kullanılır. Parça tabanı ile göreli konum toplanarak doğrusal bir adres elde edilir; bu adres sonra sayfalamadan geçirilebilir. Parçalama bugün büyük ölçüde terk edilmiş, yerini yalnız sayfalamaya dayanan düz adres uzayı almıştır.

Adres uzayının düzeni

Çalışan bir programın sanal adres uzayı rastgele kullanılmaz; belli bölgelere ayrılır. Sıralama işletim sistemine göre değişse de bölgelerin işlevi genellikle aynıdır:

  • Kod bölgesi: yürütülecek buyrukları taşır. Yazmaya kapalı, yürütmeye açıktır.
  • Değişmez veriler: program boyunca değişmeyen sabitler ve metinler. Yazmaya kapalıdır.
  • Değişken veriler: program başlarken değeri belli olan genel değişkenler.
  • Öbek: program çalışırken istenen ve boyu önceden bilinmeyen bellek buradan verilir.
  • Yığıt: işlev çağrılarının yerel değişkenlerini ve dönüş adreslerini tutar.

Öbek ile yığıt genellikle uzayın iki ucuna yerleştirilir ve birbirine doğru büyür. Böylece ikisinden hangisinin çok yer kullanacağı önceden bilinmeden ortadaki boşluk paylaşılabilir. Yığıtın adresi küçülerek büyümesi yerleşmiş bir gelenektir ve çağrı kuralları buna göre yazılmıştır.

Uzayın bir bölümü de çekirdeğe ayrılır. Kullanıcı programı bu bölgeye eriştiğinde donanım kural dışı durum üretir; erişim ancak işlemci ayrıcalıklı kipteyken geçerlidir. Bölgelerin her birine ayrı izinler verilebilmesi, bir programın kendi kodunu değiştirmesini ya da veri olarak yazdığı bir şeyi yürütmesini engellemenin de yoludur.

Adresin buyrukta belirtilmesi

Bir buyruğun erişeceği adresi nasıl bildirdiğine adresleme kipi denir. Adresi buyruğun içine olduğu gibi yazmak en doğrudan yoldur, ama pahalıdır: 64 bitlik bir adresi taşımak için buyruğun en az 64 bit uzunluğunda olması gerekir. Bu yüzden mimariler adresi doğrudan yazmak yerine hesaplatmayı yeğler.

En yaygın kip, adresi bir yazmaçtaki değer ile buyruğa gömülü küçük bir sabitin toplamı olarak hesaplamaktır. Yazmaç bir yapının ya da dizinin başlangıcını, sabit de o yapının içindeki alanın kaçıncı bayttan başladığını tutar. Böylece küçük bir sabitle bütün adres uzayına erişilebilir; sabitin kısa olması buyruğu da kısaltır.

Dizilerde ise adres iki yazmacın toplamıyla hesaplanır: biri dizinin başlangıcı, öteki gezinen dizindir. Dizin çoğu zaman öge boyuyla çarpılır, çünkü ardışık ögeler bellekte öge boyu kadar aralıklarla durur. Kimi mimariler bu çarpmayı adresleme kipinin içine katar ve ayrı bir çarpma buyruğu gerektirmez.

Buyruğun kendi adresine göre hesaplama da yaygındır. Dallanma hedefleri genellikle program sayacına eklenen bir uzaklık olarak kodlanır; böylece dallanma buyruğu mutlak adres taşımaz ve kod bellekte nereye yüklenirse yüklensin doğru çalışır. Aynı yöntem veriye erişimde de kullanılır ve yerden bağımsız kod yazmayı olanaklı kılar.

Bellek eşlemeli giriş çıkış

Adres uzayının tamamı belleğe ayrılmak zorunda değildir. Bellek eşlemeli giriş çıkış düzeninde, uzayın belli bir bölümü bellek yerine aygıt yazmaçlarına bağlanır. O bölgedeki bir adrese yazmak bir aygıta buyruk göndermek, oradan okumak ise aygıtın durumunu öğrenmek anlamına gelir. Böylece giriş çıkış için ayrı bir buyruk kümesi gerekmez; sıradan yükleme ve saklama buyrukları yeter.

Bu düzenin bedeli, adres uzayının bir bölümünün bellek için kullanılamamasıdır. 32 bitlik makinelerde takılı belleğin bir bölümünün görünmemesinin nedeni buydu: aygıtlara ayrılan bölge, 4 GiB'lik uzayın içinden çıkıyordu. Adres uzayı büyüdükçe bu sıkışıklık ortadan kalkmıştır.

Bellek eşlemeli adresler sıradan bellek gibi davranmaz. Aynı adresten arka arkaya okumak farklı değerler verebilir; yazılan değer geri okunmayabilir. Bu yüzden bu bölge önbelleğe alınmaz ve derleyicinin erişimleri yeniden sıralamasına ya da gereksiz sayıp atmasına izin verilmez. Programlama dilleri bu erişimleri işaretlemek için ayrı bir belirtim sunar.

Seçenek olarak kimi mimarilerde aygıtlar için bellekten bağımsız, kendi adres uzayı bulunur ve bu uzaya yalnız özel buyruklarla erişilir. Bu ayrı uzay bellek adres uzayının dışındadır; iki uzayda aynı sayı farklı şeyleri gösterir.

Programlama dillerinde adres

Alt düzey dillerde adres, üzerinde işlem yapılabilen bir değerdir. Bir değişkenin adresini veren işleç, o değişkenin bellekteki yerini bir işaretçi olarak döndürür; işaretçiden değere geçmek ise ayrı bir işleçtir. İşaretçiler bu yüzden hem verinin nerede olduğunu taşır hem de kendileri bellekte saklanabilir.

İşaretçi aritmetiğinde sayılar bayt değil öge sayılır. Bir tam sayı dizisini gösteren işaretçiye bir eklemek, adresi bir bayt değil bir tam sayı boyu kadar ilerletir. Böylece aynı ifade öge boyundan bağımsız çalışır. Dizi indisleme de bu hesabın kısaltılmış yazımıdır: bir dizinin i. ögesine erişmek, dizinin başlangıç adresine i öge eklemekle aynı şeydir.

Hiçbir nesneyi göstermeyen bir adres için diller ayrı bir değer ayırır. Bu değer geçerli hiçbir nesnenin adresi olamaz; bu yüzden adres uzayının başı genellikle hiçbir şeye eşlenmez ve oraya erişmek kural dışı durum üretir. Böylece boş işaretçi kullanma yanlışı sessizce yanlış veri okumak yerine programın hemen durmasıyla sonuçlanır.

Üst düzey dillerin çoğu adresi programcıdan gizler. Nesnelere doğrudan adresle değil başvurularla erişilir; başvurular üzerinde aritmetik yapılamaz ve gösterdikleri nesne yer değiştirdiğinde çalışma zamanı başvuruyu günceller. Bu, çöp toplayan dillerde nesnelerin bellekte taşınabilmesinin ön koşuludur. Adresin gizlenmesi, işaretçi yanlışlarından doğan bütün bir hata sınıfını ortadan kaldırır; karşılığında bellek yerleşimi üzerindeki denetim kaybedilir.

Güvenlik

Bellek adresleri saldırı ve savunmanın ortak zeminidir. Bellek güvenliği bulunmayan dillerde yazılmış programlarda, bir dizinin sınırının dışına yazmak komşu verilerin ve yığıttaki dönüş adresinin üzerine yazılmasına yol açabilir. Dönüş adresi değiştirilebiliyorsa saldırgan yürütmenin nereye gideceğini belirler.

Buna karşı geliştirilen ilk donanım önlemi, sayfalara yürütülebilir olup olmadığını bildiren bir nitelik eklemekti; veri tutan sayfalardan buyruk getirilmesi böylece yasaklandı. Bu önlem yeni kod yerleştirmeyi durdurur ama bellekte hâlihazırda yürütülebilir işaretli parçaların uygun sırayla zincirlenmesini durdurmaz.

İkinci yaygın önlem adres uzayı düzeninin rastgeleleştirilmesidir. Program her çalıştığında kod, öbek, yığıt ve kitaplıklar farklı adreslere yerleştirilir; saldırganın kullanmak istediği parçanın adresini önceden bilmesi engellenir. Bu önlemin gücü doğrudan rastgeleleştirmeye ayrılabilen bit sayısına bağlıdır. Otuz iki bitlik bir adres uzayında bu sayı küçük kaldığı için düzen deneme yanılmayla bulunabilmiş, yöntemin tek başına yeterli olmadığı gösterilmiştir. Adres uzayı 64 bite çıkınca ayrılabilen bit sayısı da büyümüş, bu saldırı zorlaşmıştır.

Adresin kendisini korumaya yönelik yöntemler de vardır. Adres genişliğinin tamamı kullanılmadığı için üst bitler boştur; kimi mimariler bu bitlere, adresin ve bir gizli anahtarın üzerinden hesaplanan kısa bir imza yazar. Adres kullanılmadan önce imza doğrulanır, uymuyorsa erişim başarısız olur. Böylece bellekte tutulan bir dönüş adresini değiştirmek, imzayı da doğru hesaplamayı gerektirir.

Adres bilgisinin sızması da başlı başına bir açıktır. Rastgeleleştirmeye dayanan savunmalar, tek bir geçerli adresin saldırgana ulaşmasıyla büyük ölçüde etkisiz kalır; sızan adresten öteki bölgelerin yerleri hesaplanabilir. Bu yüzden hata iletilerinde ve günlüklerde adres yazdırmaktan kaçınılır.

Tarihçe

Adresin bugünkü anlamı saklı program ilkesiyle birlikte doğmuştur. Buyrukların da veriler gibi aynı belleğe konması, bir buyruğun başka bir buyruğun adresini hesaplayabilmesi demekti; bu, programın kendi kendini değiştirmesine dayanan ilk döngü ve dizi tekniklerinin temeliydi.

Kendini değiştiren kod, hataları ayıklanamaz olduğu için kısa sürede bırakıldı. Yerini, adres hesabını buyruğu değiştirmeden yapmayı sağlayan dizin yazmacı aldı. Bir dizinin ögeleri arasında gezinmek artık buyruğun içindeki adresi değiştirmeyi değil, ayrı bir yazmacı artırmayı gerektiriyordu. Bu, adresleme kiplerinin başlangıcıdır.

Adres genişliği bilgisayar tarihinde birkaç kez darlaşıp genişledi. On altı bitlik adresle çalışan makineler 64 KiB sınırına dayanınca bellek bankalarına ayrıldı ve hangi bankanın görüneceğini ayrı bir yazmaç belirledi. Otuz iki bitlik makineler 4 GiB sınırına dayandığında benzer geçici çözümler yeniden denendi. Her iki durumda da kalıcı çözüm adres genişliğini büyütmek oldu.

Sanal bellek fikri, adresin bir konumu doğrudan göstermek zorunda olmadığını ortaya koyarak adres kavramını ikiye ayırdı. Programın gördüğü adres ile belleğe giden adres birbirinden koptuktan sonra, aynı fiziksel belleği birden çok sürecin farklı adreslerle görmesi, kullanılmayan sayfaların diske taşınması ve bellek koruması olanaklı hâle geldi.

Ayrıca bakınız

Kaynakça

  1. ^ a b c d e f g h i j k l m n o p Patterson, David A.; Hennessy, John L. (2017). Computer Organization and Design: The Hardware/Software Interface (5 bas.). Morgan Kaufmann. ISBN 978-0-12-407726-3. 
  2. ^ a b c d e f g h i j k l m n Tanenbaum, Andrew S.; Austin, Todd (2013). Structured Computer Organization (6 bas.). Pearson. ISBN 978-0-13-291652-3. 
  3. ^ "Intel 64 and IA-32 Architectures Software Developer Manuals" (İngilizce). Intel. Erişim tarihi: 9 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  4. ^ a b c d e f Hennessy, John L.; Patterson, David A. (2019). Computer Architecture: A Quantitative Approach (6 bas.). Morgan Kaufmann. ISBN 978-0-12-811905-1. 
  5. ^ Shacham, Hovav; Page, Matthew; Pfaff, Ben; Goh, Eu-Jin; Modadugu, Nagendra; Boneh, Dan (2004). On the effectiveness of address-space randomization. Proceedings of the 11th ACM Conference on Computer and Communications Security. ss. 298-307. doi:10.1145/1030083.1030124.