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

Seiten: 1 [2] 3
21
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 17. September 2013, 16:37 »
Hallo,
ich habe den Kernel abgeändert, sodass er VGA nutzt und eigentlich ein Pixel der Position x=10 und y=10 blau färben müsste. Nun tut er dies leider nicht. Es kommt einfach ein schwarzer Bildschirm, wo nur steht, dass das BIOS geladen wurde. Der QEMU-log ist genauso wie vorher! Das Compilen ging fehlerfrei. Es gabe lediglich 3 warnungen auf unbenutze Werte. Das ist aber normal. Ich hoffe ihr könnt mir noch einmal helfen. Solbalt ich ein pixel erfolgreich gefärbt habe komme ich vorerst alleine weiter. Hier mein Code:

asmKernel.asm:
global loader ; Unser Einsprungspunkt
extern kernelMain ; kernelMain() aus Kernel.cpp
extern initialiseConstructors ; aus Startup.cpp
 
FLAGS    equ 0
MAGIC    equ 0x1BADB002 ; Magicnumber - Erkennungsmerkmal für GRUB
CHECKSUM equ -(MAGIC + FLAGS) ; Checksum
 
section .text
align 4
MultiBootHeader:
  dd MAGIC        ; Magic number
  dd FLAGS        ; Flags
  dd CHECKSUM    ; Checksum
 
loader:
  mov esp,0x200000 ; Stack an die 2MB-Grenze platzieren
  push eax          ; Multiboot-Magicnumber auf den Stack legen
  push ebx          ; Adresse der Multiboot-Structure auf den Stack legen
  call initialiseConstructors    ; Konstruktoren aufrufen
  call kernelMain      ; kernelMain aufrufen
 
stop:
  jmp stop

Kernel.cpp:
// Einbinden unseres Header
#include "Video.h"
#include "Multiboot.h"
#include "stdio.h"
 
extern "C" void kernelMain(const Multiboot& multiboot_structur,
                           uint32_t multiboot_magic);
 
void kernelMain(const Multiboot& multiboot_structur,
                uint32_t multiboot_magic)
{
  if (multiboot_magic != MULTIBOOT_MAGIC)
  {
    // Fehler!
//screen << background(color::light_gray) << color::blue << "Loading BOS(S)-Kernel...";
    return;
  }

}

link.txt:
ENTRY(loader)
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)

SECTIONS
{
  . = 0x0100000;

  .text :
  {
    *(.text*)
    *(.rodata)
  }

  .data  :
  {
    start_ctors = .;
    *(.ctors)
    end_ctors = .;

    *(.data)
  }

  .bss  :
  {
    *(.bss)
  }

  /DISCARD/ : { *(.dtors) *(.comment) }
}

Multiboot.h:
#ifndef MULTIBOOT_H
#define MULTIBOOT_H
 
#include "stdint.h"
 
#define MULTIBOOT_MAGIC 0x2BADB002
 
struct Multiboot
{
  uint32_t flags;
  uint32_t mem_lower;
  uint32_t mem_upper;
  uint32_t bootdevce;
  uint32_t cmdline;
  uint32_t module_count;
  uint32_t module_address;
  /* etc... */
} PACKED;
 
#endif

Startup.cpp:
typedef void (*constructor)();
 
// Im Linkerskript definiert
extern "C" constructor start_ctors;
extern "C" constructor end_ctors;
 
extern "C" void initialiseConstructors();
 
// Ruft die Konstruktoren für globale/statische Objekte auf
void initialiseConstructors()
{
  for (constructor* i = &start_ctors;i != &end_ctors;++i)
    (*i)();
}

stdint.h:
/* ISO C9x  7.18  Integer types <stdint.h>
 * Based on ISO/IEC SC22/WG14 9899 Committee draft (SC22 N2794)
 *
 *  THIS SOFTWARE IS NOT COPYRIGHTED
 *
 *  Contributor: Danny Smith <danny_r_smith_2001@yahoo.co.nz>
 *
 *  This source code is offered for use in the public domain. You may
 *  use, modify or distribute it freely.
 *
 *  This code is distributed in the hope that it will be useful but
 *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
 *  DISCLAIMED. This includes but is not limited to warranties of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 *  Date: 2000-12-02
 */


#ifndef _STDINT_H
#define _STDINT_H
#define __need_wint_t
#define __need_wchar_t
#include <stddef.h>

/* 7.18.1.1  Exact-width integer types */
typedef signed char int8_t;
typedef unsigned char   uint8_t;
typedef short  int16_t;
typedef unsigned short  uint16_t;
typedef int  int32_t;
typedef unsigned   uint32_t;

/* 7.18.1.2  Minimum-width integer types */
typedef signed char int_least8_t;
typedef unsigned char   uint_least8_t;
typedef short  int_least16_t;
typedef unsigned short  uint_least16_t;
typedef int  int_least32_t;
typedef unsigned   uint_least32_t;

