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 - linuxuser

Seiten: [1]
1
Lowlevel-Coding / pointer
« am: 17. March 2005, 15:10 »
hi leute ich habe eine frage und zwar bei diesem codeteil:
void print(char eing){
char *Text = eing;
char *VideoMem = (char*)0xB8000;
while(*Text){
  *VideoMem = *Text;
  *VideoMem++;
  *VideoMem = 7;
  *VideoMem++;
*Text++;
line++;
}//end while

}//end outp

int main(void){
print("aaaaaaaaaaaaaaaaaa");
}//end main


passiert gar nichts was ist hier das problem??? ich glaube hier zeigt der pointer nicht auf die richtige stelle im speicher, aber wie kann ich das loesen??
der compiler gibt mir bei der besagten zeile (wo ich den pointer auf die variable eing zeigen lasse) aus
warning: initialization makes pointer from integer without a cast
das sagt mir das die variable keine besetzung hat aber ich habe keinen plan wie ich das machen koennte damit dieser code funzelt
2
Lowlevel-Coding / doofe frage zu methoden
« am: 16. March 2005, 19:22 »
hi ich habe eine doofe frage und braeuchte eure hilfe
wenn ich eine methode aufrufen will zb:
void print(){
}//end print

int main(void){
print();
}//end main


dann funzelt dass nicht, alles was ich in die main schreibe geht, nur methoden lassen sich nicht aufrufen... ich hoffe ich belaestige euch nicht mit solchen fragen  <:-} es waere nett waenn ihr mir ein buch oder aehnliches empfehlen koennt wo es sich um lowlevel C programmierung dreht... ein fettes THX
   Linuxuser
ps: compiliert habe ich das ganze mit dem befehl:
gcc -c -ffreestanding -fwritable-strings -nostdinc -O3 -Wall *.c

und gelikt mit:
ld -Ttext 0x100000 --oformat elf32-i386 -O l -o kernel kernel.o
3
Lowlevel-Coding / doofe frage zu methoden
« am: 16. March 2005, 19:21 »
hi ich habe eine doofe frage und braeuchte eure hilfe
wenn ich eine methode aufrufen will zb:
void print(){
}//end print

int main(void){
print();
}//end main


dann funzelt dass nicht, alles was ich in die main schreibe geht, nur methoden lassen sich nicht aufrufen... ich hoffe ich belaestige euch nicht mit solchen fragen  <:-} es waere nett waenn ihr mir ein buch oder aehnliches empfehlen koennt wo es sich um lowlevel C programmierung dreht... ein fettes THX
   Linuxuser
ps: compiliert habe ich das ganze mit dem befehl:
gcc -c -ffreestanding -fwritable-strings -nostdinc -O3 -Wall *.c

und gelikt mit:
ld -Ttext 0x100000 --oformat elf32-i386 -O l -o kernel kernel.o
4
OS-Design / EIN OS IN C MIT BOOTLOADER...
« am: 05. March 2005, 14:17 »
hi  @all

ich und mein freund haben schon seit laengern vor ein eigenes OS zu
schreiben, das wir RaileX getauft haben. wir haben keine probleme mit dem
programmieren aber mit dem booten. wir haben folgendes ausprobiert:

----------------------------
unser Bootloader: [boot.asm]
----------------------------

org 0x7C00


start:
cli               ;Interrupts sperren
mov ax, 0x9000    ;Adresse des Stacks speichern
mov ss, ax        ;Stackadresse festlegen
mov sp, 0         ;Stackpointer auf 0 setzen
sti               ;Interrupts wieder freigeben

mov [bootdriv], dl  ;Hier wird das Bootlaufwerk gespeichert
call load

mov ax, 0x1000   ;0x1000 ist die Speicheradresse des Kernels
mov es, ax
mov ds, ax
push ax
mov ax, 0
push ax
retf

