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.


Themen - sebi2020

Seiten: [1] 2
1
Lowlevel-Coding / Paging
« am: 13. October 2011, 11:23 »
Sorry, hab ausversehen das Thema gelöscht (das kommt davon wenn ich unbedingt mit Lynx surfen muss :P)
Jetzt versteh ich auch was du meinst. Ja, die funktion war jetzt erstmal auch nur bis vorm Paging ausgelegt. Weil ich da irgendwie ein Problem sehe.
Ich brauche physischen Speicher für ne neue PageTable, kann sie aber nur über eine virtuelle Ansprechen. Ja, aber ich habe doch gar kein Mapping für die physikalische Adresse der PageTable, also wie soll ich sie ansprechen?
2
Lowlevel-Coding / TSS aus Tutorial Multitasking
« am: 29. June 2011, 09:14 »
Ich weis, Köpft mich, wenn ich dafür jetzt ein extra Thread aufmache (könnt ihn ja wieder löschen)... aber eine Sache würde mich zum Multitasking Tutorial noch intressieren.

Dort steht irgendwo:
.esp0 = (new_cpu +1)
Der Stack wächst doch nach unten, oder? und ein pop erhöht doch die adresse, oder? Wenn dem so ist, warum dann + 1.  Ich dachte die CPU möchte den Zustand vielleicht auch noch mal vom Stack holen. Aber gerade mit diesem Plus 1 würde das doch verhindert, oder? oO

Oder geht es darum, den Taskzustand auf den Stack zu schieben? bzw ihn in new_cpu abzuspeichern... ?
3
Lowlevel-Coding / IPC - Implementierungsansätze
« am: 28. June 2011, 11:50 »
Hallo erstmal :)
Ich bin jetzt an dem Punkt, wo ich Paging implementiere und werde damit auch zwangsläufig dazu kommen müssen irgend eine Art von IPC zu implementieren.

In dem Wiki-Artikel find ich es sehr abstrakt. Es ist klar wie das Model aussieht, aber wie man das Softwäretechnisch implementiert, hab ich keine Ahnung, wie das gehn soll. Als Beispiel nenn ich jetzt mal die Message Queue die ich gern für mein System hätte.
Was ich mich nun Frage ist, wie ich es Umsetzte, dass ein Programm Daten emfpängt und ein anderes sendet, ohne den Programmfluss zu stören, aber trotztdem auf die Ereignisse reagieren zu können... Aber das halt so, das es zu keinen Seiteneffekten kommt. Ich versteh noch nicht ganz, wie das überhaupt gehen soll, wenn die Programme Speichermäßig und auch vom CPU Zustand völlig abgekoppelt sind.
So ein paar Zeilen Pseudo-Code würden mir vielleicht auf die Sprünge helfen.

Lieben Gruß,
Sebi2020
4
Lowlevel-Coding / Stack Fault Exception bei memset Funktion.
« am: 26. June 2011, 11:27 »
hallo erstmal,
Ich habe letztens versucht die strcmp Funktion zu implementieren, was dann ungefähr so aussieht:
char* cstring = pmm_alloc();
memset(cstring,0,0x1000);
...
Wenn ich diese Funktion nun einmal aufrufe klappt auch alles. Beim zweiten Aufruf bekomme ich einen Stack Fault ( 0xd ). Im Wiki heißt es das es an ein Falsch geladenem Stack Segment Register liegen kann. Ich bin im Moment ratlos woher der kommen kann. Wenn ich Memset z.B. nur 100 Bytes schreiben lasse geht wieder alles, aber ich wollte eigentlich schon eine ganze Page löschen.
Diese Funktion hab ich einmal in einem Ring0 Task ausprobiert und zum Testen wegen dem SS Register auch einmal in einem Ring3 Task.
Kann es an dem SS Register liegen? Hab hier mal die Ausgabe von QEMU
check_exception old: 0xffffffff new 0xd
     6: v=0d e=0000 i=0 cpl=0 IP=0008:00100a3d pc=00100a3d SP=0010:0012af44 EAX=03da0620
EAX=03da0620 EBX=001021e9 ECX=00000001 EDX=0012af5c
ESI=0010059a EDI=0000001a EBP=0000000c ESP=0012af44
EIP=00100a3d EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00102160 00068fff 00c08900 DPL=0 TSS32-avl
GDT=     00102220 00000030
IDT=     00102260 000007ef
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000008 CCD=0012af44 CCO=ADDL    
EFER=0000000000000000
Was mich leicht wundert, dass die SS und CS Register DPL 0 haben und die anderen beiden DPL 03. Müssten die bei einem Ring 3 Task nich alle DPL 3 haben?

