ก่อนอื่นระบบ 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 จะถูกจัดสรรจากที่นี่
หากคุณต้องการเจาะลึกลงไปในช่องกระต่าย:
ทำความเข้าใจกับเคอร์เนลลินุกซ์