main.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. //
  2. // Created by longjin on 2022/1/20.
  3. //
  4. #include "common/glib.h"
  5. #include "common/printk.h"
  6. #include "common/kprint.h"
  7. #include "exception/gate.h"
  8. #include "exception/trap.h"
  9. #include "exception/irq.h"
  10. #include <exception/softirq.h>
  11. #include "mm/mm.h"
  12. #include "mm/slab.h"
  13. #include "process/process.h"
  14. #include "syscall/syscall.h"
  15. #include "smp/smp.h"
  16. #include <smp/ipi.h>
  17. #include <sched/sched.h>
  18. #include "driver/multiboot2/multiboot2.h"
  19. #include "driver/acpi/acpi.h"
  20. #include "driver/keyboard/ps2_keyboard.h"
  21. #include "driver/mouse/ps2_mouse.h"
  22. #include "driver/disk/ata.h"
  23. #include "driver/pci/pci.h"
  24. #include "driver/disk/ahci/ahci.h"
  25. #include <driver/timers/rtc/rtc.h>
  26. #include <driver/timers/HPET/HPET.h>
  27. #include <driver/timers/timer.h>
  28. unsigned int *FR_address = (unsigned int *)0xb8000; //帧缓存区的地址
  29. ul bsp_idt_size, bsp_gdt_size;
  30. struct memory_desc memory_management_struct = {{0}, 0};
  31. // struct Global_Memory_Descriptor memory_management_struct = {{0}, 0};
  32. void test_slab();
  33. void show_welcome()
  34. {
  35. /**
  36. * @brief 打印欢迎页面
  37. *
  38. */
  39. printk("\n\n");
  40. for (int i = 0; i < 74; ++i)
  41. printk(" ");
  42. printk_color(0x00e0ebeb, 0x00e0ebeb, " \n");
  43. for (int i = 0; i < 74; ++i)
  44. printk(" ");
  45. printk_color(BLACK, 0x00e0ebeb, " Welcome to DragonOS ! \n");
  46. for (int i = 0; i < 74; ++i)
  47. printk(" ");
  48. printk_color(0x00e0ebeb, 0x00e0ebeb, " \n\n");
  49. }
  50. // 测试内存管理单元
  51. void test_mm()
  52. {
  53. kinfo("Testing memory management unit...");
  54. struct Page *page = NULL;
  55. page = alloc_pages(ZONE_NORMAL, 63, 0);
  56. page = alloc_pages(ZONE_NORMAL, 63, 0);
  57. printk_color(ORANGE, BLACK, "4.memory_management_struct.bmp:%#018lx\tmemory_management_struct.bmp+1:%#018lx\tmemory_management_struct.bmp+2:%#018lx\tzone_struct->count_pages_using:%d\tzone_struct->count_pages_free:%d\n", *memory_management_struct.bmp, *(memory_management_struct.bmp + 1), *(memory_management_struct.bmp + 2), memory_management_struct.zones_struct->count_pages_using, memory_management_struct.zones_struct->count_pages_free);
  58. for (int i = 80; i <= 85; ++i)
  59. {
  60. printk_color(INDIGO, BLACK, "page%03d attr:%#018lx address:%#018lx\t", i, (memory_management_struct.pages_struct + i)->attr, (memory_management_struct.pages_struct + i)->addr_phys);
  61. i++;
  62. printk_color(INDIGO, BLACK, "page%03d attr:%#018lx address:%#018lx\n", i, (memory_management_struct.pages_struct + i)->attr, (memory_management_struct.pages_struct + i)->addr_phys);
  63. }
  64. for (int i = 140; i <= 145; i++)
  65. {
  66. printk_color(INDIGO, BLACK, "page%03d attr:%#018lx address:%#018lx\t", i, (memory_management_struct.pages_struct + i)->attr, (memory_management_struct.pages_struct + i)->addr_phys);
  67. i++;
  68. printk_color(INDIGO, BLACK, "page%03d attr:%#018lx address:%#018lx\n", i, (memory_management_struct.pages_struct + i)->attr, (memory_management_struct.pages_struct + i)->addr_phys);
  69. }
  70. free_pages(page, 1);
  71. printk_color(ORANGE, BLACK, "5.memory_management_struct.bmp:%#018lx\tmemory_management_struct.bmp+1:%#018lx\tmemory_management_struct.bmp+2:%#018lx\tzone_struct->count_pages_using:%d\tzone_struct->count_pages_free:%d\n", *memory_management_struct.bmp, *(memory_management_struct.bmp + 1), *(memory_management_struct.bmp + 2), memory_management_struct.zones_struct->count_pages_using, memory_management_struct.zones_struct->count_pages_free);
  72. for (int i = 75; i <= 85; i++)
  73. {
  74. printk_color(INDIGO, BLACK, "page%03d attr:%#018lx address:%#018lx\t", i, (memory_management_struct.pages_struct + i)->attr, (memory_management_struct.pages_struct + i)->addr_phys);
  75. i++;
  76. printk_color(INDIGO, BLACK, "page%03d attr:%#018lx address:%#018lx\n", i, (memory_management_struct.pages_struct + i)->attr, (memory_management_struct.pages_struct + i)->addr_phys);
  77. }
  78. page = alloc_pages(ZONE_UNMAPPED_IN_PGT, 63, 0);
  79. printk_color(ORANGE, BLACK, "6.memory_management_struct.bmp:%#018lx\tmemory_management_struct.bmp+1:%#018lx\tzone_struct->count_pages_using:%d\tzone_struct->count_pages_free:%d\n", *(memory_management_struct.bmp + (page->addr_phys >> PAGE_2M_SHIFT >> 6)), *(memory_management_struct.bmp + 1 + (page->addr_phys >> PAGE_2M_SHIFT >> 6)), (memory_management_struct.zones_struct + ZONE_UNMAPPED_INDEX)->count_pages_using, (memory_management_struct.zones_struct + ZONE_UNMAPPED_INDEX)->count_pages_free);
  80. free_pages(page, 1);
  81. printk_color(ORANGE, BLACK, "7.memory_management_struct.bmp:%#018lx\tmemory_management_struct.bmp+1:%#018lx\tzone_struct->count_pages_using:%d\tzone_struct->count_pages_free:%d\n", *(memory_management_struct.bmp + (page->addr_phys >> PAGE_2M_SHIFT >> 6)), *(memory_management_struct.bmp + 1 + (page->addr_phys >> PAGE_2M_SHIFT >> 6)), (memory_management_struct.zones_struct + ZONE_UNMAPPED_INDEX)->count_pages_using, (memory_management_struct.zones_struct + ZONE_UNMAPPED_INDEX)->count_pages_free);
  82. test_slab();
  83. kinfo("Memory management module test completed!");
  84. }
  85. void test_slab()
  86. {
  87. kinfo("Testing SLAB...");
  88. kinfo("Testing kmalloc()...");
  89. for (int i = 1; i < 16; ++i)
  90. {
  91. printk_color(ORANGE, BLACK, "mem_obj_size: %ldbytes\t", kmalloc_cache_group[i].size);
  92. printk_color(ORANGE, BLACK, "bmp(before): %#018lx\t", *kmalloc_cache_group[i].cache_pool_entry->bmp);
  93. ul *tmp = kmalloc(kmalloc_cache_group[i].size, 0);
  94. if (tmp == NULL)
  95. {
  96. kBUG("Cannot kmalloc such a memory: %ld bytes", kmalloc_cache_group[i].size);
  97. }
  98. printk_color(ORANGE, BLACK, "bmp(middle): %#018lx\t", *kmalloc_cache_group[i].cache_pool_entry->bmp);
  99. kfree(tmp);
  100. printk_color(ORANGE, BLACK, "bmp(after): %#018lx\n", *kmalloc_cache_group[i].cache_pool_entry->bmp);
  101. }
  102. // 测试自动扩容
  103. void *ptrs[7];
  104. for (int i = 0; i < 7; ++i)
  105. ptrs[i] = kmalloc(kmalloc_cache_group[15].size, 0);
  106. struct slab_obj *slab_obj_ptr = kmalloc_cache_group[15].cache_pool_entry;
  107. int count = 0;
  108. do
  109. {
  110. kdebug("bmp(%d): addr=%#018lx\t value=%#018lx", count, slab_obj_ptr->bmp, *slab_obj_ptr->bmp);
  111. slab_obj_ptr = container_of(list_next(&slab_obj_ptr->list), struct slab_obj, list);
  112. ++count;
  113. } while (slab_obj_ptr != kmalloc_cache_group[15].cache_pool_entry);
  114. for (int i = 0; i < 7; ++i)
  115. kfree(ptrs[i]);
  116. kinfo("SLAB test completed!");
  117. }
  118. struct gdtr gdtp;
  119. struct idtr idtp;
  120. void reload_gdt()
  121. {
  122. gdtp.size = bsp_gdt_size-1;
  123. gdtp.gdt_vaddr = (ul)phys_2_virt((ul)&GDT_Table);
  124. //kdebug("gdtvaddr=%#018lx", p.gdt_vaddr);
  125. //kdebug("gdt size=%d", p.size);
  126. asm volatile("lgdt (%0) \n\t" ::"r"(&gdtp)
  127. : "memory");
  128. }
  129. void reload_idt()
  130. {
  131. idtp.size = bsp_idt_size-1;
  132. idtp.idt_vaddr = (ul)phys_2_virt((ul)&IDT_Table);
  133. //kdebug("gdtvaddr=%#018lx", p.gdt_vaddr);
  134. //kdebug("gdt size=%d", p.size);
  135. asm volatile("lidt (%0) \n\t" ::"r"(&idtp)
  136. : "memory");
  137. }
  138. // 初始化系统各模块
  139. void system_initialize()
  140. {
  141. // 初始化printk
  142. printk_init(8, 16);
  143. kinfo("Kernel Starting...");
  144. // 重新加载gdt和idt
  145. ul tss_item_addr = (ul)phys_2_virt(0x7c00);
  146. kdebug("TSS64_Table=%#018lx", (void *)TSS64_Table);
  147. kdebug("&TSS64_Table=%#018lx", (void *)&TSS64_Table);
  148. kdebug("_stack_start=%#018lx", _stack_start);
  149. load_TR(10); // 加载TR寄存器
  150. set_tss64((uint *)phys_2_virt(TSS64_Table), _stack_start, _stack_start, _stack_start, tss_item_addr,
  151. tss_item_addr, tss_item_addr, tss_item_addr, tss_item_addr, tss_item_addr, tss_item_addr);
  152. cpu_core_info[0].stack_start = _stack_start;
  153. cpu_core_info[0].tss_vaddr = (uint64_t)phys_2_virt((uint64_t)TSS64_Table);
  154. kdebug("cpu_core_info[0].tss_vaddr=%#018lx", cpu_core_info[0].tss_vaddr);
  155. kdebug("cpu_core_info[0].stack_start%#018lx", cpu_core_info[0].stack_start);
  156. // 初始化中断描述符表
  157. sys_vector_init();
  158. // 初始化内存管理单元
  159. mm_init();
  160. acpi_init();
  161. // 初始化中断模块
  162. sched_init();
  163. irq_init();
  164. softirq_init();
  165. // 先初始化系统调用模块
  166. syscall_init();
  167. // 再初始化进程模块。顺序不能调转
  168. sched_init();
  169. timer_init();
  170. smp_init();
  171. cpu_init();
  172. // ps2_keyboard_init();
  173. // ps2_mouse_init();
  174. // ata_init();
  175. pci_init();
  176. ahci_init();
  177. // test_slab();
  178. // test_mm();
  179. process_init();
  180. cli();
  181. HPET_init();
  182. sti();
  183. }
  184. //操作系统内核从这里开始执行
  185. void Start_Kernel(void)
  186. {
  187. // 获取multiboot2的信息
  188. uint64_t mb2_info, mb2_magic;
  189. __asm__ __volatile__("movq %%r15, %0 \n\t"
  190. "movq %%r14, %1 \n\t"
  191. "movq %%r13, %2 \n\t"
  192. "movq %%r12, %3 \n\t"
  193. : "=r"(mb2_info), "=r"(mb2_magic), "=r"(bsp_gdt_size), "=r"(bsp_idt_size)::"memory");
  194. reload_gdt();
  195. reload_idt();
  196. mb2_info &= 0xffffffff;
  197. mb2_magic &= 0xffffffff;
  198. multiboot2_magic = mb2_magic;
  199. multiboot2_boot_info_addr = mb2_info + PAGE_OFFSET;
  200. system_initialize();
  201. /*
  202. uint64_t buf[100];
  203. ahci_operation.transfer(ATA_CMD_READ_DMA_EXT, 0, 1, (uint64_t)&buf, 0, 0);
  204. kdebug("buf[0]=%#010lx",(uint32_t)buf[0]);
  205. buf[0] = 0xffd3;
  206. ahci_operation.transfer(ATA_CMD_WRITE_DMA_EXT, 0, 1, (uint64_t)&buf, 0, 0);
  207. ahci_operation.transfer(ATA_CMD_READ_DMA_EXT, 0, 1, (uint64_t)&buf, 0, 0);
  208. kdebug("buf[0]=%#010lx",(uint32_t)buf[0]);
  209. */
  210. // show_welcome();
  211. // test_mm();
  212. /*
  213. while (1)
  214. {
  215. ps2_keyboard_analyze_keycode();
  216. struct ps2_mouse_packet_3bytes packet = {0};
  217. // struct ps2_mouse_packet_4bytes packet = {0};
  218. int errcode = 0;
  219. errcode = ps2_mouse_get_packet(&packet);
  220. if (errcode == 0)
  221. {
  222. printk_color(GREEN, BLACK, " (Mouse: byte0:%d, x:%3d, y:%3d)\n", packet.byte0, packet.movement_x, packet.movement_y);
  223. // printk_color(GREEN, BLACK, " (Mouse: byte0:%d, x:%3d, y:%3d, byte3:%3d)\n", packet.byte0, packet.movement_x, packet.movement_y, (unsigned char)packet.byte3);
  224. }
  225. }
  226. */
  227. /*
  228. while (1)
  229. {
  230. keyboard_analyze_keycode();
  231. analyze_mousecode();
  232. }
  233. */
  234. // ipi_send_IPI(DEST_PHYSICAL, IDLE, ICR_LEVEL_DE_ASSERT, EDGE_TRIGGER, 0xc8, ICR_APIC_FIXED, ICR_No_Shorthand, true, 1); // 测试ipi
  235. int last_sec = rtc_now.second;
  236. /*
  237. while (1)
  238. {
  239. if (last_sec != rtc_now.second)
  240. {
  241. last_sec = rtc_now.second;
  242. kinfo("Current Time: %04d/%02d/%02d %02d:%02d:%02d", rtc_now.year, rtc_now.month, rtc_now.day, rtc_now.hour, rtc_now.minute, rtc_now.second);
  243. }
  244. }
  245. */
  246. while (1)
  247. hlt();
  248. }
  249. void ignore_int()
  250. {
  251. kwarn("Unknown interrupt or fault at RIP.\n");
  252. return;
  253. }