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.


Themen - OdinX

Seiten: [1]
1
Lowlevel-Coding / anfängerfrage: problem mit tutorial
« am: 06. November 2015, 16:27 »
Hallo zusammen

Ich bin gerade daran, das Tutorial https://littleosbook.github.io/ durchzuarbeiten. Das hat gut geklappt, ich konnte den Framebuffer und den Serial Port benutzen. Dann habe ich die GDT initialisiert, da weiss ich aber nicht, ob es funktioniert hat, keine Ahnung an was man das sehen soll. Auf jeden Fall wurden meine Framebuffer ausgaben nach dem LGDT immer noch ausgeführt. Dann habe ich die IDT und die PICs initialisiert und die Interrupthandler gebaut, und da passiert mal einfach rein gar nichts. Die interrupt_handler Funktion sollte etwas in den Framebuffer schreiben, um zu zeigen, dass sie aufgerufen wird, das passiert aber nicht. Bin jetzt wirklich langsam ratlos. Aber am besten zeige ich mal ein bisschen Code.

kmain.c
#include "segmentation.h"
#include "interrupts.h"
#include "pic.h"
void kmain() {
    initializeGDT();
    initializeIDT();
    initializePIC();
}

segmentation.c
#include "segmentation.h"
#include "io.h"

struct gdt_entry createGDTEntry(unsigned int, unsigned int, char, char);

struct gdt_entry {
        unsigned short limit_low;
        unsigned short base_low;
        unsigned char base_mid;
        unsigned char access_flags;
        unsigned char granularity;
        unsigned char base_high;
} __attribute__((packed));

struct gdt_entry gdt[3];

#define EXECUTABLE      0x8
#define READABLE        0x2

void initializeGDT() {
        gdt[0] = createGDTEntry(0, 0, 0, 0);
        gdt[1] = createGDTEntry(0, ~0, READABLE, 0);
        gdt[2] = createGDTEntry(0, ~0, READABLE | EXECUTABLE, 0);
        lgdt(gdt);
}

#define GRANULARITY_4KB 0x80
#define IS_32_BIT_CODE  0x40
#define PRIVILEGE(lvl)  ((lvl & 2) << 5)
#define PRESENT         0x80

struct gdt_entry createGDTEntry(unsigned int base, unsigned int limit, char type, char pl) {
        struct gdt_entry result;
        result.base_low = base & 0xffff;
        result.base_mid = (base >> 16) & 0xff;
        result.base_high = (base >> 24) & 0xff;
        result.limit_low = limit & 0xff;
        result.granularity = GRANULARITY_4KB | IS_32_BIT_CODE | ((limit >> 16) & 0xf);
        result.access_flags = PRESENT | PRIVILEGE(pl) | type;
        return result;
}

interrupts.c
#include "interrupts.h"
#include "io.h"
#include "framebuffer.h"
#include "interrupt_handler.h"

void handler();

void createIDTEntry();

struct idt_entry {
        unsigned short offset_low;
        unsigned short selector;
        unsigned char unused; //but must be zeroed
        unsigned char flags;
        unsigned short offset_high;
} __attribute__((packed));

struct idt_ptr {
        unsigned short limit;
        unsigned int base;
} __attribute__((packed));

struct idt_entry idt[256];

void initializeIDT() {
        int i;
        for (i = 0; i < 256; i++) {
               createIDTEntry(i, &interrupt_handler_1);
        }
        struct idt_ptr ptr;
        ptr.limit = (sizeof (struct idt_entry) * 256) - 1;
        ptr.base = (unsigned int) &idt;
        lidt(&ptr);
}

void interrupt_handler () {
        fb_write("interrupt happend!", 18);
        fb_newLine();
}

#define TRAP_GATE_32BIT         0xf
#define PRIVILEGE(lvl)          ((lvl & 2) << 5)
#define SEGSEL_KERNEL_CS        0x08

void createIDTEntry(int n, int address) {
        idt[n].offset_low = address & 0xffff;
        idt[n].offset_high = (address >> 16) & 0xffff;
        idt[n].flags = TRAP_GATE_32BIT | PRIVILEGE(4);
        idt[n].selector = SEGSEL_KERNEL_CS;
        idt[n].unused = 0;
}

