Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

102 rindas
2.3 KiB

  1. /*
  2. *'freely' inspired by http://jojo.ouvaton.org/dossiers/boot_sector/tutorial02.html
  3. * (actually, that's mostly copied, with minor compilation fixes)
  4. */
  5. #include "kernel.h"
  6. #include "klibc.h"
  7. #define GDTBASE 0x800 /* Physical address of GDT */
  8. #define GDTSIZE 0xFF /* Maximum table size (in entries) */
  9. /* Segment descriptor */
  10. struct gdtdesc {
  11. u16 lim0_15;
  12. u16 base0_15;
  13. u8 base16_23;
  14. u8 acces;
  15. u8 lim16_19 : 4;
  16. u8 other : 4;
  17. u8 base24_31;
  18. } __attribute__ ((packed));
  19. /* GDTR register */
  20. struct gdtr {
  21. u16 limite ;
  22. u32 base ;
  23. } __attribute__ ((packed));
  24. struct gdtr kgdtr;
  25. struct gdtdesc kgdt[GDTSIZE] = {{0, 0, 0, 0, 0, 0, 0}};
  26. unsigned int kgdtptr = 1;
  27. void init_code_desc(u32 base, u32 limite, struct gdtdesc* desc);
  28. void init_data_desc(u32 base, u32 limite, struct gdtdesc* desc);
  29. void add_gdt_desc(struct gdtdesc desc);
  30. void init_gdt(void);
  31. void init_gdt_desc(u32 base, u32 limite, u8 acces, u8 other, struct gdtdesc* desc) {
  32. desc->lim0_15 = (limite & 0xffff);
  33. desc->base0_15 = (base & 0xffff);
  34. desc->base16_23 = (base & 0xff0000)>>16;
  35. desc->acces = acces;
  36. desc->lim16_19 = (limite & 0xf0000)>>16;
  37. desc->other = (other & 0xf);
  38. desc->base24_31 = (base & 0xff000000)>>24;
  39. return;
  40. }
  41. void init_code_desc(u32 base, u32 limite, struct gdtdesc* desc) {
  42. init_gdt_desc(base, limite, 0x9B, 0x0D, desc);
  43. }
  44. void init_data_desc(u32 base, u32 limite, struct gdtdesc* desc) {
  45. init_gdt_desc(base, limite, 0x93, 0x0D, desc);
  46. }
  47. void add_gdt_desc(struct gdtdesc desc) {
  48. kgdt[kgdtptr] = desc;
  49. kgdtptr++;
  50. }
  51. void init_gdt(void) {
  52. struct gdtdesc code, data, stack;
  53. /* initialisation des descripteurs de segment */
  54. init_code_desc(0x0, 0xFFFFF, &code);
  55. init_data_desc(0x0, 0xFFFFF, &data);
  56. init_gdt_desc(0, 0x10, 0x97, 0x0D, &stack);
  57. add_gdt_desc(code);
  58. add_gdt_desc(data);
  59. add_gdt_desc(stack);
  60. /* initialisation de la structure pour GDTR */
  61. kgdtr.limite = GDTSIZE*8;
  62. kgdtr.base = GDTBASE;
  63. /* recopie de la GDT a son adresse */
  64. memcpy((void*)kgdtr.base, kgdt, kgdtr.limite);
  65. /* chargement du registre GDTR */
  66. asm("lgdtl (kgdtr)");
  67. /* initialisation des segments */
  68. asm(" movw $0x10,%ax \n \
  69. movw %ax, %ds \n \
  70. movw %ax, %es \n \
  71. movw %ax, %fs \n \
  72. movw %ax, %gs \n \
  73. movw $0x18,%ax \n \
  74. movw %ax, %ss \n \
  75. movl $0x1FFFF,%esp \n \
  76. nop \n \
  77. nop \n \
  78. ljmp $0x08,$next \n \
  79. next: \n");
  80. }