2010-04-14 17 views
6

Đối với một dự án tôi muốn gọi MBR trên đĩa cứng đầu tiên trực tiếp từ DOS. Tôi đã viết một chương trình lắp ráp nhỏ tải MBR trong bộ nhớ ở 0: 7c00h một bước nhảy xa đến nó. Tôi đã đặt util của tôi vào một đĩa mềm khởi động (DOS). Đĩa (HD0, 0x80) tôi đang cố khởi động có bộ tải khởi động TrueCrypt trên đó. Khi tôi chạy công cụ trong thiết lập này, nó sẽ hiển thị màn hình TrueCrypt, nhưng sau khi nhập mật khẩu, nó sẽ treo hệ thống. Khi tôi chạy tính không rõ ràng của tôi (w00t.com) trên một máy WinXP bình thường, nó dường như sụp đổ ngay lập tức.MBR Khởi động từ DOS

Dường như tôi đang quên một số thứ quan trọng mà BIOS thường làm, tôi đoán đó là điều gì đó tầm thường. Ai đó có trải nghiệm DOS và BIOS trần kim loại tốt hơn có thể giúp tôi không?

Heres mã của tôi:

.MODEL tiny 
.386 
_TEXT SEGMENT USE16 

INCLUDE BootDefs.i 

ORG 100h 

start: 
    ; http://vxheavens.com/lib/vbw05.html 
    ; Before DOS has booted the BIOS stores the amount of usable lower memory 
    ; in a word located at 0:413h in memory. We going to erase this value because 
    ; we have booted dos before loading the bootsector, and dos is fat (and ugly). 

    ; fake free memory 
    ;push ds 
    ;push 0 
    ;pop  ds 
    ;mov  ax, TC_BOOT_LOADER_SEGMENT/1024 * 16 + TC_BOOT_MEMORY_REQUIRED 
    ;mov word ptr ds:[413h], ax ;ax = memory in K 
    ;pop ds 
    ;lea si, memory_patched_msg 
    ;call print 

    ;mov ax, cs 
    mov ax, 0 
    mov es, ax 

    ; read first sector to es:7c00h (== cs:7c00) 
    mov dl, 80h 
    mov cl, 1 
    mov al, 1 
    mov bx, 7c00h ;load sector to es:bx 
    call read_sectors 

    lea si, mbr_loaded_msg 
    call print 

    lea si, jmp_to_mbr_msg 
    call print 

    ;Set BIOS default values in environment 
    cli 
    mov dl, 80h ;(drive C) 
    xor ax, ax 
    mov ds, ax 
    mov es, ax 
    mov ss, ax 
    mov sp, 0ffffh 
    sti 

    push es 
    push 7c00h 
    retf   ;Jump to MBR code at 0:7c00h 


    ; Print string 
print: 
    xor bx, bx 
    mov ah, 0eh 
    cld 

@@: lodsb 
    test al, al 
    jz print_end 

    int 10h 
    jmp @B 

print_end: 
    ret 

    ; Read sectors of the first cylinder 
read_sectors: 
    mov ch, 0   ; Cylinder 
    mov dh, 0   ; Head 
         ; DL = drive number passed from BIOS 
    mov ah, 2 
    int 13h 
    jnc read_ok 

    lea si, disk_error_msg 
    call print 
read_ok: 
    ret 

memory_patched_msg  db 'Memory patched', 13, 10, 7, 0 
mbr_loaded_msg   db 'MBR loaded', 13, 10, 7, 0 
jmp_to_mbr_msg   db 'Jumping to MBR code', 13, 10, 7, 0 
disk_error_msg   db 'Disk error', 13, 10, 7, 0 

_TEXT ENDS 
END start 

Trả lời

1

Chỉnh sửa - câu trả lời mới:

OK, có vẻ như đầu tiên tôi hiểu lầm câu hỏi của bạn. Lời khuyên thêm duy nhất tôi có thể cho là thế này:

  • Kiểm tra xem bạn không tải hoặc HIMEM.SYS và/hoặc EMM386.EXE (hay bất kỳ nhà quản lý bộ nhớ khác). CPU phải ở Chế độ thực khi bộ tải khởi động thực thi.

  • Hãy xem danh sách gián đoạn của Ralf Brown. Nếu tôi nhớ chính xác, có một số thông tin kỹ thuật ở đâu đó trong đó về quá trình khởi động. Nó có thể cho bạn một gợi ý.

  • Xem mã nguồn của các tiện ích trình tải khác, ví dụ: loadlin. (Nó không thực hiện chính xác những điều tương tự như tiện ích của bạn, nhưng có thể cung cấp cho bạn một số cái nhìn sâu sắc, tuy nhiên.)


câu trả lời trước:

ORG 100h thực sự chính xác điều cần làm trong bộ nạp khởi động?