/*  7.18.1.3  Fastest minimum-width integer types
 *  Not actually guaranteed to be fastest for all purposes
 *  Here we use the exact-width types for 8 and 16-bit ints.
 */
typedef signed char int_fast8_t;
typedef unsigned char uint_fast8_t;
typedef short  int_fast16_t;
typedef unsigned short  uint_fast16_t;
typedef int  int_fast32_t;
typedef unsigned  int  uint_fast32_t;

/* 7.18.1.4  Integer types capable of holding object pointers */

#ifndef _INTPTR_T_DEFINED
#define _INTPTR_T_DEFINED
#ifdef _WIN64
  typedef __int64 intptr_t;
#else
  typedef int intptr_t;
#endif
#endif

#ifndef _UINTPTR_T_DEFINED
#define _UINTPTR_T_DEFINED
#ifdef _WIN64
  typedef unsigned __int64 uintptr_t;
#else
  typedef unsigned int uintptr_t;
#endif
#endif

/* 7.18.2  Limits of specified-width integer types */
#if !defined ( __cplusplus) || defined (__STDC_LIMIT_MACROS)

/* 7.18.2.1  Limits of exact-width integer types */
#define INT8_MIN (-128)
#define INT16_MIN (-32768)
#define INT32_MIN (-2147483647 - 1)
#define INT64_MIN  (-9223372036854775807LL - 1)

#define INT8_MAX 127
#define INT16_MAX 32767
#define INT32_MAX 2147483647
#define INT64_MAX 9223372036854775807LL

#define UINT8_MAX 0xff /* 255U */
#define UINT16_MAX 0xffff /* 65535U */
#define UINT32_MAX 0xffffffff  /* 4294967295U */
#define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */

/* 7.18.2.2  Limits of minimum-width integer types */
#define INT_LEAST8_MIN INT8_MIN
#define INT_LEAST16_MIN INT16_MIN
#define INT_LEAST32_MIN INT32_MIN
#define INT_LEAST64_MIN INT64_MIN

#define INT_LEAST8_MAX INT8_MAX
#define INT_LEAST16_MAX INT16_MAX
#define INT_LEAST32_MAX INT32_MAX
#define INT_LEAST64_MAX INT64_MAX

#define UINT_LEAST8_MAX UINT8_MAX
#define UINT_LEAST16_MAX UINT16_MAX
#define UINT_LEAST32_MAX UINT32_MAX
#define UINT_LEAST64_MAX UINT64_MAX

/* 7.18.2.3  Limits of fastest minimum-width integer types */
#define INT_FAST8_MIN INT8_MIN
#define INT_FAST16_MIN INT16_MIN
#define INT_FAST32_MIN INT32_MIN
#define INT_FAST64_MIN INT64_MIN

#define INT_FAST8_MAX INT8_MAX
#define INT_FAST16_MAX INT16_MAX
#define INT_FAST32_MAX INT32_MAX
#define INT_FAST64_MAX INT64_MAX

#define UINT_FAST8_MAX UINT8_MAX
#define UINT_FAST16_MAX UINT16_MAX
#define UINT_FAST32_MAX UINT32_MAX
#define UINT_FAST64_MAX UINT64_MAX

/* 7.18.2.4  Limits of integer types capable of holding
    object pointers */
#ifdef _WIN64
#define INTPTR_MIN INT64_MIN
#define INTPTR_MAX INT64_MAX
#define UINTPTR_MAX UINT64_MAX
#else
#define INTPTR_MIN INT32_MIN
#define INTPTR_MAX INT32_MAX
#define UINTPTR_MAX UINT32_MAX
#endif

/* 7.18.2.5  Limits of greatest-width integer types */
#define INTMAX_MIN INT64_MIN
#define INTMAX_MAX INT64_MAX
#define UINTMAX_MAX UINT64_MAX

/* 7.18.3  Limits of other integer types */
#define PTRDIFF_MIN INTPTR_MIN
#define PTRDIFF_MAX INTPTR_MAX

#define SIG_ATOMIC_MIN INTPTR_MIN
#define SIG_ATOMIC_MAX INTPTR_MAX

#define SIZE_MAX UINTPTR_MAX

#ifndef WCHAR_MIN  /* also in wchar.h */
#define WCHAR_MIN 0
#define WCHAR_MAX 0xffff /* UINT16_MAX */
#endif

/*
 * wint_t is unsigned short for compatibility with MS runtime
 */
#define WINT_MIN 0
#define WINT_MAX 0xffff /* UINT16_MAX */

#endif /* !defined ( __cplusplus) || defined __STDC_LIMIT_MACROS */


