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

Seiten: [1]
1
Lowlevel-Coding / Re: C -> Pascal
« am: 05. January 2008, 10:55 »
Ich habe was so etwas betrifft mit Pascal noch nicht viel zu tun gehabt. Hast du nur ein ganz kleines Beispiel dafür ? (ob Code oder in Worten ist mir egal, hauptsache ich versteh es)
2
Lowlevel-Coding / C -> Pascal
« am: 02. January 2008, 11:00 »
Hi,

ich muss die GDT/IDT von meinem alten C-Kernel auf den neuen Pascal-Kernel übertragen.

Habt ihr eine Idee wie ich das übersetzen könnte ?
Das war mein Zwischenergebnis:
type
  TableRegister = record // IDT/GDT-Register
    Size : Single;
    Long : Double;
  end;
 
  InterruptGate = record // Gate in der IDT
    Offset_Low : Word = 16; // <-- =16 ist sogar nach Syntax verboten, tja
  end;
Hier der Code
typedef struct _TableRegister // IDT/GDT-Register
{

  unsigned short size; // Größe der Tabelle

  unsigned long  base; // Basisadresse der Tabelle

} TableRegister, *pTableRegister;



typedef struct _InterruptGate // Gate in der IDT
{

  unsigned int offset_low : 16; // 1. Word der Funk.-Adresse

  unsigned int selector    : 16; // Selektor aus der GDT

  //unsigned int reserved_1  : 8;  // 0

  unsigned int      : 8;  // 0

  unsigned int type      : 3;  // Zugriffs- und Statusbyte

  unsigned int size      : 1;

  //unsigned int reserved_2  : 1;  // 0

  unsigned int      : 1; // 0

  unsigned int DPL    : 2; // Zugriffslevel

  unsigned int present : 1; // Present im speicher

  unsigned int offset_high : 16; // 2. Word der Funk.-Adresse

} InterruptGate, *pInterruptGate, TrapGate, *pTrapGate;



typedef struct _Gate // Gate in der IDT
{

  unsigned int offset_low : 16; // 1. Word der Funk.-Adresse

  unsigned int selector    : 16; // Selektor aus der GDT

  unsigned int param       : 5;  // Parameter auf dem Stack

  //unsigned int reserved_1  : 3;  // 0

  unsigned int             : 3;  // 0

  unsigned int type        : 4;  // Zugriffs- und Statusbyte

  //unsigned int reserved_2 : 1;  // 0

  unsigned int             : 1; // 0

  unsigned int DPL         : 2;  // Zugriffslevel

  unsigned int present     : 1; // Present im speicher

  unsigned int offset_high : 16; // 2. Word der Funk.-Adresse

} Gate, *pGate, CallGate, *pCallGate;



typedef struct _Descriptor // Descriptor in der GDT
{

  unsigned int size_low  : 16; // 1. Word der Größe

  unsigned int base_low  : 16; // 1. Word der Basisadresse

  unsigned int base_mid : 8;  // 3. Byte der Basisadresse

  unsigned int access    : 1;  // Zugriff & Segmenttyp

  unsigned int type      : 3;  // Zugriff & Segmenttyp

  unsigned int system    : 1;  // Zugriff & Segmenttyp

  unsigned int level     : 2;  // Zugriff & Segmenttyp

  unsigned int present   : 1;  // Zugriff & Segmenttyp

  unsigned int size_high : 4;  // Letztes Nibble der Größe

  unsigned int avl       : 1;  // Zusatz

  unsigned int null      : 1;  // Zusatz

  unsigned int _386      : 1;  // Zusatz

  unsigned int seg_size : 1;  // Zusatz

  unsigned int base_high : 8;  // Letztes Byte der Basisadresse

} Descriptor, *pDescriptor;



pDescriptor    GDT_BASE_POINTER;

pGate          IDT_BASE_POINTER;

pTrapGate      IDT_BASE_POINTER_TRAP_GATE;

pInterruptGate IDT_BASE_POINTER_INTERRUPT_GATE;

pCallGate    IDT_BASE_POINTER_CALL_GATE;



TableRegister gdt, idt;



