Đố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
Đó 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
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
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