OSDev: Ich stecke beim Hinzufügen von GDT festLinux

Linux verstehen
Anonymous
 OSDev: Ich stecke beim Hinzufügen von GDT fest

Post by Anonymous »

Ich habe das Buch OS01 von Tuhdo befolgt und sozusagen einen einfachen Bootloader erstellt, der den Kernel lädt. Dann habe ich versucht, etwas Code zum Einrichten von GDT hinzuzufügen, aber ich habe ungewöhnliches Verhalten in gdb beobachtet.
Hier habe ich in der Subroutine _start angehalten, die gerade dabei ist, die Funktion main() aufzurufen (main ruft dann gdt_init auf).
Image

Aber wenn ich noch einmal si drücke, um die erste Anweisung von main einzugeben, stoppte es bei den beiden Anweisungen über main.
Image

Zuerst dachte ich, dass die Hauptdatei tatsächlich aufgerufen wurde, was so schnell geschieht, dass bereits die gdt_init aufgerufen wird (naiver Gedanke). Aber als ich gdb eingegeben habe, habe ich den Break bereits bei gdb_init gesetzt, also muss es dort angehalten haben, bevor es die Leave- und Ret-Anweisungen erreicht hat. Außerdem zeigt die Rückverfolgung, dass wir main nie aufgerufen haben.
Image

Ich habe ungefähr eine Woche damit verbracht, die Ursache zu finden, aber kein Glück. Bitte rette meine Seele!

Das Folgende sind die Hauptteile meines Codes.
Hier ist mein bootloader.asm:

Code: Select all

;********************************************
; bootloader.asm
; A Simple Bootloader
;********************************************
bits 16
start: jmp boot

;; constant and variable definitions
welcome_msg db "Welcome to NyanOS!", 0ah, 0dh, 0h
err_msg db "E", 0h

boot:
cli ; no interrupts
cld ; all that we need to init

mov bh, 0xe
mov bl, 0x18
call MovCursor

mov si, welcome_msg
call Print

mov ax, 0x100

;; set the buffer at es:bx (0x50:0x0)
mov es, ax
xor bx, bx

mov al, 18  ; read 18 sectors
mov ch, 0   ; track 0
mov cl, 2   ; sector to start reading (from the second sector)
mov dh, 0   ; head number
mov dl, 0   ; drive number

mov ah, 0x02    ;read sectors from disk
int 0x13    ; call the BIOS routine

jc .disk_err    ; failed to read disk

jmp [0x1000 + 0x18]; jump and execute the sector!

.disk_err:
mov bh, 0xf
mov bl, 0x15
call MovCursor

mov si, err_msg
call Print

hlt ; halt the system

%include "io.asm"

; We have to be 512 bytes.  Clear the rest of the bytes with 0
times 510 - ($-$$) db 0
dw 0xAA55
bootloader.lds:

Code: Select all

OUTPUT(bootloader);

SECTIONS
{
.text 0x7c00:
{
*(.text)
}
.data :
{
*(.data)
}
}
start.s, in dem die _start-Subroutine vom oben genannten bootloader.asm aufgerufen wird (jmp [0x1000 + 0x18]):

Code: Select all

section .text
extern main
global _start
_start:
mov esp, stack_top
call main
hlt

section .bss
align 16
stack_bottom:
resb 4096
stack_top:
kernel.c:

Code: Select all

#include "gdt.h"

void main()
{
gdt_init();
while (1) {};
}
kernel.lds:

Code: Select all

ENTRY(_start);

PHDRS
{
code PT_LOAD FLAGS(rx);
}

SECTIONS
{
.text 0x2000: ALIGN(0x1000) { *(.text) } :code
.data : { *(.data) }
.bss : { *(.bss) }
/DISCARD/ : { * (.eh_frame) }
}
Nach dem Kompilieren sind hier einige der Debug-Ausgaben.

Code: Select all

readelf -h build/kernel/kernel

Code: Select all

ELF Header:
Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class:                             ELF32
Data:                              2's complement, little endian
Version:                           1 (current)
OS/ABI:                            UNIX - System V
ABI Version:                       0
Type:                              EXEC (Executable file)
Machine:                           Intel 80386
Version:                           0x1
Entry point address:               0x2140
Start of program headers:          52 (bytes into file)
Start of section headers:          22816 (bytes into file)
Flags:                             0x0
Size of this header:               52 (bytes)
Size of program headers:           32 (bytes)
Number of program headers:         1
Size of section headers:           40 (bytes)
Number of section headers:         13
Section header string table index: 12

Code: Select all

objdump -d build/kernel/kernel

Code: Select all

build/kernel/kernel:     file format elf32-i386

Disassembly of section .text:

