2009-06-27 33 views
12

Tôi biết rằng, khi khởi động, BIOS tải khu vực đầu tiên (512 byte) của ổ đĩa thiết bị được xác định trước trên bộ nhớ 0x7c00 và sau đó chuyển đến địa chỉ đó.BIOS tải thông tin gì vào RAM?

Vì vậy, bộ nhớ từ 0x7c00 đến 0x7dff bị chiếm đóng. Có bất kỳ phần nào khác của RAM đang bị chiếm đóng không?

Nếu tôi đang lập trình hệ điều hành, tôi có thể sử dụng tất cả RAM ngoại trừ 0x7c00 để ox7dff cho mục đích của riêng mình không ?, hoặc có phần nào khác chứa thông tin "quý giá" vào lúc khởi động mà tôi không được ghi đè ?

Tôi biết rằng tại một thời điểm cụ thể, tôi có thể ghi đè MBR được nạp vào bộ nhớ (chainloading), câu hỏi của tôi tập trung vào ... phần bộ nhớ nào có sẵn cho hệ điều hành?

Xin lỗi vì tiếng anh xấu của tôi. Cảm ơn câu trả lời của bạn!!

Trả lời

0

Nếu bạn viết hệ điều hành, ngay khi bạn vào chế độ bảo vệ, bạn sẽ quên BIOS (trừ khi bạn đang làm việc với một số thiết bị xấu) và sử dụng tất cả những gì bạn có.

Hoặc bạn đang viết bộ nạp khởi động?

+0

Bạn không thể quên BIOS. Nó có thể cần một số vùng bộ nhớ được bảo vệ cho các vùng MMIO, hoặc để sử dụng bởi mã SMM. – bdonlan

+0

Có rất nhiều vùng bộ nhớ vật lý không thể sử dụng cụ thể với phần cứng được ánh xạ bộ nhớ. – clemahieu

7

Với bất kỳ BIOS gần đây nào từ xa, bạn có thể lấy thông tin bản đồ bộ nhớ bằng cách sử dụng BIOS Int 15/AX=E820h call. Điều này sẽ cho bạn biết bạn có thể sử dụng bộ nhớ nào cho hệ điều hành của mình.

Giải thích chi tiết hơn về cách detect available memory và nội dung của BIOS memory map có thể được tìm thấy tại OSDev.

8

Các x86 Bất động Bộ nhớ Mode Map là như sau:

- 0x00000000 - 0x000003FF - Real Mode Interrupt Vector Table 
- 0x00000400 - 0x000004FF - BIOS Data Area 
- 0x00000500 - 0x00007BFF - Unused 
- 0x00007C00 - 0x00007DFF - Our Bootloader 
- 0x00007E00 - 0x0009FFFF - Unused 
- 0x000A0000 - 0x000BFFFF - Video RAM (VRAM) Memory 
- 0x000B0000 - 0x000B7777 - Monochrome Video Memory 
- 0x000B8000 - 0x000BFFFF - Color Video Memory 
- 0x000C0000 - 0x000C7FFF - Video ROM BIOS 
- 0x000C8000 - 0x000EFFFF - BIOS Shadow Area 
- 0x000F0000 - 0x000FFFFF - System BIOS 

Trong lập trình chế độ thực của tôi, tôi thường dính từ 0x00007E00 - 0x0009FFFF (Không phải tất cả của nó) .. Tôi sử dụng phân đoạn: bù đắp địa chỉ sử dụng bộ nhớ .. để đi từ một bootloader 1 Giai đoạn đến một hạt nhân hoặc một bootloader 2nd Stage, tôi sử dụng:

; bootloader.s 

BITS 16 
ORG 0x7C00 

    CLI 
    JMP 0xE000  ; Can also be JMP 0x7C00:200 
    HLT 

TIMES 510 - ($-$$) DB 0 
DW 0xAA55 

-

; Something.s 

BITS 16 
ORG 0x7E00  ; Can also be ORG 0x7C00:200 

; Code goes here for your purposes.. whether it be a 2nd stage 
; bootloader or your 16bit kernel.. 

CLI 
HLT 

Nếu bạn đang chuyển sang chế độ Bảo vệ, bạn vẫn sẽ cần một sơ đồ như minh họa ở trên .. Trong mục Something.s bạn có thể lập trình theo thói quen chế độ được bảo vệ (GDT, A20, Đặt chế độ video, vv ..)

Để giải thích về vị trí bộ nhớ tại 0x7C00 (Điểm tải khởi động), 0x7C00 - 0x7DFF là nơi bạn đặt bộ nạp khởi động (bộ nạp khởi động ở trên). Bạn đặt nó ở đó vì BIOS nhảy đến vị trí đó sau khi thực hiện các thói quen của nó. Trình tải khởi động phải có kích thước chính xác là 512 byte (chú ý chỉ thị TIMES). Từ đó, mã của bạn có thể có kích thước bất kỳ (miễn là nó vừa với bản đồ bộ nhớ), và bạn sẽ có thể làm việc trên hệ điều hành hoàn toàn.

Nếu bạn chuyển sang chế độ bảo vệ 32Bit, bạn sẽ có thể sử dụng bất kỳ điều gì về nhãn 1MiB.

+0

Tôi không nhận thấy ngày cho đến sau khi tôi đăng. Xin lỗi vì đã sao lưu lại. –

+1

"- 0x00007E00 - 0x0009FFFF - Chưa sử dụng" - Điều này không hoàn toàn đúng. Phạm vi được đảm bảo là miễn phí là 0x00007E00 - 0x0007FFFF.Trên phạm vi đó, bạn sẽ có EBDA (thường là 0x0009FC00 - \t 0x0009FFFF, nhưng tôi đã thấy nó ở 0x00096C00 và các vị trí khác) và có khả năng một số mã BIOS. Một số BIOS có mã khởi động PXE trong phạm vi này. Một cách tiếp cận bảo thủ là tránh mọi thứ trên 0x00080000. – Timo

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