int init(void) { int ret = 0; pid_t pid; if (!(pid = sys_fork())) { set_kernel_stack(current_task->kernel_stack + KERNEL_STACK_SIZE); asm volatile ("int $0x80":"=a"(ret):"a"(__NR_execve), "b"("/bin/init"), "c"(0), "d"(0)); asm volatile ("int $0x80"::"a"(__NR_exit), "b"(ret)); for (;;); }
void InitSyscalls(void) { //KernelStack = kmalloc(STACK_SIZE); u32 StackTop = (u32)KernelStack + STACK_SIZE - 4; set_kernel_stack(StackTop); WriteMSR(MSR_IA32_SYSENTER_CS, 0, 0xb); // 0x8 + 0x3 WriteMSR(MSR_IA32_SYSENTER_ESP, 0, StackTop); WriteMSR(MSR_IA32_SYSENTER_EIP, 0, (u32)SyscallEntry); register_interrupt_handler(0x80, Int80hSyscall); register_interrupt_handler(0x21, kbd_irq); }
void switch_to_user_mode() { /* set up the kernel stack first...*/ set_kernel_stack(current_tss, current_task->kernel_stack + (KERN_STACK_SIZE-STACK_ELEMENT_SIZE)); do_switch_to_user_mode(); }