Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - nico

Seiten: [1]
1
Lowlevel-Coding / Re: Multitasking #2
« am: 09. June 2008, 16:45 »
naja nach intel doku, sind die ersten 2 bits eines segment selectors RPL und das 3. bit der table indicator (GDT=0,LDT=1). also müssten die selectoren passen, wenn man man für user_* noch bit 0&1 setzt.
2
Lowlevel-Coding / Multitasking #2
« am: 09. June 2008, 14:28 »
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:

%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
[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
3
Lowlevel-Coding / Re: Paging
« am: 08. June 2008, 10:04 »
guter hinweis. ich habe den fehlercode vom int 14 nicht vom stack genommen; jetzt funktioniert es ;-)

bg nico
4
Lowlevel-Coding / Paging
« am: 07. June 2008, 22:01 »
hi,

ich habe (glaube ich) eine kleines problem beim paging. ich habe folgenden code:

%define PAGE_SIZE 4096
%define PAGE_DIR_ENTRIES  1024
%define PAGE_TABLE_ENTRIES  1024

[section .text]

setup_paging:
  pusha

  ; setup page table
  mov eax,0x03; address
  xor ecx,ecx ; count
.loop1:
  mov [page_table+4*ecx],eax
  add eax,PAGE_SIZE
  inc ecx
  cmp ecx,PAGE_TABLE_ENTRIES
  jl .loop1

  ; setup page dir
  mov eax,page_table
  or eax,0x02
  xor ecx,ecx
.loop2
  mov [page_dir+4*ecx],eax
  inc ecx
  cmp ecx,PAGE_DIR_ENTRIES
  jl .loop2

  or eax,0x03
  mov [page_dir],eax
  mov [page_dir+4],eax
  mov [page_dir+8],eax
  mov [page_dir+12],eax

  ; enable pageing
  mov eax,page_dir
  mov cr3,eax
  mov eax,cr0
  or eax,0x80000000
  mov cr0,eax

  popa
  ret

[section .bss]
  align 4096
page_dir: resd  1024
  align 4096
page_table: resd  1024

wenn ich jetzt auf den auf die 4 page_dir eintraege zugreife, funktioniert das. aber beim 5. eintrag (present=0) bekomme wie erwartet eine page fault exception und danach gleich eine gerneral protection exception (die ich mir nicht wirklich erklären kann). hat jemand eine idee woran das liegen kann?
5
Lowlevel-Coding / Re: Global Descriptor Table
« am: 24. May 2008, 14:36 »
oha, da hab ich mich aber derbe vertan. jetzt funktioniert es. außerdem habe ich das
align-statement sowie die padbytes entfernt.

besten dank
nico
6
Lowlevel-Coding / Re: Global Descriptor Table
« am: 24. May 2008, 11:28 »
hab das mal abgeändert (hat aber nicht funktioniert):
Zitat
gdt_ptr:
  .limit  dw gdt_end-gdt-1
  .base   dd gdt

da er offentsichtlich die gdt falsch lädt, hier nochmal meine ld.conf
Zitat
ENTRY(start)

SECTIONS {
  .text 0x00100000 : {
    Kernel_Base = .;
    *(.text)
  }

  .data : {
    *(.data)
  }

  .bss : {
    *(.bss)
  }
  Kernel_End = .;
}

soweit wie ich das verstanden habe, wird nach dem linken das textsegment bei 0x00100000 beginnen. da ich aber im code kein org... drin habe rechnet der assembler mit 0 als basis und addiert darauf die offset's (?). wenn ich den code mit nasm -felf ... assembliere und nen org... drin hab meckert der rum. für grub muss aber das format elf und nicht bin sein (?!?).
7
Lowlevel-Coding / Re: Global Descriptor Table
« am: 23. May 2008, 22:25 »
ich irgendwie nicht wirklich weitergekommen. habe jetzt folgendes programm:

boot.asm
Zitat
[bits 32]

[global start]
[section .text]

mboot_header:
  align 4
  dd 0x1BADB002 ; mboot magic number
  dd 0x00000005 ; mboot flags
  dd 0xe4524ff9 ; mboot checksum

_start:
start:
  cli

  mov edx,eax
  mov edi,0xB8000
  mov ah,0x0F
  mov al,0x00
  mov ecx,(80*25)
  rep stosw

  lgdt [gdt_ptr]

  mov bx,0x38
  mov ds,bx
  mov es,bx
  mov fs,ax
  mov gs,ax

  jmp 0x48:_loop

_halt:
  hlt

_loop:
  jmp _loop

%include "gdt.asm"

gdt.asm

Zitat
[bits 32]

[section .data]
  align 4, db 0

gdt_ptr:
  .limit dw (gdt_end-gdt-1)
  .base dd 0x00000000

