Übung zu betriebssysteme - entkäfern mit gdb & gef · add esp, 8 ; cpu kontext und irq-nummer...
TRANSCRIPT
![Page 1: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/1.jpg)
Übung zu BetriebssystemeEntkäfern mit GDB & GEF
31. Oktober 2019
Andreas Ziegler, Bernhard Heinloth, Christian Eichler
Lehrstuhl für Informatik 4Friedrich-Alexander-Universität Erlangen-Nürnberg
Lehrstuhl für Verteilte Systeme und Betriebssysteme
![Page 2: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/2.jpg)
![Page 3: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/3.jpg)
![Page 4: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/4.jpg)
![Page 5: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/5.jpg)
?
![Page 6: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/6.jpg)
; Multiboot-KonstantenMULTIBOOT_PAGE_ALIGN equ 1<<0MULTIBOOT_MEMORY_INFO equ 1<<1MULTIBOOT_HEADER_MAGIC equ 0x1badb002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
MULTIBOOT_HEADER_CHKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)MULTIBOOT_START_ADDRESS equ 0x1000000
INIT_STACK_SIZE equ (1024*4)
; Deskriptoren global machen für realmode.asm
[GLOBAL idt_desc_global]
; Globaler Einsprungspunkt für das System
[GLOBAL startup]
; externe Funktionen und Variablen, die hier benötigt werden
[EXTERN multiboot_addr] ; Adresse der Multiboot Strukturen
[EXTERN guardian] ; Wird zur Interruptbehandlung aufgerufen
[EXTERN ap_stack] ; hier liegt die Adresse des Stacks für den gerade gebooteten AP
[EXTERN kernel_init] ; Wird zur Interruptbehandlung aufgerufen
[EXTERN gdt_desc_global] ; Der "Pointer" zur globalen Deskriptortabelle (machine/gdt.cc)
[SECTION .text]
startup:jmp skip_multiboot_hdr
; multiboot header, auch der Zugriff über das Symbol ist alignedalign 4multiboot_header:
dd MULTIBOOT_HEADER_MAGICdd MULTIBOOT_HEADER_FLAGSdd MULTIBOOT_HEADER_CHKSUM
skip_multiboot_hdr:; Adresse der Multiboot-Strukturen speichern
mov [multiboot_addr], ebx
; Unterbrechungen sperrencli
; NMI verbietenmov al, 0x80out 0x70, al
mov dword [ap_stack], init_stack + INIT_STACK_SIZE
segment_init:; GDT setzen
lgdt [gdt_desc_global]; Unterbrechungsbehandlung sicherstellen
lidt [idt_desc_global]
; Datensegmentregister initialisierenmov ax, 0x10mov ds, axmov es, axmov fs, axmov gs, axmov ss, ax
; cs Segment Register neu ladenjmp 0x8:load_cs
load_cs:
; Stackpointer initialisieren
mov esp, [ap_stack]; Richtung für String-Operationen festlegen
cld
; Wechsel in C/C++call kernel_init
; Startup-Code fuer die APsstartup_ap:; Alle Segmentselektoren neu laden, die zeigen noch auf die ap_gdt; Nach Intel Manual Kapitel 9.9.1 ist das nötig
mov ax, 0x10mov ds, axmov es, axmov fs, axmov gs, axmov ss, ax
; jetzt ist die CPU im protected mode
jmp segment_init
;Unterbrechungsbehandlungen
; Die Interruptbehandlung muss in Assembler gestartet werden, um die;; IRQ <irq-num> <error-code?>%macro IRQ 2align 8irq_entry_%1:
;; Den CPU Kontext Sichernpush edxpush ecxpush eax;; Einen Pointer auf den CPU Kontext als zweites Argument pushen
push esp;; Die Interrupt-Nummer ist das erste Argumentpush %1call guardianadd esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmenpop eaxpop ecxpop edxiret
%endmacro
IRQ 0, 0IRQ 1, 0IRQ 2, 0IRQ 3, 0IRQ 4, 0IRQ 5, 0IRQ 6, 0IRQ 7, 0IRQ 8, 1IRQ 9, 0IRQ 10, 1IRQ 11, 1IRQ 12, 1IRQ 13, 1IRQ 14, 1IRQ 15, 0IRQ 16, 0IRQ 17, 1
%assign i 18%rep 238IRQ i, 0%assign i i+1%endrep
[SECTION .data]; 'interrupt descriptor table' mit 256 Eintraegen.align 4idt:%macro idt_entry 1
dw (irq_entry_%1 - startup + MULTIBOOT_START_ADDRESS) & 0xffffdw 0x0008dw 0x8e00
dw ((irq_entry_%1 - startup + MULTIBOOT_START_ADDRESS) & 0xffff0000) >> 16%endmacro
%assign i 0%rep 256idt_entry i%assign i i+1%endrep
idt_desc_global:dw 256*8-1 ; idt enthaelt 256 Eintraegedd idt
[SECTION .bss]
init_stack:resb INIT_STACK_SIZE
; setup_ap, Start der restlichen Prozessoren; Umschaltung in den 'Protected-Mode'
; Dieser Code wird von APICSystem::copySetupAPtoLowMem() reloziert!
[SECTION .setup_ap_seg]
USE16
setup_ap:; Segmentregister initialisieren
mov ax,cs ; Daten- und Codesegment sollenmov ds,ax ; hierher zeigen. Stack brauchen wir hier nicht.
; Unterbrechungen sperrencli
; NMI verbietenmov al, 0x80out 0x70, al
; vorrübergehende GDT setzen
lgdt [ap_gdtd - setup_ap]
; Umschalten in den Protected Modemov eax,cr0 ; Setze PM bit im Kontrollregister 1or eax,1mov cr0,eaxjmp dword 0x08:startup_ap
align 4ap_gdt:
dw 0,0,0,0 ; NULL Deskriptor; Codesegment von 0-4GB
dw 0xFFFF ; 4Gb - (0x100000*0x1000 = 4Gb)dw 0x0000 ; base address=0
dw 0x9A00 ; code read/exec
dw 0x00CF ; granularity=4096, 386 (+5th nibble of limit); Datensegment von 0-4GB
dw 0xFFFF ; 4Gb - (0x100000*0x1000 = 4Gb)dw 0x0000 ; base address=0
dw 0x9200 ; data read/write
dw 0x00CF ; granularity=4096, 386 (+5th nibble of limit)
ap_gdtd:
dw $ - ap_gdt - 1 ; Limitdd 0x40000 + ap_gdt - setup_ap ; Physikalische Adresse der ap_gdt
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printfprintf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printfprintfprintf
printf
printf
printf
printfprintfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf printf
printfprintfprintfprintf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf printf
printf
printfprintf
printfprintf
printf
printf
printfprintf
printf
printf
printf
printf
printfprintf
printf
printf
printfprintf
printf
![Page 7: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/7.jpg)
; Multiboot-KonstantenMULTIBOOT_PAGE_ALIGN equ 1<<0MULTIBOOT_MEMORY_INFO equ 1<<1MULTIBOOT_HEADER_MAGIC equ 0x1badb002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
MULTIBOOT_HEADER_CHKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)MULTIBOOT_START_ADDRESS equ 0x1000000
INIT_STACK_SIZE equ (1024*4)
; Deskriptoren global machen für realmode.asm
[GLOBAL idt_desc_global]
; Globaler Einsprungspunkt für das System
[GLOBAL startup]
; externe Funktionen und Variablen, die hier benötigt werden
[EXTERN multiboot_addr] ; Adresse der Multiboot Strukturen
[EXTERN guardian] ; Wird zur Interruptbehandlung aufgerufen
[EXTERN ap_stack] ; hier liegt die Adresse des Stacks für den gerade gebooteten AP
[EXTERN kernel_init] ; Wird zur Interruptbehandlung aufgerufen
[EXTERN gdt_desc_global] ; Der "Pointer" zur globalen Deskriptortabelle (machine/gdt.cc)
[SECTION .text]
startup:jmp skip_multiboot_hdr
; multiboot header, auch der Zugriff über das Symbol ist alignedalign 4multiboot_header:
dd MULTIBOOT_HEADER_MAGICdd MULTIBOOT_HEADER_FLAGSdd MULTIBOOT_HEADER_CHKSUM
skip_multiboot_hdr:; Adresse der Multiboot-Strukturen speichern
mov [multiboot_addr], ebx
; Unterbrechungen sperrencli
; NMI verbietenmov al, 0x80out 0x70, al
mov dword [ap_stack], init_stack + INIT_STACK_SIZE
segment_init:; GDT setzen
lgdt [gdt_desc_global]; Unterbrechungsbehandlung sicherstellen
lidt [idt_desc_global]
; Datensegmentregister initialisierenmov ax, 0x10mov ds, axmov es, axmov fs, axmov gs, axmov ss, ax
; cs Segment Register neu ladenjmp 0x8:load_cs
load_cs:
; Stackpointer initialisieren
mov esp, [ap_stack]; Richtung für String-Operationen festlegen
cld
; Wechsel in C/C++call kernel_init
; Startup-Code fuer die APsstartup_ap:; Alle Segmentselektoren neu laden, die zeigen noch auf die ap_gdt; Nach Intel Manual Kapitel 9.9.1 ist das nötig
mov ax, 0x10mov ds, axmov es, axmov fs, axmov gs, axmov ss, ax
; jetzt ist die CPU im protected mode
jmp segment_init
;Unterbrechungsbehandlungen
; Die Interruptbehandlung muss in Assembler gestartet werden, um die;; IRQ <irq-num> <error-code?>%macro IRQ 2align 8irq_entry_%1:
;; Den CPU Kontext Sichernpush edxpush ecxpush eax;; Einen Pointer auf den CPU Kontext als zweites Argument pushen
push esp;; Die Interrupt-Nummer ist das erste Argumentpush %1call guardianadd esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmenpop eaxpop ecxpop edxiret
%endmacro
IRQ 0, 0IRQ 1, 0IRQ 2, 0IRQ 3, 0IRQ 4, 0IRQ 5, 0IRQ 6, 0IRQ 7, 0IRQ 8, 1IRQ 9, 0IRQ 10, 1IRQ 11, 1IRQ 12, 1IRQ 13, 1IRQ 14, 1IRQ 15, 0IRQ 16, 0IRQ 17, 1
%assign i 18%rep 238IRQ i, 0%assign i i+1%endrep
[SECTION .data]; 'interrupt descriptor table' mit 256 Eintraegen.align 4idt:%macro idt_entry 1
dw (irq_entry_%1 - startup + MULTIBOOT_START_ADDRESS) & 0xffffdw 0x0008dw 0x8e00
dw ((irq_entry_%1 - startup + MULTIBOOT_START_ADDRESS) & 0xffff0000) >> 16%endmacro
%assign i 0%rep 256idt_entry i%assign i i+1%endrep
idt_desc_global:dw 256*8-1 ; idt enthaelt 256 Eintraegedd idt
[SECTION .bss]
init_stack:resb INIT_STACK_SIZE
; setup_ap, Start der restlichen Prozessoren; Umschaltung in den 'Protected-Mode'
; Dieser Code wird von APICSystem::copySetupAPtoLowMem() reloziert!
[SECTION .setup_ap_seg]
USE16
setup_ap:; Segmentregister initialisieren
mov ax,cs ; Daten- und Codesegment sollenmov ds,ax ; hierher zeigen. Stack brauchen wir hier nicht.
; Unterbrechungen sperrencli
; NMI verbietenmov al, 0x80out 0x70, al
; vorrübergehende GDT setzen
lgdt [ap_gdtd - setup_ap]
; Umschalten in den Protected Modemov eax,cr0 ; Setze PM bit im Kontrollregister 1or eax,1mov cr0,eaxjmp dword 0x08:startup_ap
align 4ap_gdt:
dw 0,0,0,0 ; NULL Deskriptor; Codesegment von 0-4GB
dw 0xFFFF ; 4Gb - (0x100000*0x1000 = 4Gb)dw 0x0000 ; base address=0
dw 0x9A00 ; code read/exec
dw 0x00CF ; granularity=4096, 386 (+5th nibble of limit); Datensegment von 0-4GB
dw 0xFFFF ; 4Gb - (0x100000*0x1000 = 4Gb)dw 0x0000 ; base address=0
dw 0x9200 ; data read/write
dw 0x00CF ; granularity=4096, 386 (+5th nibble of limit)
ap_gdtd:
dw $ - ap_gdt - 1 ; Limitdd 0x40000 + ap_gdt - setup_ap ; Physikalische Adresse der ap_gdt
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf printf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printfprintf printfprintf
printf
printf
printf
printfprintf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printfprintfprintf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printfprintf
printfprintf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printf
![Page 8: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/8.jpg)
; Multiboot-KonstantenMULTIBOOT_PAGE_ALIGN equ 1<<0MULTIBOOT_MEMORY_INFO equ 1<<1MULTIBOOT_HEADER_MAGIC equ 0x1badb002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
MULTIBOOT_HEADER_CHKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)MULTIBOOT_START_ADDRESS equ 0x1000000
INIT_STACK_SIZE equ (1024*4)
; Deskriptoren global machen für realmode.asm
[GLOBAL idt_desc_global]
; Globaler Einsprungspunkt für das System
[GLOBAL startup]
; externe Funktionen und Variablen, die hier benötigt werden
[EXTERN multiboot_addr] ; Adresse der Multiboot Strukturen
[EXTERN guardian] ; Wird zur Interruptbehandlung aufgerufen
[EXTERN ap_stack] ; hier liegt die Adresse des Stacks für den gerade gebooteten AP
[EXTERN kernel_init] ; Wird zur Interruptbehandlung aufgerufen
[EXTERN gdt_desc_global] ; Der "Pointer" zur globalen Deskriptortabelle (machine/gdt.cc)
[SECTION .text]
startup:jmp skip_multiboot_hdr
; multiboot header, auch der Zugriff über das Symbol ist alignedalign 4multiboot_header:
dd MULTIBOOT_HEADER_MAGICdd MULTIBOOT_HEADER_FLAGSdd MULTIBOOT_HEADER_CHKSUM
skip_multiboot_hdr:; Adresse der Multiboot-Strukturen speichern
mov [multiboot_addr], ebx
; Unterbrechungen sperrencli
; NMI verbietenmov al, 0x80out 0x70, al
mov dword [ap_stack], init_stack + INIT_STACK_SIZE
segment_init:; GDT setzen
lgdt [gdt_desc_global]; Unterbrechungsbehandlung sicherstellen
lidt [idt_desc_global]
; Datensegmentregister initialisierenmov ax, 0x10mov ds, axmov es, axmov fs, axmov gs, axmov ss, ax
; cs Segment Register neu ladenjmp 0x8:load_cs
load_cs:
; Stackpointer initialisieren
mov esp, [ap_stack]; Richtung für String-Operationen festlegen
cld
; Wechsel in C/C++call kernel_init
; Startup-Code fuer die APsstartup_ap:; Alle Segmentselektoren neu laden, die zeigen noch auf die ap_gdt; Nach Intel Manual Kapitel 9.9.1 ist das nötig
mov ax, 0x10mov ds, axmov es, axmov fs, axmov gs, axmov ss, ax
; jetzt ist die CPU im protected mode
jmp segment_init
;Unterbrechungsbehandlungen
; Die Interruptbehandlung muss in Assembler gestartet werden, um die;; IRQ <irq-num> <error-code?>%macro IRQ 2align 8irq_entry_%1:
;; Den CPU Kontext Sichernpush edxpush ecxpush eax;; Einen Pointer auf den CPU Kontext als zweites Argument pushen
push esp;; Die Interrupt-Nummer ist das erste Argumentpush %1call guardianadd esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmenpop eaxpop ecxpop edxiret
%endmacro
IRQ 0, 0IRQ 1, 0IRQ 2, 0IRQ 3, 0IRQ 4, 0IRQ 5, 0IRQ 6, 0IRQ 7, 0IRQ 8, 1IRQ 9, 0IRQ 10, 1IRQ 11, 1IRQ 12, 1IRQ 13, 1IRQ 14, 1IRQ 15, 0IRQ 16, 0IRQ 17, 1
%assign i 18%rep 238IRQ i, 0%assign i i+1%endrep
[SECTION .data]; 'interrupt descriptor table' mit 256 Eintraegen.align 4idt:%macro idt_entry 1
dw (irq_entry_%1 - startup + MULTIBOOT_START_ADDRESS) & 0xffffdw 0x0008dw 0x8e00
dw ((irq_entry_%1 - startup + MULTIBOOT_START_ADDRESS) & 0xffff0000) >> 16%endmacro
%assign i 0%rep 256idt_entry i%assign i i+1%endrep
idt_desc_global:dw 256*8-1 ; idt enthaelt 256 Eintraegedd idt
[SECTION .bss]
init_stack:resb INIT_STACK_SIZE
; setup_ap, Start der restlichen Prozessoren; Umschaltung in den 'Protected-Mode'
; Dieser Code wird von APICSystem::copySetupAPtoLowMem() reloziert!
[SECTION .setup_ap_seg]
USE16
setup_ap:; Segmentregister initialisieren
mov ax,cs ; Daten- und Codesegment sollenmov ds,ax ; hierher zeigen. Stack brauchen wir hier nicht.
; Unterbrechungen sperrencli
; NMI verbietenmov al, 0x80out 0x70, al
; vorrübergehende GDT setzen
lgdt [ap_gdtd - setup_ap]
; Umschalten in den Protected Modemov eax,cr0 ; Setze PM bit im Kontrollregister 1or eax,1mov cr0,eaxjmp dword 0x08:startup_ap
align 4ap_gdt:
dw 0,0,0,0 ; NULL Deskriptor; Codesegment von 0-4GB
dw 0xFFFF ; 4Gb - (0x100000*0x1000 = 4Gb)dw 0x0000 ; base address=0
dw 0x9A00 ; code read/exec
dw 0x00CF ; granularity=4096, 386 (+5th nibble of limit); Datensegment von 0-4GB
dw 0xFFFF ; 4Gb - (0x100000*0x1000 = 4Gb)dw 0x0000 ; base address=0
dw 0x9200 ; data read/write
dw 0x00CF ; granularity=4096, 386 (+5th nibble of limit)
ap_gdtd:
dw $ - ap_gdt - 1 ; Limitdd 0x40000 + ap_gdt - setup_ap ; Physikalische Adresse der ap_gdt
printf
printf
printfprintf
printf
printf
printfprintf
printf
printf
printf
printf
printfprintf
printf
printfprintf
printfprintf
printf
printfprintf
printf
printfprintf
printf
printfprintf
printfprintf
printf
printf
printfprintf
printf
printf
printfprintf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf printf
printfprintf
printf
printfprintf
printf
printf
printf
printf
printf
printfprintf
printf
printfprintf
![Page 9: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/9.jpg)
; Multiboot-KonstantenMULTIBOOT_PAGE_ALIGN equ 1<<0MULTIBOOT_MEMORY_INFO equ 1<<1MULTIBOOT_HEADER_MAGIC equ 0x1badb002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
MULTIBOOT_HEADER_CHKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)MULTIBOOT_START_ADDRESS equ 0x1000000
INIT_STACK_SIZE equ (1024*4)
; Deskriptoren global machen für realmode.asm
[GLOBAL idt_desc_global]
; Globaler Einsprungspunkt für das System
[GLOBAL startup]
; externe Funktionen und Variablen, die hier benötigt werden
[EXTERN multiboot_addr] ; Adresse der Multiboot Strukturen
[EXTERN guardian] ; Wird zur Interruptbehandlung aufgerufen
[EXTERN ap_stack] ; hier liegt die Adresse des Stacks für den gerade gebooteten AP
[EXTERN kernel_init] ; Wird zur Interruptbehandlung aufgerufen
[EXTERN gdt_desc_global] ; Der "Pointer" zur globalen Deskriptortabelle (machine/gdt.cc)
[SECTION .text]
startup:jmp skip_multiboot_hdr
; multiboot header, auch der Zugriff über das Symbol ist alignedalign 4multiboot_header:
dd MULTIBOOT_HEADER_MAGICdd MULTIBOOT_HEADER_FLAGSdd MULTIBOOT_HEADER_CHKSUM
skip_multiboot_hdr:; Adresse der Multiboot-Strukturen speichern
mov [multiboot_addr], ebx
; Unterbrechungen sperrencli
; NMI verbietenmov al, 0x80out 0x70, al
mov dword [ap_stack], init_stack + INIT_STACK_SIZE
segment_init:; GDT setzen
lgdt [gdt_desc_global]; Unterbrechungsbehandlung sicherstellen
lidt [idt_desc_global]
; Datensegmentregister initialisierenmov ax, 0x10mov ds, axmov es, axmov fs, axmov gs, axmov ss, ax
; cs Segment Register neu ladenjmp 0x8:load_cs
load_cs:
; Stackpointer initialisieren
mov esp, [ap_stack]; Richtung für String-Operationen festlegen
cld
; Wechsel in C/C++call kernel_init
; Startup-Code fuer die APsstartup_ap:; Alle Segmentselektoren neu laden, die zeigen noch auf die ap_gdt; Nach Intel Manual Kapitel 9.9.1 ist das nötig
mov ax, 0x10mov ds, axmov es, axmov fs, axmov gs, axmov ss, ax
; jetzt ist die CPU im protected mode
jmp segment_init
;Unterbrechungsbehandlungen
; Die Interruptbehandlung muss in Assembler gestartet werden, um die;; IRQ <irq-num> <error-code?>%macro IRQ 2align 8irq_entry_%1:
;; Den CPU Kontext Sichernpush edxpush ecxpush eax;; Einen Pointer auf den CPU Kontext als zweites Argument pushen
push esp;; Die Interrupt-Nummer ist das erste Argumentpush %1call guardianadd esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmenpop eaxpop ecxpop edxiret
%endmacro
IRQ 0, 0IRQ 1, 0IRQ 2, 0IRQ 3, 0IRQ 4, 0IRQ 5, 0IRQ 6, 0IRQ 7, 0IRQ 8, 1IRQ 9, 0IRQ 10, 1IRQ 11, 1IRQ 12, 1IRQ 13, 1IRQ 14, 1IRQ 15, 0IRQ 16, 0IRQ 17, 1
%assign i 18%rep 238IRQ i, 0%assign i i+1%endrep
[SECTION .data]; 'interrupt descriptor table' mit 256 Eintraegen.align 4idt:%macro idt_entry 1
dw (irq_entry_%1 - startup + MULTIBOOT_START_ADDRESS) & 0xffffdw 0x0008dw 0x8e00
dw ((irq_entry_%1 - startup + MULTIBOOT_START_ADDRESS) & 0xffff0000) >> 16%endmacro
%assign i 0%rep 256idt_entry i%assign i i+1%endrep
idt_desc_global:dw 256*8-1 ; idt enthaelt 256 Eintraegedd idt
[SECTION .bss]
init_stack:resb INIT_STACK_SIZE
; setup_ap, Start der restlichen Prozessoren; Umschaltung in den 'Protected-Mode'
; Dieser Code wird von APICSystem::copySetupAPtoLowMem() reloziert!
[SECTION .setup_ap_seg]
USE16
setup_ap:; Segmentregister initialisieren
mov ax,cs ; Daten- und Codesegment sollenmov ds,ax ; hierher zeigen. Stack brauchen wir hier nicht.
; Unterbrechungen sperrencli
; NMI verbietenmov al, 0x80out 0x70, al
; vorrübergehende GDT setzen
lgdt [ap_gdtd - setup_ap]
; Umschalten in den Protected Modemov eax,cr0 ; Setze PM bit im Kontrollregister 1or eax,1mov cr0,eaxjmp dword 0x08:startup_ap
align 4ap_gdt:
dw 0,0,0,0 ; NULL Deskriptor; Codesegment von 0-4GB
dw 0xFFFF ; 4Gb - (0x100000*0x1000 = 4Gb)dw 0x0000 ; base address=0
dw 0x9A00 ; code read/exec
dw 0x00CF ; granularity=4096, 386 (+5th nibble of limit); Datensegment von 0-4GB
dw 0xFFFF ; 4Gb - (0x100000*0x1000 = 4Gb)dw 0x0000 ; base address=0
dw 0x9200 ; data read/write
dw 0x00CF ; granularity=4096, 386 (+5th nibble of limit)
ap_gdtd:
dw $ - ap_gdt - 1 ; Limitdd 0x40000 + ap_gdt - setup_ap ; Physikalische Adresse der ap_gdt
printfprintf
printf
printfprintf
printf
printf
printfprintf
printfprintf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printfprintf
printfprintfprintf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf printf
![Page 10: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/10.jpg)
; Multiboot-KonstantenMULTIBOOT_PAGE_ALIGN equ 1<<0MULTIBOOT_MEMORY_INFO equ 1<<1MULTIBOOT_HEADER_MAGIC equ 0x1badb002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
MULTIBOOT_HEADER_CHKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)MULTIBOOT_START_ADDRESS equ 0x1000000
INIT_STACK_SIZE equ (1024*4)
; Deskriptoren global machen für realmode.asm
[GLOBAL idt_desc_global]
; Globaler Einsprungspunkt für das System
[GLOBAL startup]
; externe Funktionen und Variablen, die hier benötigt werden
[EXTERN multiboot_addr] ; Adresse der Multiboot Strukturen
[EXTERN guardian] ; Wird zur Interruptbehandlung aufgerufen
[EXTERN ap_stack] ; hier liegt die Adresse des Stacks für den gerade gebooteten AP
[EXTERN kernel_init] ; Wird zur Interruptbehandlung aufgerufen
[EXTERN gdt_desc_global] ; Der "Pointer" zur globalen Deskriptortabelle (machine/gdt.cc)
[SECTION .text]
startup:jmp skip_multiboot_hdr
; multiboot header, auch der Zugriff über das Symbol ist alignedalign 4multiboot_header:
dd MULTIBOOT_HEADER_MAGICdd MULTIBOOT_HEADER_FLAGSdd MULTIBOOT_HEADER_CHKSUM
skip_multiboot_hdr:; Adresse der Multiboot-Strukturen speichern
mov [multiboot_addr], ebx
; Unterbrechungen sperrencli
; NMI verbietenmov al, 0x80out 0x70, al
mov dword [ap_stack], init_stack + INIT_STACK_SIZE
segment_init:; GDT setzen
lgdt [gdt_desc_global]; Unterbrechungsbehandlung sicherstellen
lidt [idt_desc_global]
; Datensegmentregister initialisierenmov ax, 0x10mov ds, axmov es, axmov fs, axmov gs, axmov ss, ax
; cs Segment Register neu ladenjmp 0x8:load_cs
load_cs:
; Stackpointer initialisieren
mov esp, [ap_stack]; Richtung für String-Operationen festlegen
cld
; Wechsel in C/C++call kernel_init
; Startup-Code fuer die APsstartup_ap:; Alle Segmentselektoren neu laden, die zeigen noch auf die ap_gdt; Nach Intel Manual Kapitel 9.9.1 ist das nötig
mov ax, 0x10mov ds, axmov es, axmov fs, axmov gs, axmov ss, ax
; jetzt ist die CPU im protected mode
jmp segment_init
;Unterbrechungsbehandlungen
; Die Interruptbehandlung muss in Assembler gestartet werden, um die;; IRQ <irq-num> <error-code?>%macro IRQ 2align 8irq_entry_%1:
;; Den CPU Kontext Sichernpush edxpush ecxpush eax;; Einen Pointer auf den CPU Kontext als zweites Argument pushen
push esp;; Die Interrupt-Nummer ist das erste Argumentpush %1call guardianadd esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmenpop eaxpop ecxpop edxiret
%endmacro
IRQ 0, 0IRQ 1, 0IRQ 2, 0IRQ 3, 0IRQ 4, 0IRQ 5, 0IRQ 6, 0IRQ 7, 0IRQ 8, 1IRQ 9, 0IRQ 10, 1IRQ 11, 1IRQ 12, 1IRQ 13, 1IRQ 14, 1IRQ 15, 0IRQ 16, 0IRQ 17, 1
%assign i 18%rep 238IRQ i, 0%assign i i+1%endrep
[SECTION .data]; 'interrupt descriptor table' mit 256 Eintraegen.align 4idt:%macro idt_entry 1
dw (irq_entry_%1 - startup + MULTIBOOT_START_ADDRESS) & 0xffffdw 0x0008dw 0x8e00
dw ((irq_entry_%1 - startup + MULTIBOOT_START_ADDRESS) & 0xffff0000) >> 16%endmacro
%assign i 0%rep 256idt_entry i%assign i i+1%endrep
idt_desc_global:dw 256*8-1 ; idt enthaelt 256 Eintraegedd idt
[SECTION .bss]
init_stack:resb INIT_STACK_SIZE
; setup_ap, Start der restlichen Prozessoren; Umschaltung in den 'Protected-Mode'
; Dieser Code wird von APICSystem::copySetupAPtoLowMem() reloziert!
[SECTION .setup_ap_seg]
USE16
setup_ap:; Segmentregister initialisieren
mov ax,cs ; Daten- und Codesegment sollenmov ds,ax ; hierher zeigen. Stack brauchen wir hier nicht.
; Unterbrechungen sperrencli
; NMI verbietenmov al, 0x80out 0x70, al
; vorrübergehende GDT setzen
lgdt [ap_gdtd - setup_ap]
; Umschalten in den Protected Modemov eax,cr0 ; Setze PM bit im Kontrollregister 1or eax,1mov cr0,eaxjmp dword 0x08:startup_ap
align 4ap_gdt:
dw 0,0,0,0 ; NULL Deskriptor; Codesegment von 0-4GB
dw 0xFFFF ; 4Gb - (0x100000*0x1000 = 4Gb)dw 0x0000 ; base address=0
dw 0x9A00 ; code read/exec
dw 0x00CF ; granularity=4096, 386 (+5th nibble of limit); Datensegment von 0-4GB
dw 0xFFFF ; 4Gb - (0x100000*0x1000 = 4Gb)dw 0x0000 ; base address=0
dw 0x9200 ; data read/write
dw 0x00CF ; granularity=4096, 386 (+5th nibble of limit)
ap_gdtd:
dw $ - ap_gdt - 1 ; Limitdd 0x40000 + ap_gdt - setup_ap ; Physikalische Adresse der ap_gdt
printf
printf
printf
printfprintf
printf
printf
printfprintf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printf
printfprintfprintf
printfprintfprintf
printf
printf
printf
printfprintf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf printf
printfprintf
printf
printf
printfprintf
printfprintfprintf
printf
printfprintfprintf
printf
printfprintfprintfprintf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printfprintf
printf
printf
printfprintf
printfprintf
printf
printf
printfprintf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf
![Page 11: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/11.jpg)
; Multiboot-KonstantenMULTIBOOT_PAGE_ALIGN equ 1<<0MULTIBOOT_MEMORY_INFO equ 1<<1MULTIBOOT_HEADER_MAGIC equ 0x1badb002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
MULTIBOOT_HEADER_CHKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)MULTIBOOT_START_ADDRESS equ 0x1000000
INIT_STACK_SIZE equ (1024*4)
; Deskriptoren global machen für realmode.asm
[GLOBAL idt_desc_global]
; Globaler Einsprungspunkt für das System
[GLOBAL startup]
; externe Funktionen und Variablen, die hier benötigt werden
[EXTERN multiboot_addr] ; Adresse der Multiboot Strukturen
[EXTERN guardian] ; Wird zur Interruptbehandlung aufgerufen
[EXTERN ap_stack] ; hier liegt die Adresse des Stacks für den gerade gebooteten AP
[EXTERN kernel_init] ; Wird zur Interruptbehandlung aufgerufen
[EXTERN gdt_desc_global] ; Der "Pointer" zur globalen Deskriptortabelle (machine/gdt.cc)
[SECTION .text]
startup:jmp skip_multiboot_hdr
; multiboot header, auch der Zugriff über das Symbol ist alignedalign 4multiboot_header:
dd MULTIBOOT_HEADER_MAGICdd MULTIBOOT_HEADER_FLAGSdd MULTIBOOT_HEADER_CHKSUM
skip_multiboot_hdr:; Adresse der Multiboot-Strukturen speichern
mov [multiboot_addr], ebx
; Unterbrechungen sperrencli
; NMI verbietenmov al, 0x80out 0x70, al
mov dword [ap_stack], init_stack + INIT_STACK_SIZE
segment_init:; GDT setzen
lgdt [gdt_desc_global]; Unterbrechungsbehandlung sicherstellen
lidt [idt_desc_global]
; Datensegmentregister initialisierenmov ax, 0x10mov ds, axmov es, axmov fs, axmov gs, axmov ss, ax
; cs Segment Register neu ladenjmp 0x8:load_cs
load_cs:
; Stackpointer initialisieren
mov esp, [ap_stack]; Richtung für String-Operationen festlegen
cld
; Wechsel in C/C++call kernel_init
; Startup-Code fuer die APsstartup_ap:; Alle Segmentselektoren neu laden, die zeigen noch auf die ap_gdt; Nach Intel Manual Kapitel 9.9.1 ist das nötig
mov ax, 0x10mov ds, axmov es, axmov fs, axmov gs, axmov ss, ax
; jetzt ist die CPU im protected mode
jmp segment_init
;Unterbrechungsbehandlungen
; Die Interruptbehandlung muss in Assembler gestartet werden, um die;; IRQ <irq-num> <error-code?>%macro IRQ 2align 8irq_entry_%1:
;; Den CPU Kontext Sichernpush edxpush ecxpush eax;; Einen Pointer auf den CPU Kontext als zweites Argument pushen
push esp;; Die Interrupt-Nummer ist das erste Argumentpush %1call guardianadd esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmenpop eaxpop ecxpop edxiret
%endmacro
IRQ 0, 0IRQ 1, 0IRQ 2, 0IRQ 3, 0IRQ 4, 0IRQ 5, 0IRQ 6, 0IRQ 7, 0IRQ 8, 1IRQ 9, 0IRQ 10, 1IRQ 11, 1IRQ 12, 1IRQ 13, 1IRQ 14, 1IRQ 15, 0IRQ 16, 0IRQ 17, 1
%assign i 18%rep 238IRQ i, 0%assign i i+1%endrep
[SECTION .data]; 'interrupt descriptor table' mit 256 Eintraegen.align 4idt:%macro idt_entry 1
dw (irq_entry_%1 - startup + MULTIBOOT_START_ADDRESS) & 0xffffdw 0x0008dw 0x8e00
dw ((irq_entry_%1 - startup + MULTIBOOT_START_ADDRESS) & 0xffff0000) >> 16%endmacro
%assign i 0%rep 256idt_entry i%assign i i+1%endrep
idt_desc_global:dw 256*8-1 ; idt enthaelt 256 Eintraegedd idt
[SECTION .bss]
init_stack:resb INIT_STACK_SIZE
; setup_ap, Start der restlichen Prozessoren; Umschaltung in den 'Protected-Mode'
; Dieser Code wird von APICSystem::copySetupAPtoLowMem() reloziert!
[SECTION .setup_ap_seg]
USE16
setup_ap:; Segmentregister initialisieren
mov ax,cs ; Daten- und Codesegment sollenmov ds,ax ; hierher zeigen. Stack brauchen wir hier nicht.
; Unterbrechungen sperrencli
; NMI verbietenmov al, 0x80out 0x70, al
; vorrübergehende GDT setzen
lgdt [ap_gdtd - setup_ap]
; Umschalten in den Protected Modemov eax,cr0 ; Setze PM bit im Kontrollregister 1or eax,1mov cr0,eaxjmp dword 0x08:startup_ap
align 4ap_gdt:
dw 0,0,0,0 ; NULL Deskriptor; Codesegment von 0-4GB
dw 0xFFFF ; 4Gb - (0x100000*0x1000 = 4Gb)dw 0x0000 ; base address=0
dw 0x9A00 ; code read/exec
dw 0x00CF ; granularity=4096, 386 (+5th nibble of limit); Datensegment von 0-4GB
dw 0xFFFF ; 4Gb - (0x100000*0x1000 = 4Gb)dw 0x0000 ; base address=0
dw 0x9200 ; data read/write
dw 0x00CF ; granularity=4096, 386 (+5th nibble of limit)
ap_gdtd:
dw $ - ap_gdt - 1 ; Limitdd 0x40000 + ap_gdt - setup_ap ; Physikalische Adresse der ap_gdt
printf
printf
printfprintfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printfprintf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printf
printf
printf
printf
printf
printfprintf
printf
printf printfprintfprintf printfprintf
printfprintf
printfprintf
printf
printfprintf
printf
printfprintf
printf
printfprintf
printf
printf
printf
printf
printf
printfprintf
printfprintf
printf
printf
printf
printf
printf
printf
printfprintf
printfprintfprintf
printf
printfprintf
printf
printf
printf
printfprintf
printf
printf
printf
printf printf
printf
printf
printfprintf
printf
![Page 12: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/12.jpg)
Entkäfern mit GDB & GEF
GNU Debugger (GDB)+ Inspizieren des Systemzustands während das System läuft- Nur rudimentäres TUI
GDB Enhanced Features (GEF)+ Erweitert GDB um ein brauchbar(er)es Interface
![Page 13: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/13.jpg)
Entkäfern mit GDB & GEF
GNU Debugger (GDB)+ Inspizieren des Systemzustands während das System läuft- Nur rudimentäres TUI
GDB Enhanced Features (GEF)+ Erweitert GDB um ein brauchbar(er)es Interface
![Page 14: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/14.jpg)
Registerinhalt
![Page 15: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/15.jpg)
Registerinhalt
Stackinhalt
![Page 16: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/16.jpg)
Registerinhalt
Stackinhalt
Stelle im Assembly
![Page 17: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/17.jpg)
Registerinhalt
Stackinhalt
Stelle im Assembly
Stelle in C/C++
![Page 18: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/18.jpg)
Registerinhalt
Stackinhalt
Stelle im Assembly
Stelle in C/C++
Threads
![Page 19: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/19.jpg)
Registerinhalt
Stackinhalt
Stelle im Assembly
Stelle in C/C++
Threads
Backtrace
![Page 20: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/20.jpg)
Registerinhalt
Stackinhalt
Stelle im Assembly
Stelle in C/C++
Threads
Backtrace
Eingabezeile
![Page 21: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/21.jpg)
Breakpoints: (gdb) break <location>
BreakpointsUnterbrechen der Ausführung, sobald eine bestimmte Codestelleerreicht wird.
Funktionsnameabsolute/relative Codezeile
}
optionaler Prefix: Quelldatei
*Adresse
(gdb) b guardian(gdb) b guardian.cc:guardian(gdb) b 18(gdb) b guardian.cc:18(gdb) b +3(gdb) b *0x100580e
Funktion guardian... aus guardian.ccZeile 18 in aktueller DateiZeile 18 in guardian.ccIn 3 ZeilenAn Adresse 0x100580e
Unterbricht vor dem Ausführen von...
![Page 22: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/22.jpg)
Temporäre & Bedingte Breakpoints
Temporäre Breakpoints: (gdb) tbreak <location>Werden nach dem 1. Auslösen entfernt, sonst wie „normale“Breakpoints.
Bedingte Breakpoints: (gdb) break <location> if <cond>Unterbrechung nur falls Bedingung erfüllt ist, z.B:
(gdb) break guardian if vector == 33
Unterbricht nur, falls guardian aufgrund von Tastatureingabe betretenwurde.
!Achtung: Nichttriviale Break- oder Watchpoints werden ohneHardwareunterstützung umgesetzt Langsam!
![Page 23: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/23.jpg)
Temporäre & Bedingte Breakpoints
Temporäre Breakpoints: (gdb) tbreak <location>Werden nach dem 1. Auslösen entfernt, sonst wie „normale“Breakpoints.
Bedingte Breakpoints: (gdb) break <location> if <cond>Unterbrechung nur falls Bedingung erfüllt ist, z.B:
(gdb) break guardian if vector == 33
Unterbricht nur, falls guardian aufgrund von Tastatureingabe betretenwurde.
!Achtung: Nichttriviale Break- oder Watchpoints werden ohneHardwareunterstützung umgesetzt Langsam!
![Page 24: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/24.jpg)
Temporäre & Bedingte Breakpoints
Temporäre Breakpoints: (gdb) tbreak <location>Werden nach dem 1. Auslösen entfernt, sonst wie „normale“Breakpoints.
Bedingte Breakpoints: (gdb) break <location> if <cond>Unterbrechung nur falls Bedingung erfüllt ist, z.B:
(gdb) break guardian if vector == 33
Unterbricht nur, falls guardian aufgrund von Tastatureingabe betretenwurde.
△!Achtung: Nichttriviale Break- oder Watchpoints werden ohneHardwareunterstützung umgesetzt→ Langsam!
![Page 25: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/25.jpg)
Watchpoints (Data Breakpoints)
Unterbricht wenn Speicherbereich geschrieben (oder gelesen) wird:watch <location> Schreibzugriffrwatch <location> Lesezugriffawatch <location> Schreib- oder Lesezugriff
(gdb) watch guard(gdb) watch guard if guard.locked == 1
![Page 26: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/26.jpg)
Verwalten von Break-/Watchpoints
ignore <id> <N> Breakpoint N mal ignorierenenable <id> <id> .. Breakpoints aktivierendisable <id> <id> .. Breakpoints deaktivierendelete <id> <id> .. Breakpoints löschen
![Page 27: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/27.jpg)
Schrittweise Ausführung
step count – Nächste Zeilestepi count – Nächste Instruktionnext count – Nächste Zeile (ohne Funktionen zu betreten)nexti count – Nächste Instruktion (ohne Funktionen zu betreten)until count – Wiederhole next bis zur textuell nächsten Zeile
Optional: Anzahl Wiederholungen
finish – Bis zum return des aktuellen Stackframesadvance <location> – Bis zu <location>continue – Ausführung (bis zum nächsten Breakpoint) fortsetzen
![Page 28: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/28.jpg)
Der skip Befehl
unsigned int numCPUs = System::getNumberOfCPUs();kout << "numCPUs: " << numCPUs << endl;ApplicationProcessor::boot();
Übergehe eine einzelne Funktion:(gdb) skip Guard::enter
Übergehe alle Funktionen aus einer Datei:(gdb) skip file object/o_stream.cc
![Page 29: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/29.jpg)
Der skip Befehl
unsigned int numCPUs = System::getNumberOfCPUs();kout << "numCPUs: " << numCPUs << endl;ApplicationProcessor::boot();
Übergehe eine einzelne Funktion:(gdb) skip Guard::enter
Übergehe alle Funktionen aus einer Datei:(gdb) skip file object/o_stream.cc
![Page 30: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/30.jpg)
Der info Befehl
info locals Auflistung aller lokalen Variableninfo registers Auflistung der Registerwerteinfo breakpoints Auflistung der Breakpointsinfo threads Auflistung der Threadsinfo skip Auflistung der übersprungenen Funktionen… siehe (gdb) info
![Page 31: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/31.jpg)
Ausgabe von Werten in Speicher / Register
(gdb) print/<Format> <Ausdruck>(gdb) x/<Anzahl><Format> <Ausdruck>
Werte für <Format>x Ganzzahl (hex)d Ganzzahl (mit VZ, dezimal)u Ganzzahl (ohne VZ, dezimal)t Ganzzahl (binär) (two)
a Adresse (hex) +Offset zum Startsymbol
f Floati Instruktion
Bestimmen des Typs eines Symbolsptype <Symbol>
![Page 32: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/32.jpg)
Verändern des Zielsystems: (gdb) set
Verändern eines Registers
(gdb) set $esp = 0xdeadbeef
Verändern einer Variable / Speicherbereichs
(gdb) set numCPUs = 2(gdb) set *((int *) 0x1013fdc) = 42
![Page 33: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/33.jpg)
GDB vs. Optimierungen
Generell: Optimierungen sind doof fürs Debuggen:
Inlining von FunktionenElimination von Variablen…
Relevante Compileroptionen-g Generiere Debuginformationen
-O0 Optimierungen aus-Og Nur Optimierungen, die das Debuggen nicht stören
-O2 Fast alle Optimierungen
![Page 34: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/34.jpg)
GDB vs. Optimierungen
Generell: Optimierungen sind doof fürs Debuggen:
Inlining von FunktionenElimination von Variablen…
Relevante Compileroptionen-g Generiere Debuginformationen
-O0 Optimierungen aus-Og Nur Optimierungen, die das Debuggen nicht stören-O2 Fast alle Optimierungen
![Page 35: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/35.jpg)
GDB & GEF in BS
Die bittere Wahrheit...Ihr werdet entkäfern müssen
Anlegen einer eigenen .gdbinit:cp /proj/i4bs/tools/gdbinit ~/.gdbinitmake qemu-gdb-nooptProfit?make qemu-gdb
![Page 36: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/36.jpg)
GDB & GEF in BS
Die bittere Wahrheit...Ihr werdet entkäfern müssen
Anlegen einer eigenen .gdbinit:cp /proj/i4bs/tools/gdbinit ~/.gdbinitmake qemu-gdb-noopt
→ Profit?make qemu-gdb
![Page 37: Übung zu Betriebssysteme - Entkäfern mit GDB & GEF · add esp, 8 ; CPU Kontext und IRQ-Nummer vom Stack nehmen pop eax pop ecx pop edx iret %endmacro IRQ 0, 0 IRQ 1, 0 IRQ 2, 0](https://reader035.vdokument.com/reader035/viewer/2022062508/605ef972e7f7ba06f54bd023/html5/thumbnails/37.jpg)
Fragen?