00002000 :
2000:   55                      push   %ebp
2001:   89 e5                   mov    %esp,%ebp
2003:   83 ec 08                sub    $0x8,%esp
2006:   8b 55 14                mov    0x14(%ebp),%edx
2009:   8b 45 18                mov    0x18(%ebp),%eax
200c:   88 55 fc                mov    %dl,-0x4(%ebp)
200f:   88 45 f8                mov    %al,-0x8(%ebp)
2012:   8b 45 0c                mov    0xc(%ebp),%eax
2015:   89 c2                   mov    %eax,%edx
2017:   8b 45 08                mov    0x8(%ebp),%eax
201a:   66 89 14 c5 52 21 00    mov    %dx,0x2152(,%eax,8)
2021:   00
2022:   8b 45 0c                mov    0xc(%ebp),%eax
2025:   c1 e8 10                shr    $0x10,%eax
2028:   89 c2                   mov    %eax,%edx
202a:   8b 45 08                mov    0x8(%ebp),%eax
202d:   88 14 c5 54 21 00 00    mov    %dl,0x2154(,%eax,8)
2034:   8b 45 0c                mov    0xc(%ebp),%eax
2037:   c1 e8 18                shr    $0x18,%eax
203a:   89 c2                   mov    %eax,%edx
203c:   8b 45 08                mov    0x8(%ebp),%eax
203f:   88 14 c5 57 21 00 00    mov    %dl,0x2157(,%eax,8)
2046:   8b 45 10                mov    0x10(%ebp),%eax
2049:   89 c2                   mov    %eax,%edx
204b:   8b 45 08                mov    0x8(%ebp),%eax
204e:   66 89 14 c5 50 21 00    mov    %dx,0x2150(,%eax,8)
2055:   00
2056:   8b 45 10                mov    0x10(%ebp),%eax
2059:   c1 e8 10                shr    $0x10,%eax
205c:   83 e0 0f                and    $0xf,%eax
205f:   89 c2                   mov    %eax,%edx
2061:   8b 45 08                mov    0x8(%ebp),%eax
2064:   88 14 c5 56 21 00 00    mov    %dl,0x2156(,%eax,8)
206b:   8b 45 08                mov    0x8(%ebp),%eax
206e:   0f b6 04 c5 56 21 00    movzbl 0x2156(,%eax,8),%eax
2075:   00
2076:   89 c2                   mov    %eax,%edx
2078:   0f b6 45 f8             movzbl -0x8(%ebp),%eax
207c:   83 e0 f0                and    $0xfffffff0,%eax
207f:   09 d0                   or     %edx,%eax
2081:   89 c2                   mov    %eax,%edx
2083:   8b 45 08                mov    0x8(%ebp),%eax
2086:   88 14 c5 56 21 00 00    mov    %dl,0x2156(,%eax,8)
208d:   8b 45 08                mov    0x8(%ebp),%eax
2090:   0f b6 55 fc             movzbl -0x4(%ebp),%edx
2094:   88 14 c5 55 21 00 00    mov    %dl,0x2155(,%eax,8)
209b:   90                      nop
209c:   c9                      leave
209d:   c3                      ret

0000209e :
209e:   55                      push   %ebp
209f:   89 e5                   mov    %esp,%ebp
20a1:   83 ec 08                sub    $0x8,%esp
20a4:   66 c7 05 68 21 00 00    movw   $0x17,0x2168
20ab:   17 00
20ad:   b8 50 21 00 00          mov    $0x2150,%eax
20b2:   a3 6a 21 00 00          mov    %eax,0x216a
20b7:   6a 00                   push   $0x0
20b9:    6a 00                   push   $0x0
20bb:   6a 00                   push   $0x0
20bd:   6a 00                   push   $0x0
20bf:   6a 00                   push   $0x0
20c1:   e8 3a ff ff ff          call   2000 
20c6:   83 c4 14                add    $0x14,%esp
20c9:   68 cf 00 00 00          push   $0xcf
20ce:   68 9a 00 00 00          push   $0x9a
20d3:   6a ff                   push   $0xffffffff
20d5:   6a 00                   push   $0x0
20d7:   6a 01                   push   $0x1
20d9:   e8 22 ff ff ff          call   2000 
20de:   83 c4 14                add    $0x14,%esp
20e1:   68 cf 00 00 00          push   $0xcf
20e6:   68 92 00 00 00          push   $0x92
20eb:   6a ff                   push   $0xffffffff
20ed:   6a 00                   push   $0x0
20ef:   6a 02                   push   $0x2
20f1:   e8 0a ff ff ff          call   2000 
20f6:   83 c4 14                add    $0x14,%esp
20f9:   b8 68 21 00 00          mov    $0x2168,%eax
20fe:   83 ec 0c                sub    $0xc,%esp
2101:   50                      push   %eax
2102:   e8 19 00 00 00          call   2120 
2107:   83 c4 10                add    $0x10,%esp
210a:   90                      nop
210b:   c9                      leave
210c:   c3                      ret

0000210d :
210d:   55                      push   %ebp
210e:   89 e5                   mov    %esp,%ebp
2110:   83 e4 f0                and    $0xfffffff0,%esp
2113:   e8 86 ff ff ff          call   209e 
2118:   90                      nop
2119:   eb fd                   jmp    2118 
211b:   66 90                   xchg   %ax,%ax
211d:   66 90                   xchg   %ax,%ax
211f:   90                      nop

00002120 :
2120:   8b 44 24 04             mov    0x4(%esp),%eax
2124:   0f 01 10                lgdtl  (%eax)
2127:   66 b8 10 00             mov    $0x10,%ax
212b:   8e d8                   mov    %eax,%ds
212d:   8e c0                   mov    %eax,%es
212f:   8e e0                   mov    %eax,%fs
2131:   8e e8                   mov    %eax,%gs
2133:   8e d0                   mov    %eax,%ss
2135:   ea 3c 21 00 00 08 00    ljmp   $0x8,$0x213c

0000213c :
213c:   c3                      ret
213d:   66 90                   xchg   %ax,%ax
213f:   90                      nop

00002140 :
2140:   bc 70 31 00 00          mov    $0x3170,%esp
2145:   e8 c3 ff ff ff          call   210d 
214a:   f4                      hlt
Sagen Sie mir, ob Sie weitere Debugging-Informationen, Informationen zur GDB-Sitzung oder zu Binärdateien benötigen. Vielen Dank!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post