다음 소스 파일은 별도로 (원시 바이너리로) 어셈블되어 가상 플로피의 섹터 1과 2에로드됩니다. 이 플로피는 qemu-system-i386 VM의 부팅 매체 역할을합니다.위치 독립적 코드, 16 비트 리얼 모드, 부트 로딩/플로피 읽기
"부트 로더"는 플로피의 섹터 2에서 "첫 번째 프로그램"을 읽은 다음 방금 읽은 코드가있는 메모리로 점프합니다. 다음 코드는 원하는대로 작동합니다 (예 : "첫 번째 프로그램"환영 메시지가 인쇄 됨). 그러나 "첫 번째 프로그램"(16 진 편집기에서 부트 로더 코드를 검사하여 얻음)의 소스에 ORG 0x001E
을 지정해야했습니다. 0x001E는 temp
버퍼의 오프셋이며 플로피에서 읽은 코드를 보유합니다.
"부트 로더"
BITS 16
bootloader_main:
mov bx, 0x07C0 ; Set data segment to bootloader's default segment
mov ds, bx
mov ah, 0x02 ; BIOS int13h "read sector" function
mov al, 1 ; Number of sectors to read
mov cl, 2 ; Sector to read
mov ch, 0 ; Cylinder/track
mov dh, 0 ; Head
mov dl, 0 ; Disk number (here, the floppy disk)
mov bx, 0x07C0 ; Segment containing the destination buffer
mov es, bx
mov bx, temp ; Destination buffer offset
int 0x13
jmp temp
ret
;end bootloader_main
temp: times 60 db 17
times 510-($-$$) db 0 ; Pad rest of sector and add bootloader
dw 0xAA55 signature
"첫 번째 프로그램"또는
BITS 16
ORG 0x001E ; Assume that this code will be located 0x001E bytes
after start of bootloader (in RAM)
mov bx, string ; Print a welcome string
mov ah, 0x0E
print_loop:
mov al, byte [bx]
int 0x10
inc bx
cmp byte [bx], 0
jne print_loop
;end print_loop
string: db "This is the first program.", 0
, 나는 즉 직후 RAM에 프로그램을로드 (대신 temp
의 버퍼 ORG 0x200
및 0x200
을 사용할 수 있습니다 부트 로더).하지만 유용한 운영 체제를 만들 때 이러한 해킹은 지속될 수 없습니다. 이런 종류의 주소 하드 코딩은 어떻게 피합니까?
프로세서 아키텍처에 태그를하시기 바랍니다에게 선언 단지 NASM 기능입니다. – rjp
기본 주소가 부트 로더와 함께 지정되어야 할 필요가 있다고 생각합니다. 이 분야에서 일한 대부분의 작업은 임베디드 시스템에서 수행되었으며, BIOS가 많은 도움이된다는 것을 알고 있습니다. 나에게는 부트 로더를 사용할 때 일반적으로 엔트리 포인트가 예상되는 위치를 알려주는 문서가있다. – rjp
누군가가 플로피에로드되고 부트 로더가 읽는 프로그램을 어셈블하는 경우'ORG 512' (또는 다른 명확한 주소) 같은 것을 소스 코드에 추가하라는 메시지가 나타납니다. 그리고 부트 로더는 항상 프로그램을 메모리의 같은 부분에로드 할 것입니까? 현대 운영 체제가 어떻게 발전했는지 상상하기는 어렵지만 역사에 대해 더 자세히 읽어야합니다. – Vale132