Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "types.h"
- #define __GDT__
- #include "gdt.h"
- void *memcpy(char *dst, char *src, int n)
- {
- char *p = dst;
- while (n--)
- *dst++ = *src++;
- return p;
- }
- /*
- * 'init_desc' init a segment descriptor which is in gdt or ldt.
- * 'desc' is the linear address of the descriptor to init
- */
- void init_gdt_desc(u32 base, u32 limite, u8 acces, u8 other,
- struct gdtdesc *desc)
- {
- desc->lim0_15 = (limite & 0xffff);
- desc->base0_15 = (base & 0xffff);
- desc->base16_23 = (base & 0xff0000) >> 16;
- desc->acces = acces;
- desc->lim16_19 = (limite & 0xf0000) >> 16;
- desc->other = (other & 0xf);
- desc->base24_31 = (base & 0xff000000) >> 24;
- return;
- }
- /*
- * this function init the GDT after the kernel has been loaded into RAM
- */
- void init_gdt(void)
- {
- /* init some segments descriptors */
- init_gdt_desc(0x0, 0x0, 0x0, 0x0, &kgdt[0]);
- init_gdt_desc(0x0, 0xFFFFF, 0x9B, 0x0D, &kgdt[1]); /* code */
- init_gdt_desc(0x0, 0xFFFFF, 0x93, 0x0D, &kgdt[2]); /* data */
- init_gdt_desc(0x0, 0x0, 0x97, 0x0D, &kgdt[3]); /* stack */
- /* init GDTR struct*/
- kgdtr.limite = GDTSIZE * 8;
- kgdtr.base = GDTBASE;
- memcpy((char *) kgdtr.base, (char *) kgdt, kgdtr.limite);
- /* load gdtr */
- asm("lgdtl (kgdtr)");
- /* init segments */
- asm(" movw $0x10, %ax \n \
- movw %ax, %ds \n \
- movw %ax, %es \n \
- movw %ax, %fs \n \
- movw %ax, %gs \n \
- ljmp $0x08, $next \n \
- next: \n");
- }
Advertisement
Add Comment
Please, Sign In to add comment