When using rep insw in 32-bit protected mode to load my kernel from disk to memory, how do I properly write the data to memory, and then execute it? 
If I understand correctly, the data segment can be written to, but not executed, and the code segment can be executed but not written to.
I'm not having any problems doing this below the 1MB memory mark, but I want to load it right at 0x00100000.
My loading subroutine:
edi - destination in memory
esi - source LBA
ecx - number of sectors to write
ebx - return point
load32_source dd 0
load32:
    mov dword [load32_source], esi
    mov al, byte [load32_source + 3]
    or al, 0xe0
    mov dx, 0x1f6
    out dx, al
    mov dx, 0x1f1
    mov al, 0x00                    ; null to error
    out dx, al
    mov dx, 0x1f2                   ; sector count
    mov al, cl
    out dx, al
    mov al, byte [load32_source]
    mov dx, 0x1f3
    out dx, al
    mov al, byte [load32_source + 1]
    mov dx, 0x1f4
    out dx, al
    mov al, byte [load32_source + 2]
    mov dx, 0x1f5
    out dx, al
    mov dx, 0x1f7
    mov al, 0x20                    ; read sectors
    out dx, al
waitforit:
    in      al, dx
    test    al, 0x08
    jz      waitforit
    mov     eax, ecx
    mov     ecx, 0x00000100
    mul     ecx
    mov     ecx, eax
    mov     edx, 0x000001f0
    rep     insw
    jmp     ebx
User contributions licensed under CC BY-SA 3.0