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

Seiten: 1 2 [3] 4
41
Lowlevel-Coding / BOCHS bootet mein os der PC aber nicht :-(
« am: 26. April 2006, 11:32 »
hi!

hab nun folgenden code geschrieben:


org 0x7c00

KERNEL_SIZE equ 76
KERNEL_SEGMENT equ 0x1000
KERNEL_START equ 1


%define LOOPS_1    bp-2
%define CYLINDER bp-4
%define HEADS   bp-6
%define SECTORZ   bp-8
%define LOGICAL bp-10
%define BUFFER      bp-12

SUB sp, 12

MOV cx, KERNEL_SIZE
MOV [LOOPS_1], cx

MOV al, 1
CLI
MOV ax, 0x9000
MOV ss, ax
MOV sp, sp
STI

MOV ax, KERNEL_SEGMENT
MOV es, ax
XOR bx, bx

main_loop:
    MOV [LOOPS_1], cx       ;take the loopvar to the logical sector number

    MOV [LOGICAL], al
    CALL logical_to_chs     ;convert the LSN to CHS

fail:
    ;read the sector
    ADD bx, 512
    MOV ah, 2
    MOV al, 1
    MOV cl, [SECTORZ]
    MOV ch, [CYLINDER]
    MOV dh, [HEADS]
    MOV dl, 0
    INT 0x13
    JC  fail
   
    MOV cx, [LOOPS_1]
    MOV al, 1  
    ADD [LOGICAL], al

    LOOP main_loop;

JMP KERNEL_SEGMENT:0x0000

logical_to_chs:
MOV ax, [LOGICAL] ;Cylinder
MOV bx, 36
MOV dx, 0
DIV bx
MOV [CYLINDER], ax

MOV ax, dx ;Head
PUSH ax
MOV bx, 18
MOV dx, 0
DIV bx
MOV [HEADS], ax

POP ax  ;Sektor
MOV dx, 0
DIV bx
MOV ax, dx
ADD ax, 1

MOV [SECTORZ], ax
RET


leider kommt auch hier wieder die meldung

Device: [CPU0]
Message: prefetch: RIP > CS.limit


ich hab euren rat befolgt immer nur einen sektor einzulesen aber BITTE BITTE bessert meinen code aus... DANKE waenn das funkt bin ich so froh sach ich euch...
42
Lowlevel-Coding / BOCHS bootet mein os der PC aber nicht :-(
« am: 25. April 2006, 12:04 »
hi!

ich hab nun folgenden code:

org 0x7c00

jmp start

KERNEL_SIZE equ 70
KERNEL_SEGMENT equ 0x1000
KERNEL_START equ 1

start:

; STAGE1
stage1:
   MOV ax, 0x1000    ; ES:BX = 1000:0
   MOV es, ax
   MOV bx, 0

   MOV ah, 2
   MOV al, 35        ; sectors to read
   MOV cx, 2         ; cylinder=0, sector=2
   MOV dx, 0         ; head=0, disk=0
   INT 0x13          ; operate the interrupt
   JC  stage1        ; on error try again

;STAGE 2
stage2:  
   ADD   bx, 512*35

   MOV ah, 2
   MOV al, 70       ;70
   MOV cl, 1        ;1
   MOV ch, 1        ;1
   MOV dx, 0
   INT 0x13
   JC  stage2

; STAGE 3
stage3:  
   ADD   bx, 512*70

   MOV   ah, 2
   MOV   al, 10     ;10
   MOV   cl, 2
   MOV   ch, 1
   MOV   dx, 0
   INT   0x13
   JC   stage3  

   jmp KERNEL_SEGMENT:0x0000



dann funkts aender ich das MOV   al, 10     ;10 auf MOV   al, 70     ;10 dann gehts nicht mehr kann mir mal jemand sagen wie ich das am bestem mache waenn ich pro stage 18 sectoren auslese (da pro head ja 18 sectoren) funkts auch nicht koennt ihr mir eventl sagen wie viel ich pro stage immer auslesen sollte?

DANKE!!!
43
Lowlevel-Coding / BOCHS bootet mein os der PC aber nicht :-(
« am: 24. April 2006, 20:34 »
ok hab nun gesplittet und es funkt!!!! danke!!
44
Lowlevel-Coding / BOCHS bootet mein os der PC aber nicht :-(
« am: 24. April 2006, 18:35 »
hi!

danke hab deinen code probiert!! leider funkt es wieder nicht :-(( er gibt mir das R(pc und bochs machen das selbe!!) aus das heisst das mit dem interrupt was nicht stimmt oder? mein kernel ist 38551 Bytes gross daher hab ich nun in KERNEL_SIZE 76 eingestellt(da 38551/512 == ~75.294) kann es sein dass man das mit dem interrupt 13 anders machen soll? ich bin schoen langsam am verzweifeln...

ps waenn ich das jc error auskommentiere kommt wieder der error:  Device: [CPU0]
Message: prefetch: RIP > CS.limit
45
Lowlevel-Coding / BOCHS bootet mein os der PC aber nicht :-(
« am: 23. April 2006, 20:12 »
hi danke fuer deine antwort!!

hab nun das mit der funktionsnummer hinzugefuegt:
MOV ax, 200h + KERNEL_SIZE


; THIS IS THE RAILEX OS BOOTLOADER
;
; AUTHOR: Rainer Sickinger
; LICENCE: GNU GPL
; COPYRIGHT: Rainer Sickinger
;            Alexander Zahrer
;

[BITS 16]    ;16 bit mode
[ORG 0x7C00] ;place for the bootloader

jmp start

KERNEL_START equ 1    ; Disk block where kernel starts
KERNEL_SIZE equ 35    ; Kernel size in disk blocks
KERNEL_SEGMENT equ 1000h ; Segment where kernel will be loaded

;
; The print funktion
;

Print_m:
Print_p:
lodsb ; next sign

INT 10h
CMP al,0
JNE Print_p

RET

%macro Print 1

MOV si,%1

XOR ax,ax

MOV ah,0Eh ; tell the int we want print
MOV bx,0F00h ; color from 0000h(black) to 0F00h(white)

CALL Print_m

%endmacro


;
; Load kernel
;

bootmsg db "BOOTING THE RAILEX KERNEL!", 0
bootmsg2 db "boot...", 0
failmsg db "failed", 0
succmsg db "succeed", 0

start:

mov ax, cs  ; segment register für die nachrichten usw setzen
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ax, 0x9000
mov ss, ax
mov sp, 0xff

Print bootmsg

MOV ax, 200h + KERNEL_SIZE
PUSH word KERNEL_SEGMENT
POP es
XOR bx, bx
MOV cx, KERNEL_START + 1
MOV dx, 0
INT 13h

JNC ok
Print failmsg
JMP $
ok:
Print bootmsg2
;
; Jump to kernel
;
jmp KERNEL_SEGMENT:0

Print succmsg


waenn ich dann den code ausfuehre gibt mir bochs folgendes aus:
Device: [CPU0]
Message: prefetch: RIP > CS.limit


hat von euch noch niemand code geschrieben der anderen code laedt? vl koennt ihr mir den zeigen... danke!

ps waenn ich ax auf 0 setze mit xor ax, ax dann werden irgendwie in ner endloschschleife lehrzeichen ausgegeben...
46
Lowlevel-Coding / BOCHS bootet mein os der PC aber nicht :-(
« am: 23. April 2006, 18:33 »
hi!
danke erstmal fuer eure antworten aber ich blick langsam nicht mehr durch :-( mein bootloader sieht nun so aus:


[BITS 16]    ;16 bit mode
[ORG 0x7C00] ;place for the bootloader

jmp start

KERNEL_START equ 1    ; Disk block where kernel starts
KERNEL_SIZE equ 35    ; Kernel size in disk blocks
KERNEL_SEGMENT equ 1000h ; Segment where kernel will be loaded

;
; The print funktion
;

Print_m:
Print_p:
lodsb ; next sign

INT 10h
CMP al,0
JNE Print_p

RET

%macro Print 1

MOV si,%1

XOR ax,ax

MOV ah,0Eh ; tell the int we want print
MOV bx,0F00h ; color from 0000h(black) to 0F00h(white)

CALL Print_m

%endmacro


;
; Load kernel
;

bootmsg db "BOOTING THE RAILEX KERNEL!", 0
bootmsg2 db "boot...", 0
failmsg db "failed", 0
succmsg db "succeed", 0

start:

mov ax, cs  ; segment register für die nachrichten usw setzen
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ax, 0x9000
mov ss, ax
mov sp, 0xff

Print bootmsg

PUSH word KERNEL_SEGMENT
POP es
XOR bx, bx
MOV cx, KERNEL_START + 1
MOV dx, 0
INT 13h
JNC ok
Print failmsg
JMP $
ok:
Print bootmsg2
;
; Jump to kernel
;
jmp KERNEL_SEGMENT:0

Print succmsg


alles was ich von diesem code will ist dass er mir eine  21393 Bytes grosse bin laedt den rest macht diese dann... BITTE BITTE aendert mir diesen code so ab dass dies funkt oder sagt mir was ich falsch mache... DANKE!
47
Lowlevel-Coding / BOCHS bootet mein os der PC aber nicht :-(
« am: 28. March 2006, 20:44 »
hi danke fuer die antwort die bootsignatur fuegt das programm diskcopy hinzu!
ich hab den bootsector mal so abgeaendert:


MOV ax, 200h + KERNEL_SIZE
PUSH word KERNEL_SEGMENT
POP cs ;es <--- aenderung
XOR bx, bx
MOV cx, KERNEL_START + 1
MOV dx, 0
INT 13h
JNC ok
Print failmsg
JMP $
ok:
Print bootmsg2

leider kummt nun auch beim grub gleich die fehlermessage!! :-(
48
Lowlevel-Coding / BOCHS bootet mein os der PC aber nicht :-(
« am: 27. March 2006, 18:26 »
hi!

jetzt hab ich ein ganz stranges problem! ich verwende folgenden bootloader:
http://hazelnoot.ha.funpic.de/RAILEX/sources/boot.asm

und mein kernel ist 18385 Bytes gros!

mit diskCopy.c(http://hazelnoot.ha.funpic.de/diskCopy.c) kopiere ich diesen auf die diskette hab ihn mit(nasm boot.asm -o boot -f bin) assembliert! und mit diskCopy_os(http://hazelnoot.ha.funpic.de/diskCopy_os.c) kopiere ich den kernel auf die disk! soweit so gut! starte ich bochs bootet er mir dies ohne probleme boote ich aber den pc mit eingelegter diskette funkt es nicht es wirft mir dann die fehlermessage d.h das carryflag ist nicht so wie es sollte!! das komische ist nur das ganze ging von heut auf morgen ich hab es schon paar mal gebootet mit dem pc dann hab ich einige aenderungen am kernel vorgenommen nun funkts nicht mehr!! :-((( woran kann das liegen!!!!! kompilieren tu ich mit dem compiler von [MM]!!

thx
49
Lowlevel-Coding / genaue groesse einer diskette
« am: 27. March 2006, 18:19 »
danke jetzt funkts!!
50
Lowlevel-Coding / genaue groesse einer diskette
« am: 24. March 2006, 09:48 »
JUHUUU!!! danke es funktioniert!! nun hab ich auch gleich das naechste problem :-( (ich hoffe ich nerve nicht!) ich hab mir nun auch eine methode zum schreiben von sectoren geschrieben!!!!

int writeSectors(char *buffer,int head, int track, int startSector, int anz){
    bx = (short)buffer;
    cl = startSector;
    dl = DRIVE;
    al = anz;
    ch = track;            
    dh = head;                  
   
    asm{
        mov ah, 0x2;
        int 0x13
        setc bx
    }
   
    return bx;
}


aufrufen tu ich das folgendermassen:
char buffer[512];
    int i;

    for(i = 0; i < 512; i++){
        buffer[i] = 'z';
    }

    writeSectors(buffer, 1, 79, 15, 1);

leider funkt dies nicht! ich sehe immer noch das was ich vorher unter linux mit meinem programm auf die diskette geschrieben hab! also die z ts sehe ich nicht obwohl ich readSectors mit genau den selben parametern aufrufe!

danke nochmal fuer alles!!

mfg noob!
51
Lowlevel-Coding / genaue groesse einer diskette
« am: 23. March 2006, 18:56 »
hi danke erstmal fuer deine antwort!

jetzt hab ich auch gleich noch eine frage:

ich hab mir ne methode geschrieben die sectoren lesen soll:

int readSectors(char *buffer,int head, int track, int startSector, int anz){
    bx = (short)buffer;
    dl = DRIVE;                  /*drive number 0 == floppy*/
    al = anz;                    /*number of sectors to read*/
    ch = track;                  /*track number*/
    dh = head;                   /*head number*/
   
    asm{
        mov ah, 0x2;
        int   0x13
        setc  bx
    }
   
    return bx;
}


aufgerufen hab ich diese so:
readSectors(buffer, 1, 79, 17, 1); <<--- das muesste eigentlich der letzte sector sein !!
nur waenn ich mein os dann boot hoer ich nur ein sumsen und dann tut sich nichts mehr!! was hat es da? muss ich vl vorher noch nen interrupt aufrufen oder nacher??
mfg hazelnoot!
52
Lowlevel-Coding / genaue groesse einer diskette
« am: 22. March 2006, 19:33 »
ich fang deswegen hinten an weil vorne kernel und bootloader sind!

kennt irgendjemand ne gute seite wo disketten beschrieben werden? oder vl kann mir mal kurz einer von euch helfen:

waenn ich in den letzten sector schreiben will auf welcher spur liegt der? dass muss man ja auch wissen! dann wie siet das mit den sektornummern aus? hat da jeder sektor in der spur seine nummer oder sind die sektoren sowieso nummeriert aber was bringt sich dann die spur? und was muss ich bei der seite/kopf einstellen? und was bedeuted CHS mode?

danke
noob
53
Lowlevel-Coding / genaue groesse einer diskette
« am: 22. March 2006, 16:10 »
hi ich hab ne kleine frage und zwar will ich nun en file system hochziehen fuer mein os und das soll am ende der diskette anfangen! nun muesste ich genau wissen wieviel blocks und wie viel bytes eine diskette genau gross ist!

danke
mfg noob
54
Lowlevel-Coding / BOCHS ein diskettenimage booten lassen
« am: 13. March 2006, 09:51 »
hi!
jetzt hab ich schon wieder ne frage... wie kann ich bochs dazu bringen, dass er von nem floppy image mein os bootet? d.h dass ich auch weiterentwickeln und TESTEN kann waenn ich kein floppy laufwerk habe (bei meinem laptop)!

danke
mfg
noob
55
Lowlevel-Coding / Eigener C++ Compiler
« am: 13. March 2006, 09:46 »
thx habs schon hinbekommen!
hab das mit dem far gschichtel wie ihr gesagt habt in asm geschrieben!
56
Lowlevel-Coding / Eigener C++ Compiler
« am: 12. March 2006, 16:37 »
das aendert auch nichts  :(  :(  :(
57
Lowlevel-Coding / Eigener C++ Compiler
« am: 12. March 2006, 16:00 »
hi!

deinen c compiler werd ich hernehmen nur hab ich folgendes prob ich hab diese c datei:

int main(){
    char *text = "Hi I am the Railex Kernel";
    char far *vidMem = (char far*) 0xB800;
   
    while(*text){
*vidMem = *text;
*vidMem++;
*vidMem = 7;
*vidMem++;
*text++;
    }

    return 0;
}


dann gebe ich ein:
dc2.exe kernel.c -mode kernel

dann bekomme ich:
Michael Moenchs Deutsch-C 2.0



*** compile: kernel.c ***

 E kernel.c(9): unknown type '){'

 W kernel.c(11): unknown number 'char far*' read as 0

 E kernel.c(11): unknown char '0' in number-constant

 E kernel.c(13): unknown type 'while(*text){'

 E kernel.c(14): unknown type '*vidMem=*text;'

 E kernel.c(15): unknown type '*vidMem++;'

 E kernel.c(16): unknown type '*vidMem=7;'

 E kernel.c(17): unknown type '*vidMem++;'

 E kernel.c(18): unknown type '*text++;'

 E kernel.c(19): unknown type '}'

 E kernel.c(21): unknown type 'while(1){'

 E kernel.c(21): unknown type '}'

 E kernel.c(21): unknown type ';'

 E kernel.c(23): unknown type 'return 0;'

 E kernel.c(24): unknown type '}'

 W kernel.c(25): global var 'far*vidMem' was never used

 W kernel.c(25): global var 'text' was never used

 done (0.00s)



total: 0.00s

warnings: 3

errors: 14


was mache ich da falsch?
aber es wird eine kernel.obj datei erzeugt!

wo finde ich eine genaue beschreibung zu deinen modes?

danke!!
58
Lowlevel-Coding / Eigener C++ Compiler
« am: 11. March 2006, 22:33 »
kann dein compiler eventl 16 bit code erzeugen? das waere naemlich super!
59
Lowlevel-Coding / 16 bit x86 c compiler
« am: 11. March 2006, 21:45 »
keiner ne ahnung was es da haben koennte?
60
Lowlevel-Coding / 16 bit x86 c compiler
« am: 09. March 2006, 18:51 »
hi!

kann ich mit dem gcc 16 bit C code erzeugen? waenn ja wie? ich hab bei google nichts gefunden!

/*edit*/
ich hab mir nun von dem bcc folgenden asm code generieren lassen:
(die c datei:

/*nur mal n experimenteller abgeschriebener code*/
int main(){
    char *text = "Hi I am the Railex Kernel";
    char *vidMem = (char*) 0xB800;
   
    while(*text){
*vidMem = *text;
*vidMem++;
*vidMem = 7;
*vidMem++;
*text++;
    }

    return 0;
}

)

! 1
! 1 /* kernel
! 2  *
! 3  *
! 4  *
! 5  *
! 6  *
! 7  */
! 8
! 9 int main(){
export _main
_main:
! 10     char *text = "Hi I am the Railex Kernel";
push bp
mov bp,sp
push di
push si
dec sp
dec sp
mov bx,#.1
mov -6[bp],bx
! 11     char *vidMem = (char*) 0xB800;
dec sp
dec sp
mov ax,#$B800
mov -8[bp],ax
! 12    
! 13     while(*text){
jmp .3
.4:
! 14 *vidMem = *text;
mov bx,-6[bp]
mov si,-8[bp]
mov al,[bx]
mov [si],al
! 15 *vidMem++;
inc word ptr -8[bp]
mov bx,-8[bp]
mov al,*7
mov [bx],al
! 17 *vidMem++;
inc word ptr -8[bp]
mov bx,-8[bp]
! 18 *text++;
inc word ptr -6[bp]
.3:
mov bx,-6[bp]
mov al,[bx]
test al,al
jne .4
.5:
.2:
xor ax,ax
add sp,*4
pop si
pop di
pop bp
ret
! 22 }
! 23
.data
.1:
.6:
.ascii "Hi I am the Railex Kernel"
.byte 0
.bss
! 0 errors detected


dann hab ich dieses mit folgenden zeilen assembliert und gelinkt:
as86 -0 kernel.asm -o kernel --> assembliert(dieses -0 bedeuted laut man page: -0     start with 16-bit code segment, warn for all instructions > 8086)
ld86 kernel.o -> zu a.out gelinkt

dann hab ich das auf die diskette gepackt mit einem selbst geschriebenen programm das die datei nach den ersten 512 bytes der diskette kopiert

(mein bootloader funkt 100pro da ich mit diesem schon nen asm kernel booten konnte!)

waenn ich meinen pc nun starte und die disk einlege dann kommen die meldungen von meinem bootloader und dann macht mein pc nichts mehr :-(

was kann es da haben ?

danke!
Seiten: 1 2 [3] 4

Einloggen