EDIT:
Zumindest sind da nur meine Ring0 Selektoren geladen. (also 0x8 und 0x10)
Gruß Sebi2020
5
Lowlevel-Coding / Task nach ausführung beenden
« am: 25. June 2011, 13:13 »
Guten Tag,
also ich habe bereits funktionierendes Multitasking im meim System, kann Module laden und Syscalls ausführen.
Eine Sache bleibt mir aber Schleierhaft:
Wenn ich am ende, sagen wir einer Mainfunktion bin, würde ich jetzt mal sagen, dass ein Programm wenn es lieb ist, am ende exit(EXIT_CODE); aufruft. Aber da ich davon ausgehen kann, das nicht jedes Programm so lieb ist und dass die funktion durch einen Return auch nicht wieder woanders hinspringen wird (da ich sie ja nicht als Funktion aufrufe sondern sie nur "Missbrauche" als Symbol.), was ich mache, wenn es nicht aufgerufen wird ohne gleich eine GPF zu bekommen, weil der Prozessor versucht Daten auszuführen?

Lieben Gruß, Sebi2020
6
Hallo,
habe seit ich graumer Zeit nicht mehr an meinem Kernel geschrieben habe wieder angefangen.
Ich habe vorher auf einem 32 Bit- Windows kompiliert und kompiliere nun unter einem 64-Bit Debian.
Auf jeden Fall hab ich meinen Kernel mit gcc  kompiliert als elf32 (-m32) und im nasm mit -f elf32.
Das ganze dann gelinkt mit ld OUTPUT_FORMAT(elf32-i386) & OUTPUT_ARCH(i386:i386).
Ich bekomme dann aber beim booten unter VirtualBox von Grub immer gesagt:

Error 13: Invalid or unsupported executable format.
Hat jemand vielleicht eine Idee was ich falsch gemacht haben könnte?
Ich füge hier mal noch einen Objdump vom kernel und die Assemblerdatei für den Multiboot-Header und den spring in die init an.

Hoffentlich habt ihr ne Idee, woran es liegen könnte. Ich bin mit meinem Latein am Ende.

Gruß Sebi2020
; Written by Sebi2020

; Licensed under the GPL (General Public License)

; Project name: InfoOS

global loader

global load_selectors

MB_MAGIC equ 0x1badb002

MB_FLAGS equ 0x3

MB_CHECKSUM equ - (MB_MAGIC + MB_FLAGS)

section multiboot

; Multiboot Header

align 4 ; Durch 4 teilbare Adressen

dd MB_MAGIC

dd MB_FLAGS

dd MB_CHECKSUM



section .text

extern init ; Init ist extern (C-Code)



loader:

mov esp, 0x200000 ; Stack bei 2 MiB

push ebx ; Multiboot Struktur



call init ; Kernel initalisieren

kernel_end:

hlt ; Prozessor anhalten

jmp kernel_end

; Selektoren laden

load_selectors:

mov ax,0x10 ; Selektor 0x10 nach ax

mov ds,ax ; Datensegment updaten

mov es,ax ; Extra-Segement updaten

mov ss,ax ; Stack-Segment updaten

jmp 0x8:continue ; Selektor 0x8 nach CS laden und EIP erhöhen (far-jump)

continue:

ret ; Zu Init zurückkerhen (s. C-Code)


kernel:     file format elf32-i386

Program Header:
    LOAD off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**21
         filesz 0x00102254 memsz 0x00122ac0 flags rwx
   STACK off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
         filesz 0x00000000 memsz 0x00000000 flags rwx

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000200a  00100000  00100000  00100000  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .rodata       00000190  0010200c  0010200c  0010200c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .data         000000b4  001021a0  001021a0  001021a0  2**5
                  CONTENTS, ALLOC, LOAD, DATA
  3 .bss          00020860  00102260  00102260  00102254  2**5
                  ALLOC
  4 .comment      0000001c  00000000  00000000  00102254  2**0
                  CONTENTS, READONLY

Disassembly of section .text:

00100000 <loader-0x10>:
  100000: 02 b0 ad 1b 03 00     add    0x31bad(%eax),%dh
  100006: 00 00                 add    %al,(%eax)
  100008: fb                   sti    
  100009: 4f                   dec    %edi
  10000a: 52                   push   %edx
  10000b: e4 00                 in     $0x0,%al
  10000d: 00 00                 add    %al,(%eax)
  10000f: 00 bc 00 00 20 00 53 add    %bh,0x53002000(%eax,%eax,1)

