मैं नस्ल में एक साधारण x86 लिनक्स बूटलोडर बनाने की कोशिश कर रहा हूं।लिनक्स x86 बूटलोडर
लिनक्स bzImage पहले से शुरू होने वाले डिस्क विभाजन sda1 पर संग्रहीत है।
मैंने 0x7E00 से शुरू होने वाली स्मृति में bzImage (15 सेक्टर) से वास्तविक मोड कोड पढ़ा है। हालांकि जब मैं कोड में कूदता हूं तो यह बस लटकता है, कुछ भी नहीं होता है।
मैंने एसडीए पर मास्टर बूट रिकॉर्ड के लिए कोड बनाया है। मैं शायद सबसे अच्छा हूं अगर मैं पूरी चीज संलग्न करता हूं। मैं जानना चाहता हूं कि यह दूर कूदने के निर्देश के बाद क्यों लटकता है।
[BITS 16]
%define BOOTSEG 0x7C0
%define BOOTADDR (BOOTSEG * 0x10)
%define HDRSEG (BOOTSEG + 0x20)
%define HDRADDR (HDRSEG * 0x10)
%define KERNSEG (HDRSEG + 0x20)
[ORG BOOTADDR]
entry_section:
cli
jmp start
start:
; Clear segments
xor ax, ax
mov ds, ax
mov es, ax
mov gs, ax
mov fs, ax
mov ss, ax
mov sp, BOOTADDR ; Lots of room for it to grow down from here
; Read all 15 sectors of realmode code in the kernel
mov ah, 0x42
mov si, dap
mov dl, 0x80
int 0x13
jc bad
; Test magic number of kernel header
mov eax, dword [HDRADDR + 0x202]
cmp eax, 'HdrS'
jne bad
; Test jump instruction is there
mov al, byte [KERNSEG * 16]
cmp al, 0xEB
jne bad
xor ax, ax ; Kernel entry code will set ds = ax
xor bx, bx ; Will also set ss = dx
jmp dword KERNSEG:0
; Simple function to report an error and halt
bad:
mov al, "B"
call putc
jmp halt
; Param: char in al
putc:
mov ah, 0X0E
mov bh, 0x0F
xor bl, bl
int 0x10
ret
halt:
hlt
jmp halt
; Begin data section
dap: ; Disk address packet
db 0x10 ; Size of dap in bytes
db 0 ; Unused
dw 15 ; Number of sectors to read
dw 0 ; Offset where to place data
dw HDRSEG ; Segment where to place data
dd 0x3F ; Low order of start addres in sectors
dd 0 ; High order of start address in sectors
; End data section
times 446-($-$$) db 0 ; Padding to make the MBR 512 bytes
; Hardcoded partition entries
part_boot:
dw 0x0180, 0x0001, 0xFE83, 0x3c3f, 0x003F, 0x0000, 0xF3BE, 0x000E
part_sda2:
dw 0x0000, 0x3D01, 0xFE83, 0xFFFF, 0xF3FD, 0x000E, 0x5AF0, 0x01B3
part_sda3:
dw 0xFE00, 0xFFFF, 0xFE83, 0xFFFF, 0x4EED, 0x01C2, 0xb113, 0x001D
part_sda4:
dw 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
dw 0xAA55 ; Magic number at relative address 510
mbrend: ; Relative address 512
क्या आपने GRUB और LILO के कार्यान्वयन का अध्ययन किया था? –
मैंने लिलो के कार्यान्वयन को देखा है और ऐसा लगता है जैसे वे लिनक्स कोड में उसी तरह कूदते हैं। यद्यपि उनके कोड को पढ़ने के लिए मुश्किल है। – Druesukker
क्या आपने कोड के माध्यम से कदम उठाने और लटकने का कारण देखने के लिए डीबगर का उपयोग किया था? – Jester