3
Lowlevel-Coding / Re: WriteChar funktioniert, WriteLn nicht
« am: 19. November 2007, 15:53 »
Da lag der Fehler, danke.
4
Lowlevel-Coding / Re: WriteChar funktioniert, WriteLn nicht
« am: 18. November 2007, 15:35 »
procedure fpc_shortstr_assign(len: longint; src, dst: pointer); compilerproc;

procedure fpc_shortstr_assign(len: longint; src, dst: pointer); alias: 'FPC_SHORTSTR_ASSIGN';
begin

end;
5
Lowlevel-Coding / WriteChar funktioniert, WriteLn nicht
« am: 18. November 2007, 11:46 »
Hi,

ich möchte meinen C-Kernel auf Pascal umstellen, da mir Pascal lieber ist (bin erfahrener damit). Nun habe ich die Funktion WriteChar, welche nur dafür zuständig ist, ein Zeichen auszugeben.
type 
  TScreen = Array[1..25, 1..80] of record
    c    : Char;
    attr : Byte;
  end;
procedure WriteChar(c : Char);
begin
  Screen^[X, Y].c := c;
  inc(Y);
end;
WriteChar('a') und man sieht ein a auf dem Bildschirm.

Da mir WriteChar wenig nützt, brauche ich die regelrechte Standardfunktion WriteLn:
procedure WriteLn(s : String);
var i : Integer;
begin
  for i := 1 to Length(s) do
    WriteChar(s[i]);
end;
WriteLine('a') und man sieht nichts auf dem Bildschirm. Ich habe herausgefunden, dass Length(s) und s aus irgendeinem Grund nicht funktionieren ODER die Übergabe des Strings an die Funktion schiefläuft, wenn man folgenden Code benutzt, sieht man nichts auf dem Bildschirm:
procedure WriteLn(s : String);
var i : Integer;
begin
  for i := 1 to Length(s) do
    WriteChar('a');
end;
Nimmt man anstelle von Length(s) Length(s)+3, hat man 3 a auf dem Bildschirm.

Woran könnte das liegen ? Ich arbeite mit FreePascal und habe folgenden Code in der system.pas (vlt. hängt es ja damit zusammen):
unit system;

interface

type
  ValSInt = LongInt;
  SizeInt = LongInt;

procedure FPC_INITIALIZEUNITS; compilerproc;
procedure FPC_DO_EXIT; compilerproc;
procedure fpc_shortstr_assign(len: longint; src, dst: pointer);
function fpc_shortstr_concat(const s1, s2 : ShortString) : ShortString; compilerproc;
function fpc_shortstr_to_shortstr(len : LongInt; const sstr : ShortString) : ShortString; compilerproc;

implementation

procedure FPC_INITIALIZEUNITS; alias: 'FPC_INITIALIZEUNITS'; compilerproc;
begin

end;

...
6
Lowlevel-Coding / Re: C-Kernel zeigt nichts an
« am: 10. March 2007, 17:22 »
Es steht in der Liste drinnen.
Die ld.exe wird mit dem link.txt aufgerufen.
7
Lowlevel-Coding / Re: C-Kernel zeigt nichts an
« am: 10. March 2007, 17:12 »
Jo, arbeite unter Windows. Ich habe einfach die gcc.exe und dazugehörigen Anwendungen aus Dev-Cpp genommen. So wie es aussieht ist es MinGW.
Edit: sieht fast nach dem Original aus, da die MinGW erst unten drunter auftaucht.
8
Lowlevel-Coding / Re: C-Kernel zeigt nichts an
« am: 10. March 2007, 17:01 »
Zu 1.: Es gibt zwei Kernel: 16 und 32. In welchen müsste es denn für GRUB rein ?
Zu 2.: OUTPUT_FORMAT("elf32-i386") ? Wenn ja: er kennt elf32-i386 nicht.
9
Lowlevel-Coding / Re: C-Kernel zeigt nichts an
« am: 10. March 2007, 16:54 »
1. Wo muss ich das hinzufügen ?
2. Wie sehen für ELF eigentlich die genauen Compileroptionen aus ? ELF ist doch im Prinzip Exe ?
10
Lowlevel-Coding / Re: C-Kernel zeigt nichts an
« am: 10. March 2007, 16:43 »
Danke. Hat krn eine spezielle Bedeutung, also muss die Datei entsprechend aussehen, oder ist das eine umbenannte bin-Datei ?
11
Lowlevel-Coding / Re: C-Kernel zeigt nichts an
« am: 10. March 2007, 16:34 »
Ok und wo findet man einen virtuellen Diskettentreiber ? Google konnte mir nichts sagen.
12
Lowlevel-Coding / Re: C-Kernel zeigt nichts an
« am: 10. March 2007, 16:22 »
Arghs, verdammter PM....

