bootsect.s: Как мы можем получить доступ к следующей строке после удаления самого кода? - PullRequest
2 голосов
/ 11 июня 2019

Я - обучающаяся операционная система для новичков в сети, в которой упоминается bootsect.s: https://kernel.googlesource.com/pub/scm/linux/kernel/git/nico/archive/+/v0.99-pl8/boot/bootsect.S Но этот фрагмент кода мне довольно странен:

        mov ax,#BOOTSEG
        mov ds,ax
        mov ax,#INITSEG
        mov es,ax
        mov cx,#256
        sub si,si
        sub di,di
        cld
        rep
        movsw
        jmpi    go,INITSEG

Странная частьэто последние 3 строки.Насколько я понимаю, rep movsw уже убрал сам код, поэтому когда pc указывает на jumpi и когда компьютер собирается выполнить код, указанный pc, это должно вызвать ошибку, потому что код jumpi go, INITSEG имеетбыл удаленТак почему же этот код все еще работает, и jumpi go, INITSEG все еще можно найти и выполнить?

1 Ответ

3 голосов
/ 16 июня 2019

Из комментария ОП

... но компьютер указывает на начало раздела с #BOOTSEG, , где больше нет кода . Поэтому я думал, что Jumpi Go, INITSEG не будет выполняться.

Будьте уверены, код все еще там!

Так заполнялась память, когда BIOS загружал загрузочный сектор по линейному адресу 00007C00h:

00007C00    mov ax,#BOOTSEG     ; 07C0h
00007C03    mov ds,ax
00007C05    mov ax,#INITSEG     ; 9000h
00007C08    mov es,ax
00007C0A    mov cx,#256
00007C0D    sub si,si
00007C0F    sub di,di
00007C11    cld
00007C12    rep movsw
00007C14    jmpi    go,INITSEG  ; Far jump (EAh, 19h, 00h, 00h, 90h)
00007C19    go:

После выполнения инструкции rep movsw память на 00090000h будет содержать точную копию из 512 байтов, найденных в 00007C00h. Хотя автор этого кода заявил, что код удаляет сам по себе , это всего лишь вопрос речи. Это всегда дубликат, который создается. Исходные байты все еще там, если, конечно, не было перекрытия между 2 областями памяти в DS:SI и ES:DI, но здесь это не так.

Как следствие, указатель команды будет в 00007C14h и выполнит дальний переход (межсегментный) к линейному адресу 00090019h, где метка go .
С этого момента 512 байтов в 00007C00h можно игнорировать.

...