bootdriv db 0     ;Das ist das Bootlaufwerk
loadmsg db "Bitte warten! Lade RaileX Kernel...", 13,10,0

;mit der folgenden Funktion wird ein String ausgegeben
putstr:
lodsb
or al, al
jz short putstrd
mov ah, 0x0E
mov bx, 0x0007
int 0x10
jmp putstr
putstrd:
retn

;mit der folgenden Funktionwird der Kernel geladen
load:
push ds
mov ax, 0
mov dl, [bootdriv]
int 13h
pop ds
jc load

loadl:
mov ax, 0x1000
mov es, ax
mov bx, 0
mov ah, 2
mov al, 5
mov cx, 2
mov dx, 0
int 13h
jc loadl
mov si, loadmsg
call putstr
retn

times 512-($-$$)-2 db 0
dw 0AA55h

-----------------------------------------
ENDE
-----------------------------------------


diesen haben wir dann mit NASM zu einer *.bin datei assembliert

------------------------------
der startpunkt des kernels [ks.asm]
------------------------------

[BITS 32]

[global start]
[extern main]

start:
    call main
    jmp $
       

------------------------------
ENDE
------------------------------          

ich weiß zwar dass man bei "main" einen unterstrich vorsetzen muss, aber da
hat dann er linker [ld] unter linux gemotzt.

und jetzt unser KERNEL in C

--------------------------------------
KERNEL in [C] [kernel.c]
--------------------------------------

int main()
{
    char *Text = "WELCOME TO RAILEX OS";  
    char *VideoMem = (char*)0xA8000;  
 
    while(*Text)  
{  
        *VideoMem = *Text;  
        *VideoMem++;  
        *VideoMem = 7;  
        *VideoMem++;  
        *Text++;  
}
    return(0);
}

--------------------------------------
ENDE
--------------------------------------

und so sieht die Linker Datei aus:

--------------------------------------
link.ld
--------------------------------------

UTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS
{
    .text    0xFF800000   :   {
        *(.text)
        }
    .data    : {
        *(.data)
        }
    .bss   :
        {
        *(.bss)
        }
}

--------------------------------------
ENDE
--------------------------------------


ERSTELLUNG

so haben wir den Kernel kompiliert:

gcc -c -ffreestanding -nostdinc -I ./ -O3 -Wall -o kernel.o kernel.c

boot.asm haben wir folgendermaßen assembliert:

nasm -f bin -o boot.bin boot.asm

ks.asm haben wird so assembliert:

nasm -f aout -o ks.o ks.asm

Nun haben wir die Objekt Dateien so gelinkt:

ld -T lihnk.ld -o kernel.bin ks.o kernel.o


So viel zum Erstellen.

Dann haben wir so weitergemacht:

cat boot.bin kernel.bin >/railex.img
cat railex.img >/dev/fd0

So! Dann haben wir die Diskette drinnen gelassen und neu gestartet.
Und das Ergebnis: Traurig starrten wir auf einen leeren Bildschirm mit einem
einzelnen blinkenden Cursor.




Was könnte da bloß falsch sein?

Wir wissen das im LowLevel mit GRUB booten erklärt wird. Aber wir waren
nicht sehr erfolgreich, da jeder der etwas über GRUB schreibt
vergisst, das es auch schon eine Hürde ist Grub überhaupt richtig auf
Diskette bekommt.

Falls es dir zu aufwendig ist unseren Code zu korrigieren, oder überhaupt
richtig anzuschauen, dann bitte wir wenigstens um eine genauere
beschreibung von GRUB. Zum Beispiel: Wo findet man ihn? Wie compiliert man
ihn (wenn das überhaupt nötig ist)? Wie kann man ihn
auf Diskette installieren? Wie bekomme ich GRUB !!UND!! meinen Kernel auf
Diskette?

In diesem Sinne vielen Dank im voraus.

mfg
Das RaileX Team
Seiten: [1]

Einloggen