00100010 <loader>:
  100010: bc 00 00 20 00       mov    $0x200000,%esp
  100015: 53                   push   %ebx
  100016: e8 bb 00 00 00       call   1000d6 <init>

0010001b <kernel_end>:
  10001b: f4                   hlt    
  10001c: e9 fa ff ff ff       jmp    10001b <kernel_end>

00100021 <load_selectors>:
  100021: 66 b8 10 00           mov    $0x10,%ax
  100025: 8e d8                 mov    %eax,%ds
  100027: 8e c0                 mov    %eax,%es
  100029: 8e d0                 mov    %eax,%ss
  10002b: ea 32 00 10 00 08 00 ljmp   $0x8,$0x100032

00100032 <continue>:
  100032: c3                   ret    
  100033: 00 55 89             add    %dl,-0x77(%ebp)

7
Softwareentwicklung / Speicherverwaltung - Adressenberechnung
« am: 14. February 2010, 11:51 »
Hey,
ich bin gerade dabei die Speicehrverwaltung zu schreiben und hab jetzt ein mathematisches Problem. Eine physische Adresse berechne ich so:
(i * 32 + i2) * 4096 = PhysAddr
i steht in dem Fall für den 32Bit Eintrags des Arrays und i2 für die Bitposition in dem Eintrag.
Das klappt auch so ganz gut. Durch umstellen erhalte ich für i2
i2 = PhysAddr/4096 - (i * 32)
Das klappt auchganz gut allerdings nur wenn ich von pmm_alloc (genau 4k Adressen) damit auflöse, also 0x1000, 0x2000, 0x3000 usw...
Was mach ich wen ich jetzt allerdings ne Adresse habe wie 0x1021 oder so. Wie berechne ich dafür die Bitposition in der Bitmap und den entsprechenden Eintrag im Array?

mfg Sebi
8
Lowlevel-Coding / Kein Timerinterrupt nach Ringwechsel (3)
« am: 30. January 2010, 02:50 »
Halo,
ich hab jetzt mal versucht, das mit dem Userspace zu implementieren. Nun wird, wenn ich einen Ring3 task erstelle kein timerinterrupt mehr ausgeführt. (Wenn ich eine ring0 task starte läuft fast alles wunderbar). was für Gründe kann es so im allgemeinen haben, dass ein Timerinterrupt nicht mehr gestartet wird?

mfg Sebi
9
Lowlevel-Coding / Userspace
« am: 04. January 2010, 21:35 »
Ich habe mal eine frage, was die Privilegien von Progarmmen/Threads angeht. Ich bin gerade bei dem OS-dev für einsteiger beim multitasking->userspace.
Und ich wollte fragen, wie dass mit Privilegien in interrupts aussieht. In welchem Ring läuft so ein Interrupt ab?
Mich intressiert dass, weil so wie das im Tutorial aussieht reicht ein
mov ax,0x10
mov ds,ax
mov ...
jmp 0x8:continue
continue:
aus um im Ring 0 zu laufen und danach wird in Ring drei gewechselt.
Nur würde ich ja dann beim nächsten aufrufen des Interrupts doch von Ring 3 nach Ring 0 wechseln... und dass wundert mich, weil wenn ein Interrupt dann im Ring 3 läuft könnte ich doch in programmen auch einfach nen:
mov ax,0x10
mov ds, ax
mov ...
jmp 0x8:continue
continue:
machen und schon hätte das Programm Kernel-Privilegien. Oder wie ist dass? Ich bin da noch nicht so ganz schlau :)

