2011-08-25 26 views
17

Trong Linux, tôi đã học được rằng mọi quá trình lưu trữ dữ liệu bắt đầu từ 0x08048000 trong máy 32 bit (và 0x00400000 trong máy 64 bit).Bộ nhớ trước 0x08048000 được sử dụng cho máy 32 bit là gì?

Nhưng tôi không biết lý do tại sao bắt đầu từ đó. Bộ nhớ trước 0x08048000 được sử dụng để làm gì?

Cập nhật: Một số người nghĩ rằng nó được ánh xạ cho hạt nhân. Tuy nhiên theo như tôi biết, hạt nhân Linux sử dụng bộ nhớ cao cấp bắt đầu sau khi ngăn xếp người dùng.

Trả lời

6

Câu trả lời thực sự là: một loạt các điều. Không có ý nghĩa huyền diệu nào đối với địa chỉ tải của tệp thực thi và khá nhiều thứ có thể được ánh xạ tới các địa chỉ thấp hơn. Các ví dụ phổ biến bao gồm: thư viện C (chẳng hạn như thư viện C), bộ tải động ld.so và hạt nhân VDSO (thư viện mã động được ánh xạ hạt nhân cung cấp một số giao diện cho hạt nhân trong x86 Linux). Nhưng bạn có thể lập bản đồ khá nhiều thứ bạn mong muốn ở đó, sử dụng cuộc gọi hệ thống mmap().

Ví dụ trên máy tính cụ thể của tôi bản đồ là như sau (bị thu hồi nhưng "cat/proc/self/bản đồ"):

[email protected]:~$ cat /proc/self/maps 
001c0000-00317000 r-xp 00000000 08:01 245836  /lib/libc-2.12.1.so 
00317000-00318000 ---p 00157000 08:01 245836  /lib/libc-2.12.1.so 
00318000-0031a000 r--p 00157000 08:01 245836  /lib/libc-2.12.1.so 
0031a000-0031b000 rw-p 00159000 08:01 245836  /lib/libc-2.12.1.so 
0031b000-0031e000 rw-p 00000000 00:00 0 
00376000-00377000 r-xp 00000000 00:00 0   [vdso] 
00852000-0086e000 r-xp 00000000 08:01 245783  /lib/ld-2.12.1.so 
0086e000-0086f000 r--p 0001b000 08:01 245783  /lib/ld-2.12.1.so 
0086f000-00870000 rw-p 0001c000 08:01 245783  /lib/ld-2.12.1.so 
08048000-08051000 r-xp 00000000 08:01 2244617 /bin/cat 
08051000-08052000 r--p 00008000 08:01 2244617 /bin/cat 
08052000-08053000 rw-p 00009000 08:01 2244617 /bin/cat 
09ab5000-09ad6000 rw-p 00000000 00:00 0   [heap] 
b7502000-b7702000 r--p 00000000 08:01 4456455 /usr/lib/locale/locale-archive 
b7702000-b7703000 rw-p 00000000 00:00 0 
b771b000-b771c000 r--p 002a1000 08:01 4456455 /usr/lib/locale/locale-archive 
b771c000-b771e000 rw-p 00000000 00:00 0 
bfbd9000-bfbfa000 rw-p 00000000 00:00 0   [stack] 
+1

Một số bản phân phối (ví dụ: RHEL6) thậm chí đã bỏ hoàn toàn điều '0x08048000' bằng cách liên kết các chương trình với [' DYNAMIC' flag] (http://stackoverflow.com/questions/5235844/objdump-head-elf-meaning-of-flags), làm cho phân đoạn của họ được phân bổ cùng với '.so'. –

1

điển hình tải Bản đồ cho x86 cho 32 bit ứng dụng tĩnh nhỏ trông giống như:

Address  Contents 

0x08048000 code 
0x08052000 data 
0x0805A000 bss (zero data) 
0x08072000 end of data (brk marker) 
0xBFFFE000 stack 

Tất cả việc này là ngược lại - chồng là trên đầu trang và di chuyển xuống trong khi dữ liệu di chuyển lên. Đoán của tôi là địa chỉ trước 0x08048000 được liên kết tĩnh một cái gì đó tương tự như MBR cho mỗi hệ điều hành.

+0

Nếu hình ảnh chương trình của bạn được tải ở 0x0848000, bạn sẽ không thấy bất kỳ điều gì bên dưới đó - không có "MBR" hoặc bất kỳ thứ gì. – bdonlan

8

Địa chỉ bắt đầu để tải mã thực thi được xác định bởi các tiêu đề ELF cho tệp thực thi. Ví dụ:

/bin/ls 
architecture: i386, flags 0x00000112: 
EXEC_P, HAS_SYMS, D_PAGED 
start address 0x08049bb0 

Không có gì ngăn việc thực thi chỉ định địa chỉ tải khác; vì bất kỳ lý do gì, việc đặt default linker settings vào đó. Bạn có thể ghi đè bằng tập lệnh trình liên kết tùy chỉnh.

Theo mặc định, trên linux/x86, bạn sẽ không thấy địa chỉ thấp bên dưới 0x08000000 được sử dụng nhiều; mặc dù hạt nhân có thể sử dụng nó nếu được yêu cầu trong một cuộc gọi mmap, hoặc nếu nó hết phòng cho mmaps. Ngoài ra, đã có đề xuất sử dụng các địa chỉ trong phạm vi 0x00000000 - 0x01000000 cho ánh xạ thư viện, để làm cho bộ đệm tràn nhiều khó khăn hơn (bằng cách nhúng một byte NUL để chấm dứt chuỗi).

+0

Tất cả các quy trình đều có bảng dịch địa chỉ ảo riêng biệt. Vì vậy, nhiều người trong số họ có thể có cùng một địa chỉ bắt đầu, dịch sang địa chỉ vật lý khác nhau. –

1

Địa chỉ tải là tùy ý, nhưng đã được tiêu chuẩn hóa lại với SYSV cho x86 . Nó khác nhau đối với mọi kiến ​​trúc. Những gì ở trên và dưới cũng là tùy ý, và thường được đưa lên bằng cách liên kết trong các thư viện và các vùng mmap().

Các vấn đề liên quan