Toon posts:

[ASM][C++]C++ kernel laden via Assembly Bootloader

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo iedereen!

Ik ben bezig met 't maken van een OS, en ik heb een kernel geschreven in C++, en die wil ik met deze bootloader laden:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[BITS 32]
[ORG 0x7C00]

; Main program
main:
 mov ax,0x0000
 mov ds,ax
 
 ;Load kernel
 ;Hierzo moet de kernel worden geladen

jmp $

; End Matter
times 510-($-$$) db 0   ; Fill the rest with zeros
dw 0xAA55       ; Boot loader signature


Ik schrijf de kernel in C++ met de volgende compiler-command (of hoe noem je dat :? ):
-c *.cpp -ffreestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions

De kernel-source staat hier (3 bestanden):
Video.h:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef VIDEO_H
#define VIDEO_H
class Video
{
public:
Video() ;
void clear() ;
void write(char *cp) ;
void put(char c) ;
private:
unsigned short *videomem ; //pointer to video memory
unsigned int off ; //offset, used like a y cord
unsigned int pos ; //position, used like x cord
};
#endif

Video.cpp:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "Video.h"
Video::Video()
{
pos=0 ; off=0 ;
videomem = (unsigned short*) 0xb8000 ;
}
void Video::clear()
{
unsigned int i;
for(i=0; i<(80*25); i++)
{
videomem[i] = (unsigned char) ' ' | 0x0700 ;
}
pos=0 ; off=0 ;
}
void Video::write(char *cp)
{
char *str = cp, *ch;
for (ch = str; *ch; ch++)
{
put(*ch) ;
}
}
void Video::put(char c)
{
if(pos>=80)
{
pos=0 ;
off += 80 ;
}
if(off>=(80*25))
{
clear() ; //should scroll the screen, but for now, just clear
}
videomem[off + pos] = (unsigned char) c | 0x0700 ;
pos++ ;
}

C++:
1
2
3
4
5
6
#include "Video.h"
int main(void)
{
Video vid ; //local, (global variables need some Run-Time support code)
vid.write("Hello, world!") ;
}


De kernel compilen lukt, de bootloader ook maar ik moet alleen nog zorgen hoe ik de kernel ermee kan laden. Als iemand weet hoe dit moet, dan dank ik zeer _/-\o_ . Ik heb gegoogled maar ik kon echt niks vinden :( .

Alvast bedankt!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

een OS schrijven is niet echt simpele materie ofzoiets, en de code die jij hier geeft overtuigen mij niet echt van voldoende kennis :)

je gaat om te beginnen allerlei dingen moeten initializeren voordat je je PC zover krijgt om ook maar iets te doen :)

bijvoorbeeld jouw mooie C++ programma, door wat gaat dat opgestart worden?

-niks-


  • Oguz286
  • Registratie: Juni 2002
  • Laatst online: 23-02 10:10
Ik neem aan dat je c++ code 32-bits is, dus je mag voordat je ook maar aan het laden van kernels denkt eerst eens overschakelen naar protected mode, door o.a. de A20 lijn aan te zetten, de global descriptor table te vullen met fatsoenlijke waarden (door te kijken hoe je je geheugen wil indelen m.b.v. segmentatie), interrupts uit te schakelen (en niet in te schakelen voordat je protected mode interrupts hebt geinitialiseerd) en eventueel paging aanzetten.

Als dit hierboven als abracadabra klinkt, dan moet je je nog behoorlijk wat verdiepen in bootloaders voordat je ook maar aan kernels kunt denken. Een goede bootloader schrijven is een heel stuk moeilijker dan een simpele kernel schrijven.

[ Voor 10% gewijzigd door Oguz286 op 20-11-2008 18:23 ]


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
Er is ooit een tutorial geweest op T.net hoe je je eigen OSje maakt. Ik zou even de search gebruiken en kijken of je dat nog kan vinden.

~ Mijn prog blog!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Oguz286
  • Registratie: Juni 2002
  • Laatst online: 23-02 10:10
[Alg] Hoe werkt een OS en hoe schrijf ik er zelf een? O-)

Helaas nooit verder mee gegaan. Wil het nog wel een keer doen, maar wanneer? :X

Oh wat stom van me, was het helemaal vergeten: Waarom gebruik je niet grub als bootloader? Hier wordt het een en ander uitgelegd.

[ Voor 70% gewijzigd door Oguz286 op 20-11-2008 19:13 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Sowieso klopt je bootloader niet. Je zegt tegen je assembler dat het 32 bits code is, maar bootcode is 16 bits (real mode)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor de tips allemaal, vooral die van GRUB van Oguz286. Dat ik daar niet eerder aan heb gedacht, GRUB.

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Je kan ook proberen om een open-source bootloader te gebruiken.
Ik weet niet welk platform je in gedachten hebt, maar voor veel bordjes kun je bvb U-boot gebruiken.

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja, ik gebruik ook GRUB
Pagina: 1