/* 7.18.4  Macros for integer constants */
#if !defined ( __cplusplus) || defined (__STDC_CONSTANT_MACROS)

/* 7.18.4.1  Macros for minimum-width integer constants

    Accoding to Douglas Gwyn <gwyn@arl.mil>:
"This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC
9899:1999 as initially published, the expansion was required
to be an integer constant of precisely matching type, which
is impossible to accomplish for the shorter types on most
platforms, because C99 provides no standard way to designate
an integer constant with width less than that of type int.
TC1 changed this to require just an integer constant
*expression* with *promoted* type."
*/

#define INT8_C(val) val
#define UINT8_C(val) val
#define INT16_C(val) val
#define UINT16_C(val) val

#define INT32_C(val) val
#define UINT32_C(val) val##U
#define INT64_C(val) val##LL
#define UINT64_C(val) val##ULL

/* 7.18.4.2  Macros for greatest-width integer constants */
#define INTMAX_C(val)  INT64_C(val)
#define UINTMAX_C(val) UINT64_C(val)

#endif  /* !defined ( __cplusplus) || defined __STDC_CONSTANT_MACROS */

#endif

Video.cpp:
#include "Video.h"

Video screen;

Video::Video()
  : m_videomem((uint16_t*) 0xA0000 ), m_color(0x0700)
{
  clear();
}
 
Video::~Video(){
}
 
void Video::clear(){
  setpixel(10, 10, color::blue);
}
 
Video& Video::operator << (const char* s){

  return *this;
}
 
Video& Video::operator << (color::type color){

  return *this;
}
 
Video& Video::operator << (const background& color){

  return *this;
}

void Video::setpixel(int x, int y, color::type color) {
  int offset;
  if(0 <= x && x < 320) {
    if(0 <= y && y < 200) {
      offset = 320*y + x;
      m_videomem[offset] = color;
    }
  }
}

Video.h:
#ifndef VIDEO_H
#define VIDEO_H
 
#include "stdint.h"
 
namespace color
{
  enum type
  {
    black         = 0x00,
    blue          = 0x01,
    green         = 0x02,
    cyan          = 0x03,
    red           = 0x04,
    magenta       = 0x05,
    brown         = 0x06,
    light_gray    = 0x07,
    dark_gray     = 0x08,
    light_blue    = 0x09,
    light_green   = 0x0A,
    light_cyan    = 0x0B,
    light_red     = 0x0C,
    light_magenta = 0x0D,
    yellow        = 0x0E,
    white         = 0x0F
  };
}
 
struct background
{
  inline background(color::type color)
    : m_color(color){}
 
  color::type m_color;
};
 
class Video
{
  public:
    // Konstruktor
    Video();
 
    // Destruktor
    ~Video();
 
    // Leeren des Bildschirms, die Größe beträgt 80x25 Zeichen
    void clear();
 
    // Textausgabe
    Video& operator << (const char* s);
 
    // Vordergrundfarbe setzen
    Video& operator << (color::type color);
 
    // Hintergrundfarbe setzen
    Video& operator << (const background& color);
 
    // Ausgabe eines einzelnen Zeichens
    void setpixel(int x, int y, color::type color);
 
  private:
    // Zeiger auf den Videospeicher
    uint16_t* m_videomem;
 
    // FB/BG-Farbe
    uint16_t m_color;
};
 
// Globale Instanz der Video-Klasse, Definition in Video.cpp
extern Video screen;
 
#endif
22
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 16. September 2013, 21:51 »
So ist es aber nicht. Entweder Textmodus oder Grafikmodus. Wenn du Text im Grafikmodus darstellen willst, musst du die Zeichen Pixel für Pixel malen. Pixelgrafik im Textmodus ist nicht möglich. Du musst also zunächst in den Grafikmodus schalten, wenn du das haben willst.

Das heißt, dass wenn ich auch nur einen Mauszeiger machen will, muss jeden einzelnen Buchstaben mit jedem einelnem Pixel setzen  :-o
Ich glaube fange dann doch erst mit der Tastatur an  :|
23
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 16. September 2013, 21:09 »
Wäre auch zu schön gewesen hätte es funktioniert  :-)
Liegt es daran, dass ich in text mode und in 13h mode was machen wollte?
Das liegt daran, dass du Copy-Paste-gesündigt hast ;) Stell dir mal folgende Frage: Wieso hätte es funktionieren sollen? Du befindest dich im Textmodus und versuchst Pixel zu setzen.