interrupt_handler.s
extern interrupt_handler

global enable_interrupts
global disable_interrupts

%macro no_error_handler 1
global interrupt_handler_%1
interrupt_handler_%1:
        push dword 0
        push dword %1
        jmp common_interrupt_handler
%endmacro

%macro error_code_handler 1
global interrupt_handler_%1
interrupt_handler_%1:
        push dword %1
        jmp common_interrupt_handler
%endmacro

section .text:

common_interrupt_handler:
        push esp
        add dword [esp], 8

        push eax
        push ebx
        push ecx
        push edx
        push ebp
        push esi
        push edi

        call interrupt_handler

        pop edi
        pop esi
        pop ebp
        pop edx
        pop ecx
        pop ebx
        pop eax

        pop esp

        iret

enable_interrupts:
        sti
        ret

disable_interrupts:
        cli
        ret

no_error_handler 0
no_error_handler 1
no_error_handler 2
no_error_handler 3
no_error_handler 4
no_error_handler 5
no_error_handler 6
no_error_handler 7
error_code_handler 8
no_error_handler 9
error_code_handler 10
error_code_handler 11
error_code_handler 12
error_code_handler 13
error_code_handler 14
no_error_handler 15
no_error_handler 16
error_code_handler 17
no_error_handler 18
no_error_handler 19

no_error_handler 32
no_error_handler 33
no_error_handler 34
no_error_handler 35
no_error_handler 36
no_error_handler 37
no_error_handler 38
no_error_handler 39
no_error_handler 40
no_error_handler 41
no_error_handler 42
no_error_handler 43
no_error_handler 44
no_error_handler 45
no_error_handler 46
no_error_handler 47

pic.c
#include "pic.h"
#include "io.h"

void pic_mask(unsigned int, unsigned int);

#define PIC1_PORT_A     0x20
#define PIC1_PORT_B     0x21
#define PIC1_ICW1       0x11
#define PIC1_ICW2       0x20
#define PIC1_ICW3       0x4
#define PIC1_ICW4       0x5

#define PIC2_PORT_A     0xa0
#define PIC2_PORT_B     0xa1
#define PIC2_ICW1       0x11
#define PIC2_ICW2       0x28
#define PIC2_ICW3       0x2
#define PIC2_ICW4       0x1

#define PIC_EOI         0x20

void initializePIC() {
        outb(PIC1_PORT_A, PIC1_ICW1);
        outb(PIC2_PORT_A, PIC2_ICW1);

        outb(PIC1_PORT_B, PIC1_ICW2);
        outb(PIC2_PORT_B, PIC2_ICW2);

        outb(PIC1_PORT_B, PIC1_ICW3);
        outb(PIC2_PORT_B, PIC2_ICW3);

        outb(PIC1_PORT_B, PIC1_ICW4);
        outb(PIC2_PORT_B, PIC2_ICW4);

        pic_mask(0xec, 0xff);
}

void pic_acknowledge() {
        outb(PIC1_PORT_A, PIC_EOI);
        outb(PIC2_PORT_A, PIC_EOI);
}

void pic_mask(unsigned int mask1, unsigned int mask2) {
        outb(PIC1_PORT_B, mask1);
        outb(PIC2_PORT_B, mask2);
}

io.s
#include "pic.h"
#include "io.h"

void pic_mask(unsigned int, unsigned int);

#define PIC1_PORT_A     0x20
#define PIC1_PORT_B     0x21
#define PIC1_ICW1       0x11
#define PIC1_ICW2       0x20
#define PIC1_ICW3       0x4
#define PIC1_ICW4       0x5

#define PIC2_PORT_A     0xa0
#define PIC2_PORT_B     0xa1
#define PIC2_ICW1       0x11
#define PIC2_ICW2       0x28
#define PIC2_ICW3       0x2
#define PIC2_ICW4       0x1

#define PIC_EOI         0x20