mfg sebi
10
Softwareentwicklung / Rätselhafte Compiler-Messages
« am: 22. December 2009, 17:33 »
So hier zu meinem debug--thema analog noch ein thread betreffend compiler. Und am besten fang ich auch gleich wieder ^^ an:
ich will grad in einer funktion nen software interrupt auslösen:
asm volatile("int 0x2F");
als antwort beim kompelieren erhalte ich da:
ERROR: suffix or operands invalid for `int'.
was ist daran nicht korrekt?
11
Softwareentwicklung / Rätselhafte Debug-Messages
« am: 21. December 2009, 22:33 »
Hey,
ich wollte maln Thread für Sachen bezüglich Debuggen erstellen.
So dass man hier seine Fragen reinschreiben kann, und wo ich grad dabei bin, würde ich gleich meine erste Frage stellen. Ich bin gerad dabei sowas wie nen timer zu implementieren, also für anwendungen, z.B. uint8_t* set_timer(uint16_t ticks);.
Ich bekomm jetzt nen exception wenn ich den pointer irgendwo abfrage. Und wollte mal fragen ob mir jemand sagen kann, was diese Meldung bedeutet:
Zitat
00037134778i[CPU0 ] LOCK prefix unallowed (op1=0x53, attr=0x0, mod=0x0, nnn=0)
00037134780i[CPU0 ] LOCK prefix unallowed (op1=0x53, attr=0x0, mod=0x0, nnn=0)

mfg Sebi
12
Lowlevel-Coding / Problem bei string zusammenfügung
« am: 20. December 2009, 14:29 »
Ich versuche jetzt schon seit nem halben tag "0x" und irgend ne hexzahl zusammenzufügen... aber irgendwie ist der wurm drin? was mach ich den bloß für einen fehler? bräucht da mal dringend hilfe...
hab nen screenshot und den codeteil hier mit gepostet:

Code:
char* int2hex_ascii(int z)
{
    char buffer[] = "";
    static char buffer2[10] = "0x";
    if(z <= 0)
    {
        return "0x0";
    }
    else
   {
       char c;
       int length = 0;
       while(z) { c = z % 16; if (c > 9) { c += 7; } c += 48; z /= 16; buffer[length++] = c;}
       reverse_string(buffer);
       int i;
       for(i=0;i <= strlng(buffer); i++)
       {
    buffer2[i+2] = buffer[i];
       }
       return buffer2;
}
}

eigentlich sollte die ausgabe: 0x0 - 0x19 ausgeben... aber es kommt folgendes raus (das weiße und das undefined interrupt soll so sein.):
Und hier die Ausgabe, die ich nicht versteh. Für mich ist es unlogisch der es so aus gibt:
13
Lowlevel-Coding / PIC: Was ist ein ICW?
« am: 13. December 2009, 19:43 »
Ich habe mir gerade den Artikel über den PIC durchgelesen. Dann wird dort etwas über ICW erwähnt, aber an keiner Stelle wird erklärt was mit ICW gemeint ist, von daher wollte ich mal fragen, ob mir jemand sagen kann was dass sein soll?

mfg Sebi2020
14
Softwareentwicklung / Bit gesetzt oder nicht?
« am: 07. December 2009, 14:35 »
Wie kann man eigentlich in C & Assembler feststellen, ob ein bestimmtes Bit in nem Byte gesetzt ist?

Also wenn ich z.B. 0100 0111 habe. Wie kann ich in C UND Assembler rausfinden, ob z.B. Bit 6 gesetzt ist, oder nicht?

Liebe Grüße
Sebi2020
15
Softwareentwicklung / int nach ascii umwandeln
« am: 22. November 2009, 00:52 »
Versuche gerade sowas wie printf zu schreiben, nur weiß ich leider gerade überhaupt nicht, wie ich eine Integer Zahl als String ausgeben soll oder wie dass mit float aussehen soll.
Also ich mein, da ich keine libc habe und dadurch auch kein printf usw. muss ich es ja selbst implementieren, aber ich hab keine Ahnung wie ich dass Ansetzen soll. weil integer 1 ist ja nicht gleich ascii  '1'.

Hat da schon mal jemand was implementiert, oder vielleicht sowas wie Pseudocode?

Ich steh grad echt aufm schlauch.

mfg Sebi2020
16
Lowlevel-Coding / Dauerhafter Floppy Zugriff
« am: 21. November 2009, 13:32 »
Ich habe meinen Kernel mal kompiliert und unter Bochs ausgeführt. Aus irgend einem Grund findet ein ständiger Zugriff auf das Floppylaufwerk vor, und der Prozessor wird auch ständig belastet. Hat jemand eine Idee woran das liegen könnte?
Kann auch gerne mal meinen quelltext posten
dsplib.lib:
// Bildschirmdefinition
#define DISPLAY_MEM_START 0xb8000
#define DISPLAY_MEM_END 0xB8FA0
// Konsolendefinition
#define LINE (console_y * 0xA0)
/* Konsolenzeile */
int console_y = 0;
int console_x = 0;
char* video = (char*) 0xb8000;
/* Konsolenzeile ende */

int strlng(char* string)
{
int count = 0;
while(*string)
{
string++;
count++;
}
return count;
}
void cls(void)
{
for(video=(char*)DISPLAY_MEM_START; video < (char*) DISPLAY_MEM_END;video++)
*video=0;
video = (char*) 0xb8000;
}
void s_line_print(char text[])
{
int cursor = 0;
for(cursor = 0; cursor < strlng(text);cursor++)
{
video[LINE+(2*cursor)] = text[cursor];
video[LINE+(2*cursor)+1] = 0x7;
}
console_y++;
}
void put_char(char c, int color)
{
if(c != '\n' && c != '\r' && console_x <= 80)
{
video[LINE + (2*console_x)] = c;
video[LINE + (2*console_x)+1] = color;
console_x++;
}
else
{
if(c == '\n' || console_x > 80)
{
console_y++;
return;
}
if(c == '\r')
{
console_x = 0;
return;
}
}
}
void print(char text[],int color)
{
int count;
for(count = 0; count < strlng(text);count++)
{
put_char((char) text[count],(int) color);
}
}

display.h:
// Funktiondeklaration
int strlng(char* text);
void cls(void);
void s_line_print(char text[]);
void put_char(char c,int color);
void print(char text[], int color);

kernel.c
#include "display.h"
void init(void)
{
cls();
s_line_print("InfoOS");
print("Starting InfoOS...\n\rPlease wait...",7);
return;
}

start.asm
global loader
MB_MAGIC equ 0x1badb002
MB_FLAGS equ 0x0
MB_CHECKSUM equ - (MB_MAGIC + MB_FLAGS)

section multiboot
; Multiboot Header
align 4
dd MB_MAGIC
dd MB_FLAGS
dd MB_CHECKSUM

section .text
extern init

loader:
mov esp, 0x200000
push eax
push ebx
call init
cli          ; Vorzeitige Lösung
hlt         ; --

Hier noch mein Linkerscript:
ENTRY (loader)
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)

SECTIONS
{
. = 0x100000;
.text :
{
build/start.o(multiboot)
*(.text)
}
.data :
{
*(.data)
}
.bss :
{
_sbss = .;
*(COMMON)
*(.bss)
_ebss = .;
}
}
Hoffe das Hilft weiter ;-) Ich ahb absolut keine Ahnung, woran das liegen könnte.
17
Offtopic / Hintergrundbild in Grub?
« am: 18. November 2009, 18:51 »
Gibt es in Grub (Legacy version bzw. nicht grub 2) die Möglichkeit, ein hintergrundbild einzufügen?

Wäre ganz schick :-)
18
Lowlevel-Coding / Shell im Kernel
« am: 18. November 2009, 18:32 »
wenn man dabei ist eine bash zu programmieren, möchte ich ja auf eingaben warten. aber was mache ich wenn ich meinen kernel code abgearbeitet hab, und erstmal so von mir ohne weiterer eingabe kein weiterer code ausgeführt werden soll?. soll ich in eine endlosschleife gehen, die erst beendet werden soll, wenn eine eingabe erfolgt, oder wie wird sowas gelöst? im moment wird die cpu bei mir erstmal angehalten, wenn der ganze code ausgeführt wird, aber dass bringts ja nicht so wirklich ;-)
19
Softwareentwicklung / strlen
« am: 17. November 2009, 08:10 »
ah okay ,danke. hm, hab mein erstes problem hinbekommen. beim zweiten komm ich nicht weiter. ich weiß leider nicht wie ich herausbekomme viele elemente text[] hat.
Ich wollte da iwi mit while oder so iterieren, und bei jedem durchgang,das element zähln.
20
Lowlevel-Coding / attributbyte,problem
« am: 16. November 2009, 20:41 »
Hey, hab mich jetzt mal daran gewagt, nen kernel in c anzufangen. habe Leider ein problem. iwi kommt eine farbige vielfalt mit braunem hintergrund auf dem bildschirm, bei meinem code. Kann mir jemand viellecht helfen? was mache ich falsch, bei der speicherung des attributbytes.
Und was kann es für einen grund haben das sizeof() nicht funktioniert? habe wo jetzt 21 im quelltext in der schleife steht, vorher sizeof(text) stehen gehabt, aber anscheinend hat sizeof immer 5 zurückgegeben, egal wie lang text war.

// Bildschirmdefinition
#define DISPLAY_MEM_START 0xb8000
#define DISPLAY_MEM_END 0xB8FA0
// Konsolendefinition
#define KON_LINE_SIZE 0xA0
int static kon_line = 0;
void clear_screen(void)
{
char *videos = (char*) 0xb8000;
for(videos=(char*)DISPLAY_MEM_START; videos < (char*) DISPLAY_MEM_END;videos++)
     *videos=0;
}
void kprintf(char text[])
{
int cursor = 0;
char *video = (char*) DISPLAY_MEM_START;
for(cursor = 0; cursor < 21; cursor++)
{
video[(kon_line * KON_LINE_SIZE)+(cursor)] = text[cursor];
video[(kon_line * KON_LINE_SIZE)+(cursor+1)] = 0x7;
}
kon_line++;
}
void init(void)
{
clear_screen();
kprintf("Willkommen zu InfoOS");
}
Seiten: [1] 2

Einloggen