Nunja ich befinde mich ja nicht nur im Textmodus. Ich hab einmal den Textmodus zum Text-anzeigenlassen. Und einmal den 13h(VGA)-Modus indem ich versucht habe Pixel zu setzen. Ich dachte es wäre so wie in XNA(C#). Dort kann man einfach die Ebenden überschreiben.(Text und 3d-View) :-D Wie kann ich denn beides machen? Wenn ich nur 13h-Modus nehme kann ich ja kein Text mehr darstellen...
So so sieht meine Video.cpp aus:
#include "Video.h"

Video screen;

Video::Video()
  : m_videomem((uint16_t*) 0xB8000 ), m_off(0), m_pos(0), m_color(0x0700)
{
  //Bildschirm leeren
  clear();
}
 
 //Pointer auf den Speicher
unsigned char* VGA = (unsigned char*) 0xA0000;

void setpixel(int x, int y, unsigned char color) {
  int offset;
  if(0 <= x && x < 320) {
    if(0 <= y && y < 200) {
      offset = 320*y + x;
      VGA[offset] = color;
    }
  }
}
 
Video::~Video(){
}
 
void Video::clear(){
  // Füllen des Bildschirms mit Leerzeichen
  for(int i = 0;i < (80*25);i++)
    m_videomem[i] = (unsigned char)' ' | m_color;
 
  // Zurücksetzen der Textausgabe nach links oben
  m_pos = 0;
  m_off = 0;

  setpixel(10, 10, '4');
}
 
Video& Video::operator << (const char* s){
  // Für jedes einzelne Zeichen wird put() aufgerufen
  bool checkfores = false, draw = true;
  char es = '0';
  while (*s != '\0')
  {
draw = true;
    if(checkfores == true)
{
  es = *s;
}
if(es == 'n' && checkfores == true)
{
  m_off+=80; //newline
  m_pos=0;
  checkfores = false;
  draw = false;
}
    if(*s == '#')
    {
  checkfores = true;
    }
else if (*s != '#' && draw == true)
{
  put(*s);
}
*s++;
  }
  return *this;
}
 
Video& Video::operator << (color::type color){
  m_color = (static_cast<uint16_t>(color) << 8) | (m_color & 0xF000);
  return *this;
}
 
Video& Video::operator << (const background& color){
  m_color = (static_cast<uint16_t>(color.m_color) << 12) | (m_color & 0x0F00);
  return *this;
}
 
void Video::put(char c){
  // Wenn die Textausgabe den rechten...
  if(m_pos >= 80){ //Zeile voll
    m_pos = 0;
    m_off += 80;
  }
 
  // ...oder den unteren Bildschirmrand erreicht, gibt es
  // einen Umbruch bzw. es wird aufgeräumt.
  if(m_off >= (80*25)) //Bildschirm voll
    clear();
 
  // Setzen des Zeichens und der Farbe in den Videospeicher
  m_videomem[m_off + m_pos] = (uint16_t)c | m_color;
  m_pos++;
}
Die Video.h kannst du aus http://www.lowlevel.eu/w/index.php?title=C%2B%2B-Kernel_mit_GRUB&oldid=11074#Kernel nehmen.
24
Softwareentwicklung / Re: [All In One]-Question lolxdfly
« am: 16. September 2013, 19:55 »
Zu Frage 2: Um Pixel anzuzeigen kannst du dich entweder mit VESA rumärgern, welches nur so lala funktioniert aber einen riesen Aufwand bedeutet, oder einen Grafiktreiber schreiben, was noch wesentlich mehr Aufwand bedeutet.

Hab das hier gefunden:
//Pointer auf den Speicher
unsigned char* VGA = (unsigned char*) 0xA0000;

void setpixel(int x, int y, unsigned char color) {
  int offset;
  if(0 <= x && x < 320) {
    if(0 <= y && y < 200) {
      offset = 320*y + x;
      VGA[offset] = color;
    }
  }
}
Wäre auch zu schön gewesen hätte es funktioniert  :-)
Liegt es daran, dass ich in text mode und in 13h mode was machen wollte?


Zu Frage 0: Wenn Tante Google da nichts findet, dürfte die Wahrscheinlichkeit eher gering sein. Außerdem hat es schon seine Gründe, warum man einen Kernel in C ohne die beiden + schreibt. Aber letztenendlich dürfte es kein Problem darstellen einen C-Kernel in C++ nachzuprogrammieren, der Code könnte sogar fast der selbe sein (es zwingt dich ja keiner dazu Klassen zu verwenden). Das einzige Problem das ich immo sehe ist dass der Inline-Assembler wegfällt, womit du diesen Code als Funktionen in eine eigene Datei stecken musst.

Soll ich auf C umsteigen? Bis jetzt hatte ich mit C nur Probleme. Außerdem lernen wir in der Schule grade c++. Wobei wir da erstmal lernen was cin und cout ist -.-
25
Softwareentwicklung / [All In One]-Question lolxdfly
« am: 16. September 2013, 17:45 »
Hi,
danke erstmal an alle, die mir bis jetzt schon geholfen haben.
Da sich bei mir viele Fragen bezüglich des C++-Kernel anhäufen habe ich mal eine AllInOne-Question erstellt  :-D
Den Code hab ich aber größtenteils verstanden! Im momment ist der Kernel noch fast unverändert. Ich habe nur die stdint.h anstatt die types.h verwendent. Außerdem habe ich die newline-Escape-Sequenz(#n) hinzugefügt.
Ich habe ich 5 Fragen mit absteigender Priorität:

Frage 0: Gibt es irgendwo eine TuT-Reihe, wo ein C++-Kernel fortgesetzt und erklärt wird? Inaktiv

Frage 1: Wie kann man die Tastatur im Kernel nutzen? Gibt es vorgefertigte libs, die ich dafür verwenden kann?? Ich habe nur 1 TuT gefunden. Das war allerdings nur schwer zu verstehen... Gelöst!

Frage 2: Wie kann man Bilder anzeigen lassen/ einzelne Pixel färben? Ich habe es mit der Pixeltoaster-lib(systemunabhängig) versucht. Hat aber nur errors ausgespuckt. Inaktiv

Frage 3: Wie ist der QEMU-log zu verstehen? (http://pastebin.com/4vUfBPpr) Gelöst!

Frage 4: Wie kann man die Maus im Kernel nutzen? Ist nur nötig, wenn Frage 1+2 schon beantwortet wurden und funktionieren! Inaktiv
26
Softwareentwicklung / Re: GRUB4DOS C++Kernel
« am: 09. September 2013, 16:21 »
ES FUNKTIONIERT!!!!  :-)

Ich kann nicht genau sagen, woran es gelegen hat Höchstwahrscheinlich haben sich MinGW-sachen mit dem CrossCompiler vermischt. Nachdem ich alles neu gemacht hatte hats gefunzt.
Trotzdem Danke
27
Softwareentwicklung / Re: GRUB4DOS C++Kernel
« am: 08. September 2013, 23:17 »
Hmmm Ist denn meine Startup.cpp richtig?? Als linkerscript hab ich ja den älteren genommen. Kann es daran liegen? Bei dem älteren TuT, wo der linkerscript her kommt hat sich aber nichts am anderen Code geändert. Wenn das TuT korrekt ist, müsste es also am StartupCode liegen. Den hab ich ja von einem anderen Thread... Dort wurde der Code von http://www.lowlevel.eu/wiki/C%2B%2B#globale.2Fstatische_Objekte entnommen.
28
Softwareentwicklung / Re: GRUB4DOS C++Kernel
« am: 08. September 2013, 22:13 »
Ahh da musst man das also setzen.
Bei
loader:
  endlosschleife
  jmp endlosschleife
läuft es!!!

Bei
  push ebx          ; Adresse der Multiboot-Structure auf den Stack legen
  call initialiseConstructors    ; Konstruktoren aufrufen
  call kernelMain      ; kernelMain aufrufen
  endlosschleife
  jmp endlosschleife
läuft es nicht.

Und bei
  push ebx          ; Adresse der Multiboot-Structure auf den Stack legen
  call initialiseConstructors    ; Konstruktoren aufrufen
  endlosschleife
  jmp endlosschleife
  call kernelMain      ; kernelMain aufrufen
läuft es nicht.

Also hat die Startup.cpp einen Fehler!!
29
Softwareentwicklung / Re: GRUB4DOS C++Kernel
« am: 08. September 2013, 20:42 »
Ich habe jetzt an verschiedenen Stellen Endlosschleifen gesetzt. Z.B.:
global loader ; Unser Einsprungspunkt
ENDLOSSCHLEIFE:
extern kernelMain ; kernelMain() aus Kernel.cpp
jmp ENDLOSSCHLEIFE
extern initialiseConstructors ; aus Startup.cpp
...
Hoffe mal das war so richtig  :-D
Hat leider nichts ergeben :( Immer noch ein schwarzer flackender Bildschirm. Manchmal ein kurzes aufleuchten von hellblauer Schrift, aber das war vorher auch schon...
30
Softwareentwicklung / Re: GRUB4DOS C++Kernel
« am: 08. September 2013, 17:58 »
Hi,
das würde ja heißen, dass das TuT aus dem wiki Fehler hat  :-o
Naja egal. Wie ändere ich die 16-Bit Farben in 8-Bit?
Soll ich einfach   m_color = (static_cast<uint16_t>(color) << 8) | (m_color & 0xF000); in   m_color = (static_cast<uint8_t>(color) << 8) | (m_color & 0xF000); umändern?
Falls ja hat es nix genützt. Ich benutze jetzt die <stdint.h>. Ein paar einträge mit long musst ich enfernen, weil sie Fehler verursacht haben.

Zu:
Ansonsten bekommt deine main-Funktion ein "const Multiboot&" übergeben, was aber eigentlich nur ein Pointer auf deine Multiboot-Struktur ist; in C wäre das "struct multiboot *mb" Ob das aber ein Problem ist, kann ich nicht einschätzen, weil meine C++-Kenntnisse (so sie jemals nennenswert vorhanden waren) nur dürftig sind.
Da hab ich so genau auch keine Ahnung. Bei Compilen sagt er da etwas davon:
Zitat
Kernel.cpp:8:6: Warnung: unbenutzter Parameter >>multiboot_structur<< [-Wunused-parameter]

In diesem Stadium sind Endlosschleifen als Debugmittel ganz gut geeignet. Setz mal eine direkt vor deinen Konstrukturaufruf und schaue, ob es immernoch ständig resettet. Und so weiter.
Meinst du diesen?: Video screen; Wie will ich den in eine Endlosschleife packen? O.o

PS: Ich werde wohl ein paar Kapitel in C++ nachholen müssen...
31
Softwareentwicklung / Re: GRUB4DOS C++Kernel
« am: 08. September 2013, 13:56 »
Habe den Code von dem oben genannten TuT genommen. Startup.cpp hab ich von http://www.lowlevel.eu/wiki/C%2B%2B

asmKernel.asm:
global loader ; Unser Einsprungspunkt
extern kernelMain ; kernelMain() aus Kernel.cpp
extern initialiseConstructors ; aus Startup.cpp
 
FLAGS    equ 0
MAGIC    equ 0x1BADB002 ; Magicnumber - Erkennungsmerkmal für GRUB
CHECKSUM equ -(MAGIC + FLAGS) ; Checksum
 
section .text
align 4
MultiBootHeader:
  dd MAGIC        ; Magic number
  dd FLAGS        ; Flags
  dd CHECKSUM    ; Checksum
 
loader:
  mov esp,0x200000 ; Stack an die 2MB-Grenze platzieren
  push eax          ; Multiboot-Magicnumber auf den Stack legen
  push ebx          ; Adresse der Multiboot-Structure auf den Stack legen
  call initialiseConstructors    ; Konstruktoren aufrufen
  call kernelMain      ; kernelMain aufrufen
 
stop:
  jmp stop

Kernel.cpp:
// Einbinden unseres Header
#include "Video.h"
#include "Multiboot.h"
 
extern "C" void kernelMain(const Multiboot& multiboot_structur,
                           uint32_t multiboot_magic);
 
void kernelMain(const Multiboot& multiboot_structur,
                uint32_t multiboot_magic)
{
  if (multiboot_magic != MULTIBOOT_MAGIC)
  {
    // Fehler!
    screen << background(color::red) << color::white << "Fehler: Nicht von einem multibootfaehigem Bootloader geladen!";
    return;
  }
 
  // Textausgabe
  screen << background(color::light_gray) << color::blue << "Willkommen im C++-TestKernel!";
}

Multiboot.h:
#ifndef MULTIBOOT_H
#define MULTIBOOT_H
 
#include "types.h"
 
#define MULTIBOOT_MAGIC 0x2BADB002
 
struct Multiboot
{
  uint32_t flags;
  uint32_t mem_lower;
  uint32_t mem_upper;
  uint32_t bootdevce;
  uint32_t cmdline;
  uint32_t module_count;
  uint32_t module_address;
  /* etc... */
} PACKED;
 
#endif

Startup.cpp:
typedef void (*constructor)();
 
// Im Linkerskript definiert
extern "C" constructor start_ctors;
extern "C" constructor end_ctors;
 
extern "C" void initialiseConstructors();
 
// Ruft die Konstruktoren für globale/statische Objekte auf
void initialiseConstructors()
{
  for (constructor* i = &start_ctors;i != &end_ctors;++i)
    (*i)();
}

types.h:
#ifndef TYPES_H
#define TYPES_H
 
/* Garantiert, dass ein Typ nicht gepaddet wird und somit exakt die Größe seiner Member hat */
#define PACKED __attribute__((packed))
 
typedef unsigned char  uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int   uint32_t;
 
#endif

Video.cpp:
#include "Video.h"
 
Video screen;
 
Video::Video()
  : m_videomem((uint16_t*) 0xb8000), m_off(0), m_pos(0), m_color(0x0700)
{
  //Bildschirm leeren
  clear();
}
 
Video::~Video(){
}
 
void Video::clear(){
  // Füllen des Bildschirms mit Leerzeichen
  for(int i = 0;i < (80*25);i++)
    m_videomem[i] = (unsigned char)' ' | m_color;
 
  // Zurücksetzen der Textausgabe nach links oben
  m_pos = 0;
  m_off = 0;
}
 
Video& Video::operator << (const char* s){
  // Für jedes einzelne Zeichen wird put() aufgerufen
  while (*s != '\0')
    put(*s++);
 
  return *this;
}
 
Video& Video::operator << (color::type color){
  m_color = (static_cast<uint16_t>(color) << 8) | (m_color & 0xF000);
  return *this;
}
 
Video& Video::operator << (const background& color){
  m_color = (static_cast<uint16_t>(color.m_color) << 12) | (m_color & 0x0F00);
  return *this;
}
 
void Video::put(char c){
  // Wenn die Textausgabe den rechten...
  if(m_pos >= 80){
    m_pos = 0;
    m_off += 80;
  }
 
  // ...oder den unteren Bildschirmrand erreicht, gibt es
  // einen Umbruch bzw. es wird aufgeräumt.
  if(m_off >= (80*25))
    clear();
 
  // Setzen des Zeichens und der Farbe in den Videospeicher
  m_videomem[m_off + m_pos] = (uint16_t)c | m_color;
  m_pos++;
}

Video.h:
#ifndef VIDEO_H
#define VIDEO_H
 
#include "types.h"
 
namespace color
{
  enum type
  {
    black         = 0x00,
    blue          = 0x01,
    green         = 0x02,
    cyan          = 0x03,
    red           = 0x04,
    magenta       = 0x05,
    brown         = 0x06,
    light_gray    = 0x07,
    dark_gray     = 0x08,
    light_blue    = 0x09,
    light_green   = 0x0A,
    light_cyan    = 0x0B,
    light_red     = 0x0C,
    light_magenta = 0x0D,
    yellow        = 0x0E,
    white         = 0x0F
  };
}
 
struct background
{
  inline background(color::type color)
    : m_color(color){}
 
  color::type m_color;
};
 
class Video
{
  public:
    // Konstruktor
    Video();
 
    // Destruktor
    ~Video();
 
    // Leeren des Bildschirms, die Größe beträgt 80x25 Zeichen
    void clear();
 
    // Textausgabe
    Video& operator << (const char* s);
 
    // Vordergrundfarbe setzen
    Video& operator << (color::type color);
 
    // Hintergrundfarbe setzen
    Video& operator << (const background& color);
 
    // Ausgabe eines einzelnen Zeichens
    void put(char c);
 
  private:
    // Zeiger auf den Videospeicher
    uint16_t* m_videomem;
 
    // Y-Position der Textausgabe, je volle Zeile +80
    unsigned int m_off;
 
    // X-Position der Textausgabe, ab Zeilenanfang
    unsigned int m_pos;
 
    // FB/BG-Farbe
    uint16_t m_color;
};
 
// Globale Instanz der Video-Klasse, Definition in Video.cpp
extern Video screen;
 
#endif
32
Softwareentwicklung / Re: GRUB4DOS C++Kernel
« am: 08. September 2013, 11:53 »
Außerdem ist der .bxrc zu entnehmen, dass gar kein Image geladen werden soll.
Ja, habe ich auch gemerkt! Wenn es versuche zu starten und es dann fehlschlägt entfernt er den Eintrag mit dem Image -.-

Hallo,

das Log besagt, dass weder Diskette, noch Festplatte noch CD-Laufwerk bootfähig sind, also dein Image nicht funktioniert. Für multiboot-Kernel ist der einfachste Bootloader allerdings in Qemu integriert (qemu -kernel kernel.bin), der kann auch multiboot-Module.

Für Images gibt es verschiedene Möglichkeiten, wobei Grub am flexibelsten einsetzbar ist. Persönlich finde ich Syslinux (FAT) und Isolinux (CDs) allerdings einfacher zu handhaben, wobei für das alles ein Windows-Host insgesamt nicht unbedingt optimal ist.

Gruß,
Svenska
Ich hab jetzt versuch den Kernel mit
Zitat
qemu -d int -kernel kernel.bin
zu starten. Gleiches Ergebnis...
Log von qemu ist im Anhang. Wenn das Image nicht bootfähig ist, warum läuft es dann auf dem limbo-emulator  :?

EDIT: hab grade ein Eintrag in der stderr.txt gefunden:
Zitat
Could not open option rom 'multiboot.bin': No such file or directory
In \optionrom\ liegt aber eine multiboot.bin!

EDIT2: hab jetzt die multiboot.bin in das gleiche verzeichniss wie qemu gelegt. Jetzt ist der Error weg, trotzdem kommt ein schwarzer bildschirm. Anscheinend versucht er immer wieder neu den kernel zu laden. Sieht man auch am log. Der log wird zugemüllt und alles wiederholt sich!
33
Softwareentwicklung / Re: GRUB4DOS C++Kernel
« am: 07. September 2013, 19:58 »
Ich verwende jetzt Bochs-2.6.2! Er kann es aber auch nicht laden :(. Nur der Limbo-Emulator auf meinem Handy kann es...
Ich hab den log von Bochs mal im Anhang reingepackt.
Außerdem ist hier noch meine Boch-config: http://www.file-upload.net/download-8053099/bochsrc.bxrc.html
34
Softwareentwicklung / Re: GRUB4DOS C++Kernel
« am: 06. September 2013, 20:47 »
Quemu läuft nicht auf meinem PC. Kommt immer Disk-error. Bis jetzt hab ich es immer mit dem Limbo-Emulator auf meinem Android Phone gemacht.  :-D
Damit läuft es wenigstens^^
35
Softwareentwicklung / Re: GRUB4DOS C++Kernel
« am: 06. September 2013, 17:54 »
Stimmt! Das Menu wird von der menu.lst gesteuert. Dort hab ich die Einträge gefunden, die die Windows-menupunkte anzeigen.

Aber mit welchem Befehl läd man nun den Kernel?? mit
Zitat
boot
bootet man ihn. :-D

EDIT: hab mit
Zitat
kernel /kernel.bin
den Kernel geladen!
Wenn ich ihn mit boot ausführe erscheint ein kurzer Text, denn ich nicht so schnell lesen kann und dann komm ich wieder auf das Grub4Dos menu?
Hab den kernel unverendert aus dem TuT genommen. Muss man vielleicht sowas wie pause einfügen??
36
Softwareentwicklung / Re: GRUB4DOS C++Kernel
« am: 06. September 2013, 14:33 »
Wie kann ich den Kernel laden?? Hab im Internet nix gutes gedunden. Einige sagen mit find, aber mit find gehts nich. Wenn ich ls eingeb, ist der kernel dort mit aufgelistet! kann ich mein Kernel nicht automatisch laden lassen?
37
Softwareentwicklung / GRUB4DOS C++Kernel
« am: 05. September 2013, 21:52 »
Hi,
ich bin nach http://www.lowlevel.eu/w/index.php?title=C%2B%2B-Kernel_mit_GRUB&oldid=11074#Kompilieren_und_Linken vorgegangen.
Danach hab ich mir ein GRUB Image erstellt (http://www.lowlevel.eu/wiki/GRUB#GRUB_legacy).
Allerdings habe ich BFI mit cmd unter windows ausgeführt und bootlace unter DOSBOX, weil ich mir keine mbr.bin erstellen konnte. Habe ein Win7 64-bit System!
Jetzt hab ich das Image geladen und es erscheint das GRUB4DOS-Menu. Ich war zuerst glücklich, aber dann... nunja wie lade ich jetzt mein C++-Kernel???
Man kann dort verschiedene Sachen auswählen(find and load [komisches krams] of [Irgendeine Windows version]). Wenn es mein Kernel ist, wieso steht dann da was mit Windows?? O.o
Wenn ich eins auswähle komme ich in die grub-console...

lolxdfly
38
Softwareentwicklung / Re: C++ Kernel Startup.cpp
« am: 05. September 2013, 20:23 »
Damit gehts! Danke :-)
39
Softwareentwicklung / Re: C++ Kernel Startup.cpp
« am: 05. September 2013, 19:29 »
Ich hab MinGW und den Cross-Compiler benutzt. Macht kein Unterschied. Es kommt immer der gleiche Error. Der eigenlich Error ist ja jetzt der link error.

Meine link.txt(müsste die selbe sein wie vom TuT):
ENTRY(loader)
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)

SECTIONS
{
  . = 0x0100000;

  .text :
  {
    *(.text*)
    *(.rodata)
  }

  .data  :
  {
    start_ctors = .;
    KEEP(*( .init_array ));
    KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* )));
    end_ctors = .;

    *(.data)
  }

  .bss  :
  {
    *(.bss)
  }

  /DISCARD/ : { *(.fini_array*) *(.comment) }
}
40
Softwareentwicklung / C++ Kernel Startup.cpp
« am: 05. September 2013, 15:04 »
Hi,
ich eine Frage zu http://www.lowlevel.eu/wiki/C%2B%2B-Kernel_mit_GRUB.
Bei dem Abschnitt Startup.cpp!
Ich hab das glaub ich richtig verstanden, aber wo bekomme ich jetzt die Startup.cpp her?? muss ich die selber schreiben oder wie? Kann mir jemand die hochladen?

lolxdfly

EDIT: hab einfach seine Startup.cpp genommen: http://forum.lowlevel.eu/index.php?topic=3262.0  :-D

Jetzt gibts aber nen link error: ld: cannot perform PE operations on non PE output file 'kernel.bin'.
Liegt das an meinem 64-bit Windows 7?? Ich hab jetz MinGW benutzt. Mit dem Crosscompiler gehts fast.

ld: link.txt:19:syntax error
Seiten: 1 [2] 3

Einloggen