process.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include <asm/sys.h>
  2. #include <kernel/mm.hpp>
  3. #include <kernel/process.hpp>
  4. #include <kernel/stdio.h>
  5. #include <types/types.h>
  6. extern "C" void NORETURN go_user_space(void* eip);
  7. static inline void* align_down_to_16byte(void* addr)
  8. {
  9. return (void*)((uint32_t)addr & 0xfffffff0);
  10. }
  11. static process* _init;
  12. process* current_process;
  13. static inline void create_init_process(void)
  14. {
  15. _init = types::kernel_allocator_new<process>();
  16. _init->kernel_esp = align_down_to_16byte(k_malloc(4096 * 1024));
  17. _init->kernel_ss = 0x10;
  18. _init->attr.system = 0;
  19. _init->mms = *kernel_mms;
  20. page_directory_entry* pd = alloc_pd();
  21. memcpy(pd, mms_get_pd(kernel_mms), PAGE_SIZE);
  22. for (auto& item : _init->mms) {
  23. item.pd = pd;
  24. }
  25. _init->mms.push_back(mm {
  26. .start = 0x40000000,
  27. .attr = {
  28. .read = 1,
  29. .write = 1,
  30. .system = 0,
  31. },
  32. .pgs = types::kernel_allocator_new<page_arr>(),
  33. .pd = pd,
  34. });
  35. _init->thds.push_back(thread {
  36. .eip = (void*)0x40000000U,
  37. .owner = _init,
  38. });
  39. auto user_mm = ++_init->mms.begin();
  40. for (int i = 0; i < 1 * 1024 * 1024 / PAGE_SIZE; ++i) {
  41. k_map(user_mm.ptr(), &empty_page, 1, 1, 0, 1);
  42. }
  43. current_process = _init;
  44. asm_switch_pd(pd);
  45. // movl $0x01919810, %eax
  46. // movl $0x00114514, %ebx
  47. // jmp $.
  48. unsigned char instruction[] = {
  49. 0xb8, 0x10, 0x98, 0x91, 0x01, 0xbb, 0x14, 0x45, 0x11, 0x00, 0xeb, 0xfe
  50. };
  51. void* user_mem = (void*)0x40000000U;
  52. memcpy(user_mem, instruction, sizeof(instruction));
  53. }
  54. void NORETURN init_scheduler(struct tss32_t* tss)
  55. {
  56. create_init_process();
  57. // TODO: fix it
  58. tss->esp0 = (uint32_t)_init->kernel_esp;
  59. tss->ss0 = _init->kernel_ss;
  60. go_user_space((void*)0x40000000U);
  61. }