gdt:
  align 4
  null_desc dw  0x0000,0x0000,0x0000,0x0000
  user_code dw  0xFFFF,0x0000,0xFA00,0x00CF
  user_data dw  0xFFFF,0x0000,0xF200,0x00CF
  kern_code dw  0xFFFF,0x0000,0x9A00,0x00CF
  kern_data dw  0xFFFF,0x0000,0x9200,0x00CF
gdt_end:

bochs beendet das programm mit folgenden status:

Zitat
...
00069269588i[CPU0 ] protected mode
00069269588i[CPU0 ] CS.d_b = 32 bit
00069269588i[CPU0 ] SS.d_b = 32 bit
00069269588i[CPU0 ] | EAX=2bad0f00  EBX=00020028  ECX=00000000  EDX=2badb002
00069269588i[CPU0 ] | ESP=00067efc  EBP=00067f1c  ESI=00020e74  EDI=000b8fa0
00069269588i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf ZF af PF cf
00069269588i[CPU0 ] | SEG selector     base    limit G D
00069269588i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00069269588i[CPU0 ] |  CS:0008( 0001| 0|  0) 00000000 000fffff 1 1
00069269588i[CPU0 ] |  DS:0028( 0005| 0|  0) f053f000 0000ff53 0 0
00069269588i[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00069269588i[CPU0 ] |  ES:0028( 0005| 0|  0) f053f000 0000ff53 0 0
00069269588i[CPU0 ] |  FS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00069269588i[CPU0 ] |  GS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00069269588i[CPU0 ] | EIP=01000044 (01000044)
00069269588i[CPU0 ] | CR0=0x00000011 CR1=0 CR2=0x00000000
00069269588i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00069269588i[CPU0 ] >> mov fs, ax : 8EE0
00069269588e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
00069269588i[SYS  ] bx_pc_system_c::Reset(SOFTWARE) called
00069269588i[APIC0] local apic in CPU 0 initializing
00069269588e[CPU0 ] CPU_LOOP bx_guard.interrupt_requested=1
Next at t=69269588
(0) [0x01000044] 0008:1000044 (unk. ctxt): mov fs, ax                ; 8ee0
<bochs:2> q
00069269588i[     ] dbg: Quit
00069269588i[CPU0 ] real mode
00069269588i[CPU0 ] CS.d_b = 16 bit
00069269588i[CPU0 ] SS.d_b = 16 bit
00069269588i[CPU0 ] | EAX=00000000  EBX=00000000  ECX=00000000  EDX=00000f00
00069269588i[CPU0 ] | ESP=00000000  EBP=00000000  ESI=00000000  EDI=00000000
00069269588i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf zf af pf cf
00069269588i[CPU0 ] | SEG selector     base    limit G D
00069269588i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00069269588i[CPU0 ] |  CS:f000( 1e00| 0|  0) ffff0000 0000ffff 0 0
00069269588i[CPU0 ] |  DS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00069269588i[CPU0 ] |  SS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00069269588i[CPU0 ] |  ES:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00069269588i[CPU0 ] |  FS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00069269588i[CPU0 ] |  GS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00069269588i[CPU0 ] | EIP=0000fff0 (0000fff0)
00069269588i[CPU0 ] | CR0=0x00000010 CR1=0 CR2=0x00000000
00069269588i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00069269588i[CPU0 ] >> jmp far f000:e05b : EA5BE000F0
00069269588i[SYS  ] Last time is 1211581172
00069269588i[XGUI ] Exit.
00069269588i[CTRL ] quit_sim called with exit code 0

offensichtlich hat es nicht geklappt. sieht jmd vielleicht den fehler? noch eine frage zu den segement deskriptoren in der gdt. ich habe das auch im pm tutorial gesehen: warum fängt man mit den LSB im deskriptor an? somit liegt der deskriptor doch "falschherum" im speicher?
8
Lowlevel-Coding / Re: Global Descriptor Table
« am: 11. April 2008, 00:15 »
noch ne kurze frage, woher weiß ich ob meine gdt richtig initialisiert ist, also ob alles geklappt hat? ich hab jetzt 3 segmente eingerichtet und nach der segmentregisteraktualisierung springe ich in eine endlosschleife. das funktioniert soweit, also bochs meckert nicht rum. ich hab mal testweise die base-adressen der deskriptoren verändert und da kommt auch kein fehler.
9
Lowlevel-Coding / Re: Global Descriptor Table
« am: 10. April 2008, 18:49 »
gut. also initialisiere ich die gdt mit 9 deskriptoren und nach laden der gdt update ich die segmentregister und mache einen jump zum kernel label.
10
Lowlevel-Coding / Re: Global Descriptor Table
« am: 10. April 2008, 18:28 »
danke für die antwort. ich hätte dazu auch gleich noch eine frage, ich habe in einigen
referenzprojekten gesehen, dass für die einzelnen level(0...3) jeweils ein code und datensegment mit basis 0B und limit 4GB angelegt wurde. was hat das für einen sinn, dass sich die segemente überlagern?

bg nico
11
Lowlevel-Coding / Global Descriptor Table
« am: 10. April 2008, 16:57 »
Hi,

ich habe ein kleines Verständnisproblem worum es sich genau bei der GDT handelt.
Soweit ich das Verstanden habe, kann mit in der GDT Segment Desktiptoren für
(beliebige) Hauptspeicherbereiche ablegen, die verschiedene Eigenschaften haben (r/w, daten, code, etc...). Wenn mein kernel vom Grub geladen wird, befindet sich
das Programm ja schon im protected mode und hat auch schon eine GDT eingerichtet.
Also sind die Segmentregister auch schon richtig eingestellt? Bzw. wie wurde diese eingestellt?

Wenn die GDT nun überschrieben wird, woher weiß ich ob mein aktueller Code/Daten (Kernel) auch in diesem Segment liegt?

bg nico
12
Lowlevel-Coding / Re: linux mal wieder....
« am: 09. April 2008, 15:46 »
so jetzt läuft's ;-) hab den code in assembler geschrieben.
13
Lowlevel-Coding / Re: linux mal wieder....
« am: 06. April 2008, 16:17 »
jo so ist es. wenn ich das richtig verstanden habe, kann man im protected mode erstmal nur graka-ausgaben über die adresse des videospeichers machen (das wäre der punkt, wo ich versuche hinzukommen :-)) es wäre nett,
wenn mir vllt. jemand einen ansatz geben könnte, wie ich weitermachen müsste und was alles initialisiert werden müsste. Der Unterschied zum "C Kernel mit Grub" Tutorial wäre, dass ich halt den Kernel in ASM proggen möchte.