void initializePIC() {
        outb(PIC1_PORT_A, PIC1_ICW1);
        outb(PIC2_PORT_A, PIC2_ICW1);

        outb(PIC1_PORT_B, PIC1_ICW2);
        outb(PIC2_PORT_B, PIC2_ICW2);

        outb(PIC1_PORT_B, PIC1_ICW3);
        outb(PIC2_PORT_B, PIC2_ICW3);

        outb(PIC1_PORT_B, PIC1_ICW4);
        outb(PIC2_PORT_B, PIC2_ICW4);

        pic_mask(0xec, 0xff);
}

void pic_acknowledge() {
        outb(PIC1_PORT_A, PIC_EOI);
        outb(PIC2_PORT_A, PIC_EOI);
}

void pic_mask(unsigned int mask1, unsigned int mask2) {
        outb(PIC1_PORT_B, mask1);
        outb(PIC2_PORT_B, mask2);
}

header files und so habe ich mal weggelassen, ich denke das ist jetzt schon viel zu viel code für so eine frage.

Warum wird die interrupt_handler funktion in interrupts.c nicht aufgerufen, wenn ein interrupt passiert, also zB ich eine Taste drücke?

Danke schon mal für alle, die so weit gelesen haben.
2
Offtopic / NSA und die Sicherheit von Betriebssystemen
« am: 19. January 2014, 21:40 »
Hallo

Verbreitete Betriebssysteme (Windows, MacOS, Linux) stammen ja grösstenteils aus den USA.
Nun, da Snowden das Wahre Gesicht der USA präsentiert hat, stelle ich mir die Frage, ob es nicht ein neues USA-freies offenes Betriebssystem braucht.

Was meint ihr dazu?
Könnte man dadurch mehr Sicherheit erreichen?
Wie liesse sich soetwas realisieren?

Kompatibilität zu POSIX könnte man dabei ja leicht erreichen, und damit hätte man schon viel Software zur Verfügung.
Ich war ehrlich gesagt, etwas erstaunt, dass es noch keinen NSA-Thread hier gibt, da das Thema gerade für Betriebssysteme sehr wichtig zu sein scheint.

Ich kann mir persönlich durchaus vorstellen, dass man mit einem neuen Betriebssystem erfolgreich sein könnte, wenn es nicht aus den USA kommt und wenn es zusätzlich einige einzigartige Features mitliefert. Ich habe mir da schon einiges überlegt, aber ich werde es nicht ausführen.
3
Lowlevel-Coding / Kernel booten mit Grub2
« am: 19. June 2013, 23:46 »
Hallo

Ich habe da ein kleines Problem.
Ich wollte den folgenden Artikel ausprobieren: http://www.lowlevel.eu/wiki/C-Kernel_mit_GRUB#Kernel
Aber ich bringe es nicht hin, die .bin-Datei zu booten.

Ich habe folgendes versucht:

Ich kompilliere, assembliere und linke den Assembler- und C-code erfolgreich (denke ich) und habe nun eine Datei kernel.bin. Dafür habe ich ein bash-script erstellt.
Ich habe dann noch das folgende bash-script erstellt, um das iso-image zu erstellen:

mkdir cdroot/
mkdir cdroot/boot/
mkdir cdroot/boot/grub/

cp grub.cfg cdroot/boot/grub/
cp dev/kernel.bin cdroot/boot/

grub-mkrescue --output=GRUB2.iso cdroot/

rm -R cdroot
Nun habe ich ein iso-image und es hat auch die richtige Datei im Ordner "boot"
Die grub.cfg hat folgenden Inhalt:
set timeout=15
set default=0
 
menuentry "_OS_"
{
   multiboot /boot/kernel.bin
   boot                         
}
Das ist alles
Es wäre super, wenn ihr mir helfen könntet

Freundliche Grüsse
4
Lowlevel-Coding / make-Problem
« am: 20. February 2010, 11:17 »
Hallo

Ich wollte mal versuchen folgendes Tutorial auszuprobieren.

http://lowlevel.brainsware.org/wiki/index.php/Teil_4_-_Hello_World

Nun habe ich die Files "init.c", "start.S" und "Makefile" erstellt.
Wenn ich jetzt "make" eingebe, dann kommt die Meldung:
"Makefile:12: *** missing separator.   Stop."

Auf Zeile 12 der Datei Makefile steht folgendes;
"$(LD) $(LDFLAGS) -o $@ $^"

Was mache ich falsch?
Seiten: [1]

Einloggen