Ich hatte mit GRUB nie wirklich was zu tun (nur mit Problemen :-D), wie kann man denn dort den Kernel austauschen ?
13
Lowlevel-Coding / Re: C-Kernel zeigt nichts an
« am: 10. March 2007, 16:06 »
GRUB kenne ich schon.... Ist es mit GRUB wirklich so, dass man immer wieder CDs brennen muss, nur um eine Kleinigkeit zu testen ? Naja egal:
org 0x7C00

start:
cli                 
mov ax, 0x9000     
mov ss, ax           
mov sp, 0         
sti               

mov [bootdriv], dl

call load

mov ax, 0x1000       ; Speicheradresse der Shell
mov es, ax
mov ds, ax
push ax
mov ax, 0
push ax
retf

bootdriv db 0         ; Bootlaufwerk 
loadmsg db "Test",13,10,0

; Mit dieser Funktion geben wir einen String aus
putstr:
lodsb
or al,al
jz short putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn

; Shell vom Bootlaufwerk laden
load:
push ds
mov ax, 0
mov dl, [bootdriv]
int 13h
pop ds
jc load

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

times 512-($-$$)-2 db 0
dw 0AA55h
14
Lowlevel-Coding / Re: C-Kernel zeigt nichts an
« am: 10. March 2007, 15:49 »
Bootloaderausschnitt
mov ax, 0x1000
Dann habe ich den Linkerscript angepasst:
OUTPUT_FORMAT("binary")
INPUT(kernel32.obj ckernel.obj)
ENTRY(start)
SECTIONS
{
 .text  0x1000 : {
   code = .; _code = .; __code = .;
   *(.text)
   . = ALIGN(1);
   *(.rdata)
   *(.rodata)
 }
 .data  : {
   data = .; _data = .; __data = .;
   *(.data)
   . = ALIGN(1);
 }
 .bss  :
 {
   bss = .; _bss = .; __bss = .;
   *(.bss)
   . = ALIGN(1);
 }
 end = .; _end = .; __end = .;
}
15
Lowlevel-Coding / C-Kernel zeigt nichts an
« am: 10. March 2007, 15:23 »
Hi,

ich habe das Tutorial von TJ durchgearbeitet und mit einem anderen Bootloader verbunden (TJ's funktionierte bei mir irgendwie nicht). Der Bootloader startet normal, aber der Kernel zeigt einfach nichts an.
Es wird alles fehler- und Warnungsfrei kompiliert.

Woran könnte es liegen ?

Hier der Code:
kernel32.asm
[Bits 32]
extern _kernel
global start
global _EnableA20Gate

start:

call _kernel ; siehe kernel.c warum

STOP:
jmp STOP

kernel.c
void kernel() // Da main scheinbar ein reserviertes Wort ist
{
  int i;
  char Text[] = "Welcome to Protected Mode";
  char *VideoMem = (char*)0xB8000;
  for(i = 0; Text[i] != 0; i++)
  {
     VideoMem[i] = Text[i];
     VideoMem[++i] = 7;
  }
}

void memcpy(void *dest, const void *src, int n)
{
  int i;
  for (i = 0;i <= n;i++)
  {
     dest = (void*)src;
     dest++;
     src++;
  }
}

link.txt
OUTPUT_FORMAT("binary")
INPUT(kernel32.obj ckernel.obj)
ENTRY(start)
SECTIONS
{
 .text  0x200 : {
   code = .; _code = .; __code = .;
   *(.text)
   . = ALIGN(1);
 }
 .data  : {
   data = .; _data = .; __data = .;
   *(.data)
   . = ALIGN(1);
 }
 .bss  :
 {
   bss = .; _bss = .; __bss = .;
   *(.bss)
   . = ALIGN(1);
 }
 end = .; _end = .; __end = .;
}

Ich hoffe, dass euch die 3 Dateien ausreichen :)
Seiten: [1]

Einloggen