Dmesg'deki Sanal çekirdek Bellek Düzeni ne anlama geliyor?


19

"Çıktı dmesg" geçerken ben düzgün anlayamıyorum değerleri bir listesini görebiliyordu.

Memory: 2047804k/2086248k available (3179k kernel code, 37232k reserved, 1935k data, 436k init, 1176944k highmem)
virtual kernel memory layout:
    fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)
    pkmap   : 0xff800000 - 0xffa00000   (2048 kB)
    vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)
    lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)
      .init : 0xc0906000 - 0xc0973000   ( 436 kB)
      .data : 0xc071ae6a - 0xc08feb78   (1935 kB)
      .text : 0xc0400000 - 0xc071ae6a   (3179 kB)

Değerlerden anladığım kadarıyla 2GB RAM (Fiziksel bellek) var. Ama diğer şeyler benim için Sihirli Sayılar gibi görünüyor.

Her birini (fixmap, pkmap, .. vb.) Kısaca bilmek istiyorum (eğer daha fazla şüphe varsa, her birini ayrı bir Soru olarak göndereceğim)?

Birisi bana bunu açıklayabilir mi?

Yanıtlar:


22

Ö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


Bu harika cevap için teşekkürler. Neden düşük mem tam 1GB ve cümlenin bir sonraki bölümü hakkında daha fazla olmadığını bilmek istiyorum "çünkü çekirdek her zaman en az 128 MB doğrusal adres gerektirir bitişik olmayan bellek ayırma ve sabit haritalı doğrusal adresleri uygulamak.
Sen

Çekirdek zaman zaman yüksek bellek koduna erişmek zorundadır (fe BIOS ve ACPI bilgileri RAM'in ilk MB'sinde bulunur), bunu doğrudan yapamaz (düşük bellek alanı gibi), bu nedenle düşük belleği yüksek bellek doğrusal adresleri, 128 MB sadece bu amaç için ayrılmıştır. Vmalloc alanı çoğunlukla bazı yüksek bellek alanlarına geçici olarak eşlenir ve oldukça hızlı bir şekilde yeniden eşleştirilir.
wag

Yani sanal sistem çağrısı için çekirdek tarafından ayarlanan sayfalar da fixmap bir parçasıdır ?? Ben fffb5000, fffa1000 vb adresi ile sayfada tam olarak ne olduğunu bilmek istiyorum bu soru becaues koştu ... Birçok sanal CPU bu sayfaya bir çok erişim çünkü sanal Makine kayıt tekrar benim yük alıyorum .... nasıl Bu adreste tam olarak ne olduğunu biliyorum ... Bu arada BÜYÜK CEVAP :)
Deepthought
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.