Hi,
da es sich um ein anderes problem handelt, als im vorherigen thread, mache ich mal einen neuen auf. ich habe folgendes problem (bestimmt aufgrund von einigen missverständnissen beim multitasking). aber vllt erstmal der code:
gdt.asm:
boot.asm
das ziel ist folgendes: ich möchte gerne einen ring0 task starten der einfach nur eine testzeichenkette ausgiebt. noch etwas unklar ist mir wie ich eigendlich zu diesen task springe. in der intel doku steht, dass ein einfacher jump ausreicht. ich habe in einigen referenzimplementationen gesehen, dass ein far jump zum TASK_SELECTOR:0 ausgeführt wird. reicht das aus? denn wenn ich das so machen, wie oben (siehe:
) bekomme ich eine gp-exception und bochs endet mit "jump_protected: gate type 11 unsupported".
sieht vllt jemand den fehler?
besten dank im voraus,
bg nico
da es sich um ein anderes problem handelt, als im vorherigen thread, mache ich mal einen neuen auf. ich habe folgendes problem (bestimmt aufgrund von einigen missverständnissen beim multitasking). aber vllt erstmal der code:
gdt.asm:
Code: [Auswählen]
%define USER_CODE_SEL 0x0B
%define USER_DATA_SEL 0x13
%define KERN_CODE_SEL 0x18
%define KERN_DATA_SEL 0x20
[extern tss]
[section .text]
setup_gdt:
pusha
mov eax,tss
mov [sys_tss+2],ax
shr eax,16
mov [sys_tss+4],al
mov [sys_tss+7],ah
; load gdt_ptr into gdt register
lgdt [gdt_ptr]
; update segment registers
mov ax,KERN_DATA_SEL
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
; far jump to update code segment
jmp KERN_CODE_SEL:.return
.return:
popa
ret
[section .data]
gdt_ptr:
.limit dw gdt_end-gdt-1
.base dd gdt
gdt:
; gdt null descriptor
null_desc dw 0x0000,0x0000,0x0000,0x0000
; user code descriptor, ring 0
user_code dw 0xFFFF,0x0000,0xFA00,0x00CF
; user data descriptor, ring 0
user_data dw 0xFFFF,0x0000,0xF200,0x00CF
; kernel code descriptor, ring 3
kern_code dw 0xFFFF,0x0000,0x9A00,0x00CF
; kernel data descriptor, ring 3, sel 0x20
kern_data dw 0xFFFF,0x0000,0x9200,0x00CF
; sys_tss
sys_tss dw 0x0067,0x0000,0x8900,0x0000
gdt_end:boot.asm
Code: [Auswählen]
[section .text]
mboot:
align 4
dd MBOOT_MAGIC
dd MBOOT_FLAGS
dd MBOOT_CKSUM
[global start]
start:
cli
; stack
mov esp,stack_end
; clear the screen
call screen_clear
call setup_gdt ; gdt
call setup_idt ; idt
mov [tss.esp0],dword esp
mov [tss.esp],dword task_stack_start
mov [tss.eip],dword foo
mov ax,0x28
ltr ax
jmp 0x28:0 ; ???
foo:
mov esi,bar
call screen_puts
mov ecx,0xFFFFFF
loop $
jmp foo
.nothing:
jmp .nothing
[section .data]
bar: db 'bar...',0x0A,0x0
[global tss]
tss:
.link dd 0
.esp0 dd 0
.ss0 dw KERN_DATA_SEL,0
.esp1 dd 0
.ss1 dd 0
.esp2 dd 0
.ss2 dd 0
.cr3 dd 0
.eip dd 0
.eflags dd 0
.eax dd 0
.ecx dd 0
.edx dd 0
.ebx dd 0
.esp dd 0
.ebp dd 0
.esi dd 0
.edi dd 0
.es dd 0
.cs dd 0
.ss dw USER_DATA_SEL,0
.ds dd 0
.fs dd 0
.gs dd 0
.ldt dd 0
.map dd 0
tss_end:
[section .bss]
task_stack_start: resb STACK_SIZE
tast_stack_end:
stack_start: resb STACK_SIZE
stack_end:das ziel ist folgendes: ich möchte gerne einen ring0 task starten der einfach nur eine testzeichenkette ausgiebt. noch etwas unklar ist mir wie ich eigendlich zu diesen task springe. in der intel doku steht, dass ein einfacher jump ausreicht. ich habe in einigen referenzimplementationen gesehen, dass ein far jump zum TASK_SELECTOR:0 ausgeführt wird. reicht das aus? denn wenn ich das so machen, wie oben (siehe:
) bekomme ich eine gp-exception und bochs endet mit "jump_protected: gate type 11 unsupported".sieht vllt jemand den fehler?
besten dank im voraus,
bg nico

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert
