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

Seiten: 1 2 [3]
41
Softwareentwicklung / Re: kprintf %d usw ersetzen
« am: 14. November 2012, 21:26 »
Tipp: Statt "Exception" kannst du auch gleich den Namen hinschreiben ("#GP", "#PF" usw.), dann brauchst du die Nummern nicht im Kopf behalten.

So etwas habe ich auch geplant. Ich habe das momentan auch mehr oder weniger hingerotzt. Es passiert auch nichts wenn man eine Taste drückt.  :-D
42
Offtopic / Re: Screen of Death
« am: 14. November 2012, 21:25 »
 :-P


Der wird natürlich nochmal überarbeitet. :D

43
Softwareentwicklung / Re: kprintf %d usw ersetzen
« am: 14. November 2012, 21:00 »
sieht fast so aus, als wenn du dezimalzahlen mit hexadezimalen kennung schreibst ...

Sollte eigentlich nicht so sein.  :-o :?^^

/e: Ich lasse es einfach mal in dezimaler Schreibweise ausgeben. Wenn das gleich bleibt habe ich auf jedenfall was falsch gemacht.   :-)
/e2: Es scheint als wäre das soweit richtig. Ich rechne trotzdem nochmal nach.
/e3: Jop das passt. Es sind eben nur zufällig keine A-Fs dabei.  :-)
44
Softwareentwicklung / Re: kprintf %d usw ersetzen
« am: 14. November 2012, 20:53 »
So ich habs hinbekommen. :D Habe mir dann gleich noch ne Funktion zum ändern der Farbe gebaut:


 :-D :-D

45
Offtopic / Re: Windows 7 kaputt?
« am: 14. November 2012, 16:32 »
Danke für die Antworten.

Das mit dem abgesicherten Modus werde ich auf jedenfall ausprobieren. Wie kann man denn die Bluescreens sichtbar machen? Ich habe gelesen, dass das mit TuneUp geht, aber ich komme ja nichtmals zu Desktop.^^

46
Softwareentwicklung / Re: kprintf %d usw ersetzen
« am: 13. November 2012, 22:01 »
Oh ja sowas meinte ich. Da hat der BBCode mir den Post versaut. Ich wollte buf[i] schreiben, aber buf[i+1] könnte auch richtig sein, je nachdem welchen Wert i hat.

Jep. In meinem Code müsste der i-Wert nach verlassen der for-Schleife den Index von dem letzten Zeichen haben. Aber das wäre ja ein Fehler den man schnell findet.
47
Softwareentwicklung / Re: kprintf %d usw ersetzen
« am: 13. November 2012, 21:50 »
Du solltest trotzdem den String terminieren. buf = 0; oder so.

Geht es nicht auch einfach, dass man buf[i+1] = '\0' schreibt? Das wäre mir zumindest zuerst in den SInn gekommen um den String zu terminieren.
48
Softwareentwicklung / Re: kprintf %d usw ersetzen
« am: 13. November 2012, 20:39 »
char* itoa(int data, char* buf, int base)
{
  char * result = buf;
  char * digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVW";
  int i;
 
  for(i = 0; data != 0; i++) {
    buf[i] = digits[data % base];
    data = data / base;
    //kputc(buf[i]);
  }
 
  *buf = 0;
 
  return result;
}

Soweit bin ich momentan damit. Wenn man die das kputc(buf); entkommentiert, wird die Zahl auch (eben nur falsch herum) ausgegeben. Allerdings scheint der Rückgabewert leer zu sein.

Wie würde bei dir der Funktionsaufruf dafür aussehen?

/e: Mensch^^ Immer wenn ich ein Problem habe, denke ich erstmal ne viertel Stunde drüber nach, dann poste ich es hier, guck mir den Code nochmal an und finde den Fehler. :D

In dem Fall muss man einfach das *buf = 0 herausnehmen.
49
Offtopic / Windows 7 kaputt?
« am: 13. November 2012, 15:30 »
Hi Leute,

ich habe meine Festplatte vor einigen Tagen erst formatiert, und Windows 7 draufgeladen. Später habe ich dann auch noch Debian installiert. Ich konnte dann in einem GRUB Menü zwischen Windows und Debian auswählen, was auch einwandfrei geklappt hat. Seit gerade eben funktioniert aber nur noch Debian. Wenn ich Windows 7 booten will, dann komme ich nur zum Lade-Bildschirm mit dem funkelnden Win Zeichen, dann flackert ein Bluescreen auf und der PC startet direkt neu.
Die Windows Startup Repair hat auch nicht geholfen.

Ist das Problem schon bekannt und kann man das vielleicht sogar lösen?
50
Softwareentwicklung / Re: kprintf %d usw ersetzen
« am: 12. November 2012, 21:19 »
Du solltest immer die gesamte Fehlermeldung lesen (und hier im Forum posten, wenn du Hilfe von uns willst). Ich nehme aber mal an, dass das hier die Meldung war: warning: conflicting types for built-in function 'putchar'

Die Meldung versucht dir zu sagen, dass es im C-Standard eine Funktion namens putchar gibt, die allerdings eine andere Signatur (int putchar(int)) hat. Ich empfehle dir deine Funktion anders zu nennen. Du kannst aber auch die Signatur korrigieren. Allerdings ist das immer etwas problematisch Funktionen wie Standardfunktionen zu nennen, wenn sie nicht genau das tun, was auch im Standard steht. Die dritte Möglichkeit wäre GCC zu erzählen, dass es keine builtin-Funktionen gibt, indem du ihm den Parameter -fno-builtin (oder -ffreestanding) übergibst.

Das ist übrigens auch der Grund, warum ich die Funktin kputc genannt habe, und nicht putc oder putchar. Wenn dir der Name nicht gefällt, hab ich noch cons_putc, console_putc, screen_putc, debug_putc und cga_putc im Angebot. Mit oder ohne Unterstrich, oder als console_putchar, ... kannst du auch nach eigenem Geschmack anpassen.

Ich wollte meinen Post gerade editieren.^^  Wie du sagtest hat es nach einer Namensänderung funktioniert. (Vielleicht sollte ich mal länger ausprobieren bevor ich poste^^)

BTW: Ist es irgendwie möglich die Makefile so zu erweitern, dass sie im Falle einer geänderten Headerdatei alles kompiliert? Es ist ziemlich nervig, dass man jede .c Datei neu speichern muss, wenn man eine Headerdatei ändert, die für alle oder mehrere .c Dateien notwendig sind.  :roll:
51
Softwareentwicklung / Re: kprintf %d usw ersetzen
« am: 12. November 2012, 20:59 »
Jetzt verstehe ich die Welt nicht mehr. :D

Ich habe jetzt einen ersten Prototyp von putchar gebastelt, der auch soweit funktioniert. Wenn ich die Funktion aber im Header deklariere, sagt mir GCC  "warning conflicting types". Wenn ich die Deklarierung rausnehme, funktioniert es, weil das implizit deklariert wird. Weiß da jemand was man da machen könnte? Ich möchte nicht ewig mit der implicit declaration Warnung kompilieren. :D
52
Softwareentwicklung / Re: kprintf %d usw ersetzen
« am: 12. November 2012, 18:15 »
Ich glaube ich werde meine Funktion nochmal so umbasteln, wie es Jidder gesagt hat. Das macht so einiges einfacher, weil man dann nicht an irgendwelchen Strings rumschnippeln muss. :D
53
Softwareentwicklung / Re: kprintf %d usw ersetzen
« am: 11. November 2012, 13:23 »
Ah.^^ Vielen Dank. :)

Wieder so eine Sache die eigentlich einfach ist, wo man aber erst drauf kommen muss. :D
54
Softwareentwicklung / Re: kprintf %d usw ersetzen
« am: 11. November 2012, 12:47 »
in dem teil wo du die int abfrags, sieht zwar etwas kaputt aus, switch würde sich wahrscheinlich besser machen, sollte aber funktionieren, muss du noch eine funktion einbauen wie intToChar(int i, int base), das dir ein char array oder anderes construct zurück gibt, dann kannst du einfach sowas machen wie kprint(intToChar(iArg, 10)); machen, musst dann aber danach aufpassen, dass du das i nochmal manuell inkrementieren musst.
Zudem musst du noch irgendwie abfangen, ob ein '%' am ende des strings steht ...

korrigiert mich, wenn ich was falsches gesagt hab :)

mfg

Danke erstmal für die Antwort. :)

Das mit dem '%' am Ende des Strings wird schon durch das else abgefangen, weil dann string[i+1] == '\0' wäre und dann einfach das Zeichen dahinschreibt.

Wie könnte denn so eine intToChar Funktion aussehen?
55
Softwareentwicklung / kprintf %d usw ersetzen
« am: 11. November 2012, 12:08 »
Hi Leute.

Ich bin gerade dabei, meine kprintf-Funktion so zu erweitern, dass man wie im Tutorial gefordert soetwas machen kann: kprintf("Die Zahl ist %d", 5);
Ich bin mir jetzt nicht so sicher wie man 1. Integer in chars umwandeln kann, sodass auch wirklich die Zahl später angezeigt wird, nicht das zugehörige Zeichen, und 2. wie man das %d durch die Zahl ersetzt.

Meine aktuelle for-Schleife sieht so aus:
  for(i=0; string[i] != '\0'; i++, iOff++) {
    if(string[i] == '\n') {
iCursor += 1;
iOff = -1;
    } else if(string[i] == '%') {
if(string[i+1] == 'd') {
   int iArg = va_arg(ap, int);
} else {
   video[(iCursor*160)+iOff*2] = string[i];
   video[(iCursor*160)+iOff*2+1] = 0x07;    
}
    } else {
video[(iCursor*160)+iOff*2] = string[i];
video[(iCursor*160)+iOff*2+1] = 0x07;
    }
  }

Ich hoffe ihr könnt mir da ein paar Tipps geben.  :-)
 
56
Lowlevel-Coding / Re: uint64_t/uint16_t Probelm
« am: 10. November 2012, 15:41 »
Jetzt scheint es richtig zu funktionieren.  :roll:^^

Vorher konnte ich eigentlich alle Werte ändern. Jetzt wird die CPU resettet.
Trotzdem danke. :-)
57
Lowlevel-Coding / Re: uint64_t/uint16_t Probelm
« am: 10. November 2012, 14:32 »
Der Parameter -ffreestanding sollte dafür sorgen, dass der Compiler nicht davon ausgeht, dass eine Library zur Verfügung steht. Mit den Headern in der Freestanding-Umgebung solltest du keine Probleme bekommen. Hier stehen die Header, die dir dann zur Verfügung stehen: http://gcc.gnu.org/onlinedocs/gcc/Standards.html

Danke für den Tipp. :)

Ich bin irgendwie gerade unsicher, ob ich das mit der GDT jetzt richtig gemacht habe... Im Wiki steht ja, dass alles richtig ist, wenn der Kernel danach noch funktioniert. Das tut er bei mir, allerdings auch, wenn ich irgendwas in der GDT Funktion ändere. Kann da vielleicht einer kurz drüber gucken?  :-)
#include <stdint.h>
#include "includes.h"

#define GDT_FLAG_DATASEGM 0x02
#define GDT_FLAG_CODESEGM 0x0a
#define GDT_FLAG_TSS 0x09

#define GDT_FLAG_SEGMENT 0x10
#define GDT_FLAG_RING0 0x00
#define GDT_FLAG_RING3 0x60
#define GDT_FLAG_PRESENT 0x80

#define GDT_FLAG_4K_GRAN 0x800
#define GDT_FLAG_32_BIT 0x400

#define GDT_ENTRIES 0x5

static uint64_t gdt[GDT_ENTRIES];

void init_gdt() 
{
  set_entry(0, 0, 0, 0);
  set_entry(1, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT | GDT_FLAG_CODESEGM | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT);
  set_entry(2, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT | GDT_FLAG_DATASEGM | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT);
  set_entry(3, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT | GDT_FLAG_CODESEGM | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT | GDT_FLAG_RING3);
  set_entry(4, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT | GDT_FLAG_DATASEGM | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT | GDT_FLAG_RING3);
 
  load_gdt();
}

void set_entry(int i, unsigned int base, unsigned int limit, int flags)
{
  gdt[i] = limit & 0xffffLL;
  gdt[i] |= (base & 0xffffffLL) << 16;
  gdt[i] |= (flags & 0xffLL) << 40;
  gdt[i] |= ((limit >> 16) & 0xfLL) << 48;
  gdt[i] |= ((flags >> 8) & 0xffLL) << 52;
  gdt[i] |= ((base >> 24) &  0xffLL) << 56;
}


void load_gdt()
{
  struct {
    uint16_t limit;
    void * pointer;
  } __attribute__((packed)) gdtp = {
    .limit = GDT_ENTRIES * 8 - 1,
    .pointer = gdt,
  };
  asm volatile("lgdt %0" : : "m" (gdtp));
 
  asm volatile(
"mov $0x10, %ax;"
"mov %ax, %ds;"
"mov %ax, %es;"
     "mov %ax, %ss;"
     "ljmp $0x8, $.1;"
     ".1:"
);
}
58
Lowlevel-Coding / Re: uint64_t/uint16_t Probelm
« am: 09. November 2012, 18:48 »
Ich hätte da auch mal ne Frage  :-D

Um unint64_t und so benutzen zu können, muss man stdint.h inkludieren und deswegen logischerweise das -nostdinc im Makefile entfernen, damit das auch geht.
Könnte es deswegen Probleme geben, wenn irgendwelche Codefetzen aus den Includes mit in den Kernel kommen? Ich meine das das im Tutorial irgendwo erwähnt wurde.
Seiten: 1 2 [3]

Einloggen