So, I'm created some simple OS, print "Hello world" message, on it boot it etc (start stuff)
Next step is Global Descriptor Table
https://wiki.osdev.org/Global_Descriptor_Table
https://wiki.osdev.org/GDT_Tutorial#Wha ... t_In_a_GDT
I get GDT struct and make something
gdt.h
Code: Select all
#include<stdint.h>
struct gdt_segment {
uint16_t limit_low;
uint16_t base_low;
uint8_t base_middle;
uint8_t access_byte;
uint8_t limit_high;
uint8_t flags;
uint8_t base_high;
} __attribute__((packed));
struct gdt_ptr_struct {
uint16_t limit;
//unsigned int base;
struct gdt_segment* base;
} __attribute__((packed));
struct gdt_flag{};
void initSegment(uint8_t num, uint32_t limit, uint32_t base, uint8_t access, uint8_t flags);
void initGdt();
extern void gdt_flush(void* gdt_ptr);
Code: Select all
#include "gdt.h"
struct gdt_segment gdt_entries[5];
struct gdt_ptr_struct gdt_ptr;
void initSegment(uint8_t num, uint32_t limit, uint32_t base, uint8_t access, uint8_t flags) {
gdt_ptr.limit = (sizeof(struct gdt_segment) * 5) - 1;
gdt_ptr.base = gdt_entries;
//gdt_entries[num]
gdt_entries[num].limit_low = limit & 0xFFFF;
gdt_entries[num].limit_high = (limit >> 16) & 0x0F;
gdt_entries[num].base_low = base & 0xFFFF;
gdt_entries[num].base_middle = (base >> 16) & 0xFF;
gdt_entries[num].base_high = (base >> 8 ) & 0xFF;
gdt_entries[num].access_byte = access;
gdt_entries[num].flags = flags;
gdt_flush(&gdt_ptr);
}
void initGdt() {
initSegment(0, 0, 0, 0, 0);
initSegment(1, 0xFFFFFFFF, 0, 0x9A, 0xCF); //kernel code
initSegment(2, 0xFFFFFFFF, 0, 0x92, 0xCF); //kernel data segment
initSegment(3, 0xFFFFFFFF, 0, 0xFA, 0xCF); //user code
initSegment(4, 0xFFFFFFFF, 0, 0xF2, 0xCF); //user code
}
when i try to as my gdt.c
Code: Select all
test@test: ~/opt/cross/bin/i686-elf-as gdt.s
gdt.s: Assembler messages:
gdt.s:1: Error: no such instruction: `gdtr DW 0'
gdt.s:2: Error: no such instruction: `dd 0'
gdt.s:5: Error: operand size mismatch for `mov'
gdt.s:6: Error: operand size mismatch for `mov'
gdt.s:7: Error: operand size mismatch for `mov'
gdt.s:8: Error: operand size mismatch for `add'
gdt.s:9: Error: operand size mismatch for `mov'
but I don't know, any hints would be appreaciated
Thanks,
derva