Vielen Dank für die schnellen Antworten
bg nico
14
Lowlevel-Coding / Re: linux mal wieder....
« am: 06. April 2008, 14:36 »
ich hab jz erstmal den tipp mit grub versucht, das funktioniert auch soweit, dass (glaub ich) der kernel gebootet wird. es wird aber dann gleich ein reset durchgeführt. es gibt schon einen ähnlichen thread, der mir aber nicht weiterhelfen konnte. Ich poste hier einfach mal den code (den hab ich teils aus dem tutorial und dem thread):

[Bits 32]

global _start

_mbh:
  dd 0x1BADB002
  dd 0x00010000
  dd 0xE4514FFE
  dd 0x00100000 + _mbh ; physische Adresse an die die Multiboot Header geladen werden soll
  dd 0x00100000 ; physische Adresse an die geladen wird, physisch 1MB
  dd 0x00100000 + _end ; physische Adresse des Endes des Code & Datenteils
  dd 0x00100000 + _end ; physische Adresse des Endes des BSS-Teils (momentan überhaupt kein BSS teil)
  dd 0x00100000 + _start ; Entry-Point

_start:
  mov ax,0x1000
  mov ds,ax
  mov es,ax
  mov si,msg
  call putstr
_stop:
  jmp _stop
_end:

msg db  "welcome..",13,10,0

putstr:
  loadsb
  or al,al
  jz short putstrd
  mov ah,0x0E
  mov bx,0x0007
  int 0x10
  jmp putstr
putstrd:
  retn

nachdem ich im grub boot eintippen, wird gleich ein reboot ausgeführt. wäre schön, wenn mir jemand helfen oder nen tipp geben könnte.

bg nico
15
Lowlevel-Coding / Re: linux mal wieder....
« am: 05. April 2008, 00:22 »
das booten funktioniert schon, ich hab das erst von einem usbstick probiert und dann von platte, da es vom usbstick doch etwas lange gedauert hat. es scheint so, dass der bootloader funktioniert, er dann aber den kernel nicht findet o.ä.

da auf den rechner sowieso ein grub läuft werd ich mir das nochma anschaun.

danke für die schnelle antwort,
bg nico

PS: zum zeilenumbruch: mein terminal hat 80 zeichen pro zeile ;-)
16
Lowlevel-Coding / linux mal wieder....
« am: 04. April 2008, 20:14 »
hi,

ich hab mich mal rangesetzt die ausgabe 1 durchzuarbeiten, leider aber mit
mäßigen erfolg :-(. folgendes habe ich gemacht: die zwei files boot.asm und
kernel.asm kopiert und assembliert. mit cat boot.bin kernel.bin > os.img zu-
sammengefuegt und mit dd if=os.img of=/dev/sda (externe usb festplatte)
geschrieben. nun bootet es leider nicht bzw. sehe ich nur eine blinkenden
cursor (kann also sein, dass der kernel nicht gefunden wird). ich habe das
forum nach dem fehler schon durchsucht und gefunden, dass man mal aus-
probieren sollte, den kernel auch auf eine 512-fache datei zu padden. hat
leider auch nicht funktioniert. hat jemand eine idee?

bg nico

update:

ich hab das ganze jz mal mit bochs probiert und da funktioniert alles super.
vielleicht liegt das an der externen platte?
Seiten: [1]

Einloggen