Good day to all.
I am learning from the tutorial by jamesmolloy (http://www.jamesmolloy.co.uk/tutorial_html/). Thank him for a good tutorial. I wrote my own heap to fix some errors. Fork works fine in kernel mode. But I see errors in user mode (sys_fork()). If the fork first returns 0, the child process will stop working, and the parent process and the rest will continue. Otherwise, everything works correctly. How can I find out where the error is?
Please help me find a bug.
Please help me solve the problem with fork
-
- Member
- Posts: 5515
- Joined: Mon Mar 25, 2013 7:01 pm
Re: Please help me solve the problem with fork
I see you wrote your own heap implementation to fix some bugs in the tutorial. Did you fix the other bugs in the tutorial too?
Re: Please help me solve the problem with fork
Yes. I corrected the errors described there. But I didn’t know where to start rewriting multitasking. It also worked well in kernel mode. Then I got rid of the move_stack () function. According to my observations, I often get the right job, but the problem has not yet been solved.Octocontrabass wrote:I see you wrote your own heap implementation to fix some bugs in the tutorial. Did you fix the other bugs in the tutorial too?
Code: Select all
if (current_task == parent_task)
{
uint32_t esp; asm volatile("mov %%esp, %0" : "=r"(esp));
uint32_t ebp; asm volatile("mov %%ebp, %0" : "=r"(ebp));
if (current_task->kernel_stack > new_task->kernel_stack) {
new_task->esp = esp - (current_task->kernel_stack - new_task->kernel_stack);
new_task->ebp = ebp - (current_task->kernel_stack - new_task->kernel_stack);
} else {
new_task->esp = esp + (new_task->kernel_stack - current_task->kernel_stack);
new_task->ebp = ebp - (current_task->kernel_stack - new_task->kernel_stack);
}
memcpy((void *)(new_task->kernel_stack - 2048), (void *)(current_task->kernel_stack - 2048), 2048);
// new_task->esp = esp;
// new_task->ebp = ebp;
new_task->eip = eip;
asm volatile("sti");
return new_task->id;
}
Re: Please help me solve the problem with fork
When system/init launched, the init goes into user mode. system/init calls the system call fork. Then either the child breaks down or works correctly. In 3, the fork is called again.
Code: Select all
void switch_to_user_mode(uintptr_t location)
{
asm volatile("sti");
set_kernel_stack(current_task->kernel_stack);
asm volatile( "mov $0x23, %%ax\n"
"mov %%ax, %%ds\n"
"mov %%ax, %%es\n"
"mov %%ax, %%fs\n"
"mov %%ax, %%gs\n"
"mov %%esp, %%eax\n"
"pushl $0x23\n"
"pushl %%eax\n"
"pushf\n"
"popl %%eax\n"
"orl $0x200, %%eax\n"
"pushl %%eax\n"
"pushl $0x1B\n"
"pushl %0\n"
"iret\n"
: : "m"(location));
}