Öncelikle, 32 bit sistem RAM'in fiziksel bir yerine erişmek için 0xffffffff
( 4'294'967'295
) doğrusal adreslere sahiptir .
Çekirdek bu adresleri kullanıcı ve çekirdek alanına ayırır.
Kullanıcı alanına (yüksek bellek) kullanıcı ve gerekirse de çekirdek tarafından erişilebilir.
Hex ve dec gösterimindeki adres aralığı:
0x00000000 - 0xbfffffff
0 - 3'221'225'471
Çekirdek alanına (düşük bellek) yalnızca çekirdek tarafından erişilebilir.
Hex ve dec gösterimindeki adres aralığı:
0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295
Bunun gibi:
0x00000000 0xc0000000 0xffffffff
| | |
+------------------------+----------+
| User | Kernel |
| space | space |
+------------------------+----------+
Böylece, gördüğünüz bellek düzeni dmesg
, çekirdek alanındaki doğrusal adreslerin eşlenmesine karşılık gelir.
İlk olarak, çekirdeğin kendi sayfa tablolarının başlatılmasını sağlayan .text, .data ve .init dizileri (doğrusal olanı fiziksel adreslere çevirin).
.text : 0xc0400000 - 0xc071ae6a (3179 kB)
Çekirdek kodunun bulunduğu aralık.
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
Çekirdek veri segmentlerinin bulunduğu aralık.
.init : 0xc0906000 - 0xc0973000 ( 436 kB)
Çekirdeğin ilk sayfa tablolarının bulunduğu aralık.
(ve bazı dinamik veri yapıları için 128 kB daha.)
Bu minimum adres alanı, çekirdeği RAM'e kurmak ve çekirdek veri yapılarını başlatmak için yeterince büyüktür.
Kullanılan boyutları parantez içinde gösterilir, örneğin çekirdek kodunu alın:
0xc071ae6a - 0xc0400000 = 31AE6A
Ondalık gösterimde, bu 3'255'914
(3179 kB).
İkincisi, başlatma işleminden sonra çekirdek alanının kullanımı
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
Lowmem aralığı, fiziksel adreslere doğrudan erişmek için çekirdek tarafından kullanılabilir.
Bu, tam 1 GB değildir, çünkü çekirdek, bitişik olmayan bellek ayırma ve düzeltme eşlemeli doğrusal adresleri uygulamak için her zaman en az 128 MB doğrusal adres gerektirir.
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
Sanal bellek ayırma bitişik olmayan bir şemaya göre sayfa çerçeveleri ayırabilir. Bu şemanın ana avantajı harici parçalanmayı önlemek, bu takas alanları, çekirdek modülleri veya bazı G / Ç cihazlarına tamponların tahsisi için kullanılır.
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
Kalıcı çekirdek eşlemesi, çekirdeğin yüksek adresli sayfa çerçevelerinin çekirdek adres alanına uzun süre eşlenmesini sağlar. Bir HIGHMEM sayfası kmap () kullanılarak eşlendiğinde, buradan sanal adresler atanır.
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
Bunlar, lowmem adresleri gibi sadece son 1 GB değil, RAM'deki herhangi bir fiziksel adrese işaret edebilen sabit eşlemeli doğrusal adreslerdir. Düzeltme eşlemeli doğrusal adresler, lowmem ve pkmap meslektaşlarından biraz daha verimlidir. Sabit eşleme için atanmış özel sayfa tablosu tanımlayıcıları vardır ve kmap_atomic kullanan HIGHMEM sayfalarının eşlemeleri buradan ayrılır.
Tavşan deliğinin derinliklerine dalmak istiyorsanız:
Linux Çekirdeğini Anlamak