Trước hết, một hệ thống 32 bit có 0xffffffff
( 4'294'967'295
) địa chỉ tuyến tính để truy cập vào vị trí vật lý của RAM.
Nhân chia các địa chỉ này thành không gian người dùng và nhân.
Không gian người dùng (bộ nhớ cao) có thể được truy cập bởi người dùng và, nếu cần, cũng bởi kernel.
Phạm vi địa chỉ trong ký hiệu hex và dec:
0x00000000 - 0xbfffffff
0 - 3'221'225'471
Không gian hạt nhân (bộ nhớ thấp) chỉ có thể được truy cập bởi kernel.
Phạm vi địa chỉ trong ký hiệu hex và dec:
0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295
Như thế này:
0x00000000 0xc0000000 0xffffffff
| | |
+------------------------+----------+
| User | Kernel |
| space | space |
+------------------------+----------+
Do đó, cách bố trí bộ nhớ bạn đã thấy trong dmesg
tương ứng với ánh xạ của các địa chỉ tuyến tính trong không gian kernel.
Đầu tiên, các chuỗi .text, .data và .init cung cấp việc khởi tạo các bảng trang riêng của kernel (dịch tuyến tính thành các địa chỉ vật lý).
.text : 0xc0400000 - 0xc071ae6a (3179 kB)
Phạm vi nơi mã hạt nhân cư trú.
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
Phạm vi nơi các phân đoạn dữ liệu hạt nhân cư trú.
.init : 0xc0906000 - 0xc0973000 ( 436 kB)
Phạm vi nơi các bảng trang ban đầu của hạt nhân cư trú.
(và 128 kB khác cho một số cấu trúc dữ liệu động.)
Không gian địa chỉ tối thiểu này chỉ đủ lớn để cài đặt kernel trong RAM và khởi tạo cấu trúc dữ liệu cốt lõi của nó.
Kích thước được sử dụng của chúng được hiển thị bên trong dấu ngoặc đơn, ví dụ mã hạt nhân:
0xc071ae6a - 0xc0400000 = 31AE6A
Trong ký hiệu thập phân, đó là 3'255'914
(3179 kB).
Thứ hai, việc sử dụng không gian kernel sau khi khởi tạo
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
Phạm vi lowmem có thể được sử dụng bởi kernel để truy cập trực tiếp vào các địa chỉ vật lý.
Đây không phải là 1 GB đầy đủ, vì hạt nhân luôn yêu cầu ít nhất 128 MB địa chỉ tuyến tính để thực hiện cấp phát bộ nhớ không liên tục và địa chỉ tuyến tính được ánh xạ sửa lỗi.
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
Phân bổ bộ nhớ ảo có thể phân bổ các khung trang dựa trên sơ đồ không liên tục. Ưu điểm chính của lược đồ này là để tránh sự phân mảnh bên ngoài, điều này được sử dụng cho các vùng trao đổi, mô-đun hạt nhân hoặc phân bổ bộ đệm cho một số thiết bị I / O.
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
Ánh xạ kernel vĩnh viễn cho phép kernel thiết lập ánh xạ lâu dài của các khung trang có bộ nhớ cao vào không gian địa chỉ kernel. Khi trang HIGHMEM được ánh xạ bằng kmap (), địa chỉ ảo được gán từ đây.
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
Đây là các địa chỉ tuyến tính được ánh xạ có thể tham chiếu đến bất kỳ địa chỉ vật lý nào trong RAM, không chỉ 1 GB cuối cùng như các địa chỉ lowmem. Các địa chỉ tuyến tính được ánh xạ sửa chữa hiệu quả hơn một chút so với các đồng nghiệp lowmem và pkmap của họ. Có các mô tả bảng trang chuyên dụng được chỉ định cho ánh xạ cố định và ánh xạ của các trang HIGHMEM sử dụng kmap_atomic được phân bổ từ đây.
Nếu bạn muốn lặn sâu hơn vào lỗ thỏ:
Tìm hiểu về Hạt nhân Linux