Skip to content

Commit 843e442

Browse files
authored
修复init进程忘记设定fs gs寄存器的问题。 (#132)
1 parent 74bde36 commit 843e442

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

kernel/src/process/process.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
#include <exception/gate.h>
2222
#include <filesystem/devfs/devfs.h>
2323
#include <filesystem/fat32/fat32.h>
24-
#include <filesystem/rootfs/rootfs.h>
2524
#include <filesystem/procfs/procfs.h>
25+
#include <filesystem/rootfs/rootfs.h>
2626
#include <ktest/ktest.h>
2727
#include <mm/slab.h>
2828
#include <sched/sched.h>
@@ -123,6 +123,18 @@ void __switch_to(struct process_control_block *prev, struct process_control_bloc
123123
}
124124
#pragma GCC pop_options
125125

126+
/**
127+
* @brief 切换进程的fs、gs寄存器
128+
* 注意,fs、gs的值在return的时候才会生效,因此本函数不能简化为一个单独的宏
129+
* @param fs 目标fs值
130+
* @param gs 目标gs值
131+
*/
132+
void process_switch_fsgs(uint64_t fs, uint64_t gs)
133+
{
134+
asm volatile("movq %0, %%fs \n\t" ::"a"(fs));
135+
asm volatile("movq %0, %%gs \n\t" ::"a"(gs));
136+
}
137+
126138
/**
127139
* @brief 打开要执行的程序文件
128140
*
@@ -504,6 +516,7 @@ ul initial_kernel_thread(ul arg)
504516
current_pcb->thread->fs = USER_DS | 0x3;
505517
barrier();
506518
current_pcb->thread->gs = USER_DS | 0x3;
519+
process_switch_fsgs(current_pcb->thread->fs, current_pcb->thread->gs);
507520

508521
// 主动放弃内核线程身份
509522
current_pcb->flags &= (~PF_KTHREAD);

0 commit comments

Comments
 (0)