mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-20 10:06:31 +00:00
使用Rust重构CFS调度器 (#131)
* 新建调度器的文件 * 把softirq vector移动到c文件中(原来在.h) * 将进程切换方式改为“中断返回时切换” * new:使用rust重构CFS * 删除已经在smp中废弃的HPET中断转发函数 * 代码格式化 * 删除多余的dunce依赖
This commit is contained in:
Makefile
kernel
@ -90,7 +90,7 @@ static struct process_control_block *__kthread_create_on_node(int (*thread_fn)(v
|
||||
int len = vsnprintf(pcb_name, name_fmt, PCB_NAME_LEN, get_args);
|
||||
if (len >= PCB_NAME_LEN)
|
||||
{
|
||||
//名字过大 放到full_name字段中
|
||||
// 名字过大 放到full_name字段中
|
||||
struct kthread_info_t *kthread = to_kthread(pcb);
|
||||
char *full_name = kzalloc(1024, 0);
|
||||
vsprintf(full_name, name_fmt, get_args);
|
||||
@ -173,7 +173,7 @@ static int kthread(void *_create)
|
||||
// 将当前pcb返回给创建者
|
||||
create->result = current_pcb;
|
||||
|
||||
current_pcb->state &= ~PROC_RUNNING; // 设置当前进程不是RUNNING态
|
||||
current_pcb->state &= ~PROC_RUNNING; // 设置当前进程不是RUNNING态
|
||||
io_mfence();
|
||||
|
||||
// 发起调度,使得当前内核线程休眠。直到创建者通过process_wakeup将当前内核线程唤醒
|
||||
@ -200,6 +200,8 @@ static void __create_kthread(struct kthread_create_info_t *create)
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize("O0")
|
||||
/**
|
||||
* @brief kthread守护线程
|
||||
*
|
||||
@ -208,6 +210,7 @@ static void __create_kthread(struct kthread_create_info_t *create)
|
||||
*/
|
||||
int kthreadd(void *unused)
|
||||
{
|
||||
barrier();
|
||||
kinfo("kthread daemon started!");
|
||||
struct process_control_block *pcb = current_pcb;
|
||||
kthreadd_pcb = current_pcb;
|
||||
@ -237,8 +240,11 @@ int kthreadd(void *unused)
|
||||
}
|
||||
spin_unlock(&__kthread_create_lock);
|
||||
}
|
||||
barrier();
|
||||
}
|
||||
|
||||
#pragma GCC pop_options
|
||||
|
||||
/**
|
||||
* @brief 内核线程调用该函数,检查自身的标志位,判断自己是否应该执行完任务后退出
|
||||
*
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <DragonOS/signal.h>
|
||||
#include <common/wait_queue.h>
|
||||
#include <DragonOS/stdint.h>
|
||||
#include "ptrace.h"
|
||||
|
||||
// 进程最大可拥有的文件描述符数量
|
||||
#define PROC_MAX_FD_NUM 16
|
||||
@ -128,6 +129,7 @@ struct process_control_block
|
||||
sigset_t sig_blocked;
|
||||
// 正在等待的信号的标志位,表示某个信号正在等待处理
|
||||
struct sigpending sig_pending;
|
||||
|
||||
};
|
||||
|
||||
// 将进程的pcb和内核栈融合到一起,8字节对齐
|
||||
|
@ -219,4 +219,5 @@ extern int process_try_to_wake_up(struct process_control_block *_pcb, uint64_t _
|
||||
* @return true 唤醒成功
|
||||
* @return false 唤醒失败
|
||||
*/
|
||||
extern int process_wake_up_state(struct process_control_block *pcb, uint64_t state);
|
||||
extern int process_wake_up_state(struct process_control_block *pcb, uint64_t state);
|
||||
void __switch_to(struct process_control_block *prev, struct process_control_block *next);
|
@ -3,9 +3,9 @@ use core::ptr::{read_volatile, write_volatile};
|
||||
use crate::{
|
||||
arch::asm::current::current_pcb,
|
||||
include::bindings::bindings::{
|
||||
process_control_block, sched_enqueue, PROC_RUNNING, PROC_STOPPED,
|
||||
process_control_block, PROC_RUNNING, PROC_STOPPED,
|
||||
},
|
||||
sched::core::cpu_executing,
|
||||
sched::core::{cpu_executing, sched_enqueue},
|
||||
smp::core::{smp_get_processor_id, smp_send_reschedule},
|
||||
};
|
||||
|
||||
@ -76,7 +76,6 @@ pub extern "C" fn process_wake_up_state(pcb: *mut process_control_block, state:
|
||||
return process_try_to_wake_up(pcb, state, 0);
|
||||
}
|
||||
|
||||
|
||||
/// @brief 让一个正在cpu上运行的进程陷入内核
|
||||
pub fn process_kick(pcb: *mut process_control_block) {
|
||||
preempt_disable();
|
||||
@ -99,5 +98,5 @@ pub fn process_cpu(pcb: *const process_control_block) -> u32 {
|
||||
/// @param pcb 进程的pcb
|
||||
#[inline]
|
||||
pub fn process_is_executing(pcb: *const process_control_block) -> bool {
|
||||
return cpu_executing(process_cpu(pcb)) == pcb;
|
||||
return cpu_executing(process_cpu(pcb)) as *const process_control_block == pcb;
|
||||
}
|
||||
|
@ -2,10 +2,6 @@
|
||||
|
||||
#define __PTRACE_H__
|
||||
|
||||
/*
|
||||
|
||||
*/
|
||||
|
||||
struct pt_regs
|
||||
{
|
||||
unsigned long r15;
|
||||
@ -36,9 +32,9 @@ struct pt_regs
|
||||
|
||||
/**
|
||||
* @brief 判断pt_regs是否来自用户态
|
||||
*
|
||||
* @param regs
|
||||
* @return __always_inline
|
||||
*
|
||||
* @param regs
|
||||
* @return __always_inline
|
||||
*/
|
||||
static inline int user_mode(struct pt_regs *regs)
|
||||
{
|
||||
|
Reference in New Issue
Block a user