进程管理模块重构完成 (#380)

* 添加新版pcb的数据结构 (#273)

* 将pcb中的内容分类,分别加锁 (#305)

* 进程管理重构:完成fork的主体逻辑 (#309)

1.完成fork的主体逻辑
2.将文件系统接到新的pcb上
3.经过思考,暂时弃用signal机制,待进程管理重构完成后,重写signal机制.原因是原本的signal机制太烂了

* chdir getcwd pid pgid ppid (#310)


---------

Co-authored-by: longjin <longjin@RinGoTek.cn>

* 删除旧的fork以及signal的代码,并调整fork/vfork/execve系统调用 (#325)

1.删除旧的fork
2.删除signal相关代码,等进程管理重构结束之后,再重新写.
3.调整了fork/vfork/execve系统调用

* 实现切换进程的代码 (#331)



* 实现切换进程的代码

* Patch modify preempt (#332)

* 修改设置preempt的代码

* 删除rust的list和refcount

* 为每个核心初始化idle进程 (#333)

* 为每个核心初始化idle进程

* 完成了新的内核线程机制 (#335)

* 调度器的pcb替换为新的Arc<ProcessControlBlock>,把调度器队列锁从 RwSpinLock 替换为了 SpinLock (#336)

* 把调度器的pcb替换为新的Arc<ProcessControlBlock>

* 把调度器队列锁从 RwSpinLock 替换为了 SpinLock ,修改了签名以通过编译

* 修正一些双重加锁、细节问题

---------

Co-authored-by: longjin <longjin@RinGoTek.cn>

* github workflow自动检查代码是否格式化

* cache toolchain yml

* 调整rust版本的waitqueue中的pcb为新版的pcb (#343)

* 解决设置rust workspace带来的“工具链不一致”的问题 (#344)


* 解决设置rust workspace带来的“工具链不一致”的问题

更改workflow

* 调整pcb的sched_info和rwlock,以避免调度器死锁问题 (#341)

* 调整pcb的sched_info和rwlock,以避免调度器死锁问题

* 修改为在 WriterGuard 中维护 Irq_guard

* 修正了 write_irqsave方法

* 优化了代码

* 把 set state 操作从 wakup 移动到 sched_enqueue 中

* 修正为在 wakeup 中设置 running ,以保留 set_state 的私有性

* 移除了 process_wakeup

* 实现进程退出的逻辑 (#340)

实现进程退出的逻辑

* 标志进程sleep

* 修复wakeup的问题

---------

Co-authored-by: longjin <longjin@RinGoTek.cn>

* rust 重构 completion (#350)

* 完成了completion的基本结构,待完善上级调用

* 用SpinLock保护结构体并发安全

* 修改原子变量为u32,修复符号错误

* irq guard

* 修改为具有内部可变性的结构体

* temp fix

* 修复了由于进程持有自旋锁导致的不被调度的问题

* 对 complete 系列方法上锁,保护 done 数据并发安全

* 移除了未使用的依赖

* 重写显示刷新驱动 (#363)

* 重构显示刷新驱动

* Patch refactor process management (#366)

* 维护进程树

* 维护进程树

* 更改代码结构

* 新建进程时,设置cwd

* 调整adopt childern函数,降低开销

---------

Co-authored-by: longjin <longjin@RinGoTek.cn>

* waitqueue兼容C部分 (#351)

* PATH

* safe init

* waitqueue兼容C部分

* waitqueue兼容C部分

* 删除semaphore.c,在ps2_keyboard中使用waitqueue

* 删除semaphore.c,在ps2_keyboard中使用waitqueue

* current_pcb的C兼容

* current_pcb的C兼容

* current_pcb的C兼容

* fmt

* current_pcb的兼容

* 针对修改

* 调整代码

* fmt

* 删除pcb的set flags

* 更改函数名

---------

Co-authored-by: longjin <longjin@RinGoTek.cn>

* merge master

* Patch debug process management refactor (#372)

* 能够调通,执行完textui_init

* 能跑到initial kernel thread

* fmt

* 能够正常初始化所有服务(尚未能切换到用户程序)

* 删除部分无用的extern

* 存在问题:ap处理器启动后,bsp的smp_init函数return之后就出错了,怀疑是栈损坏

* 解决smp启动由于未换栈导致的内存访问错误

* debug

* 1

* 1

* lock no preempt

* 调通

* 优化代码,删除一些调试日志

* fix

* 使用rust重写wait4 (#377)

* 维护进程树

* 维护进程树

* 更改代码结构

* 新建进程时,设置cwd

* 调整adopt childern函数,降低开销

* wait4

* 删除c_sys_wait4

* 使用userbuffer保护裸指针

---------

Co-authored-by: longjin <longjin@RinGoTek.cn>

* 消除warning

* 1. 修正未设置cpu executing的问题

* 修正kthread机制可能存在的内存泄露问题

* 删除pcb文档

* 删除C的tss struct

---------

Co-authored-by: Bullet <93781792+GP-Bullet@users.noreply.github.com>
Co-authored-by: Chiichen <39649411+Chiichen@users.noreply.github.com>
Co-authored-by: hanjiezhou <zhouhanjie@dragonos.org>
Co-authored-by: GnoCiYeH <118462160+GnoCiYeH@users.noreply.github.com>
Co-authored-by: houmkh <1119644616@qq.com>
This commit is contained in:
LoGin
2023-09-15 14:58:19 +08:00
committed by GitHub
parent b087521e07
commit 1496ba7b24
153 changed files with 4895 additions and 8190 deletions

View File

@ -1,8 +1,10 @@
#include "clocksource.h"
#include <common/kthread.h>
#include <common/kprint.h>
void run_watchdog_kthread()
{
kdebug("run_watchdog_kthread");
kthread_run(rs_clocksource_watchdog_kthread, NULL, "clocksource_watchdog");
}
kerror("run_watchdog_kthread");
while(1);
// todo: 进程管理重构后改掉这里换到rust的实现
// kthread_run(rs_clocksource_watchdog_kthread, NULL, "clocksource_watchdog");
}

View File

@ -1,6 +1,5 @@
#pragma once
#include <common/kthread.h>
extern int rs_clocksource_watchdog_kthread(void *_data);
extern void rs_clocksource_boot_finish();

View File

@ -10,4 +10,4 @@
* @param usec 微秒
* @return int
*/
int rs_usleep(useconds_t usec);
int rs_usleep(useconds_t usec);

View File

@ -3,9 +3,10 @@ use core::{arch::x86_64::_rdtsc, hint::spin_loop};
use alloc::{boxed::Box, sync::Arc};
use crate::{
arch::{asm::current::current_pcb, sched::sched, CurrentIrqArch},
arch::{sched::sched, CurrentIrqArch},
exception::InterruptArch,
include::bindings::bindings::{useconds_t, Cpu_tsc_freq},
process::ProcessManager,
syscall::SystemError,
};
@ -39,7 +40,7 @@ pub fn nanosleep(sleep_time: TimeSpec) -> Result<TimeSpec, SystemError> {
});
}
// 创建定时器
let handler: Box<WakeUpHelper> = WakeUpHelper::new(current_pcb());
let handler: Box<WakeUpHelper> = WakeUpHelper::new(ProcessManager::current_pcb());
let timer: Arc<Timer> = Timer::new(
handler,
next_n_us_timer_jiffies((sleep_time.tv_nsec / 1000) as u64),
@ -47,10 +48,9 @@ pub fn nanosleep(sleep_time: TimeSpec) -> Result<TimeSpec, SystemError> {
let irq_guard: crate::exception::IrqFlagsGuard =
unsafe { CurrentIrqArch::save_and_disable_irq() };
ProcessManager::mark_sleep(true).ok();
timer.activate();
unsafe {
current_pcb().mark_sleep_interruptible();
}
drop(irq_guard);
sched();

View File

@ -2,7 +2,7 @@
#include <common/glib.h>
#include <driver/timers/HPET/HPET.h>
#include <common/kthread.h>
// 定义LONG_MAX为最大超时时间 - 允许负数
#define MAX_TIMEOUT (int64_t)((1ul << 63) - 1)

View File

@ -11,14 +11,14 @@ use alloc::{
};
use crate::{
arch::{asm::current::current_pcb, sched::sched, CurrentIrqArch},
arch::{sched::sched, CurrentIrqArch},
exception::{
softirq::{softirq_vectors, SoftirqNumber, SoftirqVec},
InterruptArch,
},
include::bindings::bindings::{process_control_block, process_wakeup, PROC_RUNNING},
kdebug, kerror, kinfo,
libs::spinlock::SpinLock,
process::{ProcessControlBlock, ProcessManager},
syscall::SystemError,
};
@ -40,20 +40,18 @@ pub trait TimerFunction: Send + Sync + Debug {
#[derive(Debug)]
/// WakeUpHelper函数对应的结构体
pub struct WakeUpHelper {
pcb: &'static mut process_control_block,
pcb: Arc<ProcessControlBlock>,
}
impl WakeUpHelper {
pub fn new(pcb: &'static mut process_control_block) -> Box<WakeUpHelper> {
pub fn new(pcb: Arc<ProcessControlBlock>) -> Box<WakeUpHelper> {
return Box::new(WakeUpHelper { pcb });
}
}
impl TimerFunction for WakeUpHelper {
fn run(&mut self) -> Result<(), SystemError> {
unsafe {
process_wakeup(self.pcb);
}
ProcessManager::wakeup(&self.pcb).ok();
return Ok(());
}
}
@ -247,9 +245,12 @@ pub fn schedule_timeout(mut timeout: i64) -> Result<i64, SystemError> {
let irq_guard = unsafe { CurrentIrqArch::save_and_disable_irq() };
timeout += TIMER_JIFFIES.load(Ordering::SeqCst) as i64;
let timer = Timer::new(WakeUpHelper::new(current_pcb()), timeout as u64);
let timer = Timer::new(
WakeUpHelper::new(ProcessManager::current_pcb()),
timeout as u64,
);
ProcessManager::mark_sleep(true).ok();
timer.activate();
current_pcb().state &= (!PROC_RUNNING) as u64;
drop(irq_guard);