เค้าโครงเคอร์เนลหน่วยความจำเสมือนใน dmesg หมายถึงอะไร?


19

ในขณะที่ผ่าน"ผลลัพธ์ของ dmesg"ฉันสามารถดูรายการค่าที่ฉันไม่สามารถเข้าใจได้อย่างถูกต้อง

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)

จากค่าฉันเข้าใจว่าฉันมี 2GB RAM (หน่วยความจำกายภาพ) แต่สิ่งที่เหลือก็น่าจะเป็น Magic Numbers สำหรับฉัน

ฉันต้องการทราบเกี่ยวกับแต่ละรายการ (fixmap, pkmap, .. ฯลฯ ) โดยย่อ (หากมีข้อสงสัยเพิ่มเติมฉันจะโพสต์คำถามแต่ละคำถามแยกกัน)?

มีใครช่วยอธิบายเรื่องนี้ให้ฉันฟังบ้าง

คำตอบ:


22

ก่อนอื่นระบบ 32 บิตมี0xffffffff( 4'294'967'295) ที่อยู่แบบเชิงเส้นเพื่อเข้าถึงตำแหน่งทางกายภาพบนท็อปของ RAM
เคอร์เนลแบ่งที่อยู่เหล่านี้ออกเป็นพื้นที่ผู้ใช้และเคอร์เนล

พื้นที่ผู้ใช้ (หน่วยความจำสูง) สามารถเข้าถึงได้โดยผู้ใช้และหากจำเป็นก็ต้องใช้โดยเคอร์เนล
ช่วงที่อยู่เป็นเลขฐานสิบหกและเลขทศนิยมธันวาคม:

0x00000000 - 0xbfffffff
0 - 3'221'225'471

พื้นที่เคอร์เนล (หน่วยความจำต่ำ) สามารถเข้าถึงได้โดยเคอร์เนลเท่านั้น
ช่วงที่อยู่เป็นเลขฐานสิบหกและเลขทศนิยมธันวาคม:

0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295

แบบนี้:

0x00000000             0xc0000000  0xffffffff 
    |                        |          |
    +------------------------+----------+
    |  User                  |  Kernel  |
    |  space                 |  space   |
    +------------------------+----------+

ดังนั้นเลย์เอาต์ของหน่วยความจำที่คุณเห็นนั้นdmesgสอดคล้องกับการแม็พแอดเดรสเชิงเส้นในพื้นที่เคอร์เนล

อันดับแรกคือ. text, .data และ. init ซึ่งจะเป็นการเตรียมข้อมูลเบื้องต้นของตารางเพจของเคอร์เนล (แปลเป็นเชิงเส้นเป็นที่อยู่ทางกายภาพ)

.text : 0xc0400000 - 0xc071ae6a   (3179 kB)

ช่วงที่โค้ดเคอร์เนลอยู่

.data : 0xc071ae6a - 0xc08feb78   (1935 kB)

ช่วงที่ส่วนข้อมูลเคอร์เนลอยู่

.init : 0xc0906000 - 0xc0973000   ( 436 kB)

ช่วงที่ตารางเพจเริ่มต้นของเคอร์เนลอยู่

(และอีก 128 kB สำหรับโครงสร้างข้อมูลแบบไดนามิกบางส่วน)

พื้นที่ที่อยู่ขั้นต่ำนี้มีขนาดใหญ่พอที่จะติดตั้งเคอร์เนลใน RAM และเริ่มต้นโครงสร้างข้อมูลหลักของมัน

ขนาดที่ใช้แล้วจะแสดงอยู่ในวงเล็บใช้ตัวอย่างรหัสเคอร์เนล:

0xc071ae6a - 0xc0400000 = 31AE6A

ในรูปแบบเลขทศนิยมนั่นคือ3'255'914(3179 kB)


ประการที่สองการใช้พื้นที่เคอร์เนลหลังจากเริ่มต้น

lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)

ช่วง lowmem สามารถใช้โดยเคอร์เนลเพื่อเข้าถึงที่อยู่ทางกายภาพโดยตรง
นี่ไม่ใช่เต็ม 1 GB เนื่องจากเคอร์เนลต้องการที่อยู่เชิงเส้นอย่างน้อย 128 MB เพื่อใช้การจัดสรรหน่วยความจำแบบไม่ต่อเนื่องและที่อยู่เชิงเส้นที่มีการแก้ไขแมป

vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)

การจัดสรรหน่วยความจำเสมือนสามารถจัดสรรกรอบหน้าได้ตามโครงร่างที่ไม่ต่อเนื่องกัน ข้อได้เปรียบหลักของสคีมานี้คือการหลีกเลี่ยงการแตกแฟรกเมนต์ภายนอกซึ่งใช้สำหรับพื้นที่สว็อปโมดูลเคอร์เนลหรือการจัดสรรบัฟเฟอร์ไปยังอุปกรณ์ I / O บางตัว

pkmap   : 0xff800000 - 0xffa00000   (2048 kB)

การแมปเคอร์เนลแบบถาวรช่วยให้เคอร์เนลสามารถสร้างการแมปที่ยาวนานของเฟรมหน้าหน่วยความจำสูงลงในพื้นที่ที่อยู่ของเคอร์เนล เมื่อเพจ HIGHMEM ถูกแมปโดยใช้ kmap () ที่อยู่เสมือนจะถูกกำหนดจากที่นี่

fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)

เหล่านี้เป็นที่อยู่เชิงเส้นที่แมปตัวแก้ไขซึ่งสามารถอ้างอิงไปยังที่อยู่ทางกายภาพใด ๆ ใน RAM ไม่ใช่แค่ 1 GB สุดท้ายเช่นที่อยู่ lowmem ที่อยู่เชิงเส้นที่มีการแมปตัวแก้ไขจะมีประสิทธิภาพมากกว่าเพื่อนร่วมงาน lowmem และ pkmap เล็กน้อย มีตัวให้คำอธิบายตารางหน้าเฉพาะที่ได้รับมอบหมายสำหรับการจับคู่คงที่และการแมปหน้า HIGHMEM โดยใช้ kmap_atomic จะถูกจัดสรรจากที่นี่


หากคุณต้องการเจาะลึกลงไปในช่องกระต่าย:
ทำความเข้าใจกับเคอร์เนลลินุกซ์


ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมนี้ ฉันอยากจะรู้ว่าทำไมหน่วยความจำต่ำจึงไม่เต็ม 1GB และอีกมากมายเกี่ยวกับประโยคต่อไป"เนื่องจากเคอร์เนลต้องการที่อยู่เชิงเส้นอย่างน้อย 128 MB เพื่อใช้การจัดสรรหน่วยความจำแบบไม่ต่อเนื่องและที่อยู่เชิงเส้นที่มีการแก้ไข
Sen

เคอร์เนลมีการเข้าถึงรหัสสูงหน่วยความจำจากเวลา (fe BIOS และ ACPI อาศัยข้อมูลเกี่ยวกับเมกะไบต์แรกของ RAM) เขาไม่สามารถทำเช่นนั้นได้โดยตรง (เช่นพื้นที่ lowmem), การดังนั้นเขาจึงต้องการที่จะ map หน่วยความจำต่ำไป ที่อยู่เชิงเส้นของหน่วยความจำสูง 128MB สงวนไว้สำหรับจุดประสงค์นี้เท่านั้น พื้นที่ vmalloc ส่วนใหญ่จะถูกแมปไปยังพื้นที่ที่มีหน่วยความจำสูงและทำการแมปใหม่อย่างรวดเร็ว
กระดิก

ดังนั้นเพจที่ตั้งค่าโดยเคอร์เนลสำหรับการเรียกใช้ระบบเสมือนจึงเป็นส่วนหนึ่งของ fixmap ??? ฉันพบคำถามนี้เพราะฉันต้องการที่จะรู้ว่าสิ่งที่อยู่ในหน้ากับที่อยู่ fffb5000, fffa1000 ฯลฯ ... ฉันได้รับค่าใช้จ่ายในการบันทึกเครื่องเสมือนของฉันเล่นซ้ำเพราะ CPU เสมือนจำนวนมากเข้าถึงหน้านี้มาก .... วิธีทำ ฉันรู้ว่าสิ่งที่อยู่ในที่อยู่นี้ ... คำตอบที่ดีโดยวิธี :) :)
Deep butt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.