Tôi nghĩ điều này chỉ phù hợp với DOS .com thực thi, vì DOS sẽ khởi tạo 256 byte đầu tiên với Tiền tố phân đoạn chương trình (PSP). Nếu bạn viết một bộ nạp khởi động, không có DOS, và không có thứ như PSP. Tôi cho rằng điều này phải là ORG 0.

+0

Đó là tệp COM thực sự, vì vậy đó là whys được ORGed ở 100h. Giống như bất kỳ tệp .com nào khác. Nó tải MBR để ghi nhớ và nhảy đến. Như bạn có thể đọc trong câu hỏi ban đầu của tôi, nó thực sự thực hiện công việc: bộ tải khởi động TrueCrypt được khởi động và hiển thị màn hình bên phải. Vì vậy, tải và nhảy hoạt động. Chỉ sau đó, máy tính bị treo. Một cái gì đó phải sai, có lẽ môi trường không được thiết lập chính xác? – Rogier

+0

Nếu trình tải khởi động TrueCrypt trên đĩa của bạn thực sự _expects_ một tệp '.com' thông thường, thì' ORG 100h' không phải là vấn đề. Nếu không, tôi nghĩ rằng đó là một lỗi. - Thứ hai, không có gì ngạc nhiên khi chương trình của bạn bị treo khi được thực hiện trong Windows XP. Khi máy tính khởi động lần đầu tiên, CPU ở chế độ Real (mô phỏng 8086), và bộ nạp khởi động mong đợi điều đó. Khi Windows XP đã khởi động, CPU sẽ không bao giờ quay trở lại chế độ Real. Các chương trình DOS có thể được thực hiện ở chế độ Virtual 8086 (nếu tôi nhớ tên chính xác), và các bộ nạp khởi động sẽ không hoạt động ở chế độ CPU đó. – stakx

+0

Không, ngay cả khi tải bộ nạp khởi động để giải quyết 0: 7c00 thì không thể thực hiện được trong Windows (XP) với các utils này. Bạn không thể acces đĩa trực tiếp từ cửa sổ và bạn không thể chỉ cần đi pokin 'xung quanh trong mem. Nhưng hãy đọc trong câu hỏi của tôi rằng tôi đang chạy công cụ từ đĩa mềm (hình ảnh), tức là nó đang chạy trong DOS, chế độ thực 16bit. Hơn nữa, thực ra công việc đã phần nào; Trình khởi động TC khởi động và hiển thị màn hình "Chào mừng bạn đến với TC, vui lòng nhập mật khẩu". Chỉ sau đó nó bị đau. Ergo, phải có một cái gì đó sai trong environmnt BIOS bình thường thiết lập. – Rogier

0

Tôi không nghĩ đây là bộ tải khởi động, tệp .com của nó sẽ tải vùng khởi động và cố thực thi nó. Vì vậy, nó chạy sau khi DOS đã được khởi tạo.

1

Ok kiến ​​thức hệ điều hành DOS của tôi là rất gỉ và tôi đã không có thời gian để kiểm tra/xác nhận câu trả lời của tôi, nhưng tôi đoán vấn đề của bạn như sau:

Khi khởi động hệ điều hành DOS hoặc bất kỳ hệ điều hành khác, họ sẽ thay đổi bảng ngắt. DOS sẽ thay đổi bảng ngắt như vậy - ví dụ - ngắt 20 có thể được sử dụng để gửi các lệnh tới hạt nhân DOS "". Họ thực hiện điều này bằng cách lưu trình xử lý ngắt ban đầu, thay thế nó bằng trình xử lý của riêng mình và sau đó, như là một dự phòng mặc định, kết nối với trình xử lý ngắt ban đầu nếu họ không biết cách xử lý ngắt.Bằng cách này, họ "thêm" chức năng mới vào fiositionality bios đã tồn tại, và mọi chương trình chạy dưới DOS có thể sử dụng cuộc gọi hệ thống bằng cách chỉ cần thiết lập một số thanh ghi và sau đó gọi ngắt.

Tuy nhiên, khi bạn khởi động hệ điều hành mới, hệ điều hành mới này sẽ giả định rằng a) tất cả các ngắt được xử lý bởi bios và b) tất cả bộ nhớ đều miễn phí/không sử dụng trừ khi được báo cáo sử dụng bởi bios đó.

Vì vậy, hệ điều hành mới sẽ ghi đè lên bộ nhớ hiện đang được sử dụng bởi hệ điều hành cũ của bạn và sau đó nó sẽ gọi một trong các ngắt và sẽ thực thi một thứ gì đó trong bộ nhớ không hợp lệ.

Vì vậy, hãy đặt lại bảng ngắt của bạn thành phiên bản bios gốc và bạn sẽ bị phạt ...

+0

Hey điều này nghe có vẻ hợp lý! Cảm ơn. – Rogier