Skip to content

Commit c4c35ed

Browse files
committed
Merge remote-tracking branch 'upstream/master' into feat-network-rebuild
2 parents 1848f09 + a05738e commit c4c35ed

File tree

113 files changed

+3216
-1297
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+3216
-1297
lines changed

.github/workflows/makefile.yml

+8-8
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ jobs:
1111
name: Format check ${{ matrix.arch }}
1212
runs-on: ubuntu-latest
1313
continue-on-error: true
14-
container: dragonos/dragonos-dev:v1.7
14+
container: dragonos/dragonos-dev:v1.8
1515

1616
strategy:
1717
matrix:
1818
arch: [x86_64, riscv64]
1919

2020
steps:
21-
- run: echo "Running in dragonos/dragonos-dev:v1.7"
21+
- run: echo "Running in dragonos/dragonos-dev:v1.8"
2222
- uses: actions/checkout@v3
2323

2424
- name: Format check
@@ -35,14 +35,14 @@ jobs:
3535
name: Kernel static test ${{ matrix.arch }}
3636
runs-on: ubuntu-latest
3737
continue-on-error: true
38-
container: dragonos/dragonos-dev:v1.7
38+
container: dragonos/dragonos-dev:v1.8
3939

4040
strategy:
4141
matrix:
4242
arch: [x86_64, riscv64]
4343

4444
steps:
45-
- run: echo "Running in dragonos/dragonos-dev:v1.7"
45+
- run: echo "Running in dragonos/dragonos-dev:v1.8"
4646

4747
- uses: actions/checkout@v3
4848

@@ -55,10 +55,10 @@ jobs:
5555

5656
build-x86_64:
5757
runs-on: ubuntu-latest
58-
container: dragonos/dragonos-dev:v1.7
58+
container: dragonos/dragonos-dev:v1.8
5959

6060
steps:
61-
- run: echo "Running in dragonos/dragonos-dev:v1.7"
61+
- run: echo "Running in dragonos/dragonos-dev:v1.8"
6262

6363
- uses: actions/checkout@v3
6464
- name: build the DragonOS
@@ -77,10 +77,10 @@ jobs:
7777
7878
build-riscv64:
7979
runs-on: ubuntu-latest
80-
container: dragonos/dragonos-dev:v1.7
80+
container: dragonos/dragonos-dev:v1.8
8181

8282
steps:
83-
- run: echo "Running in dragonos/dragonos-dev:v1.7"
83+
- run: echo "Running in dragonos/dragonos-dev:v1.8"
8484

8585
- uses: actions/checkout@v3
8686
with:

docs/introduction/build_system.md

+1
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ make run-docker
215215
### 5.1 创建磁盘镜像
216216

217217
  首先,您需要使用**普通用户**权限运行`tools/create_hdd_image.sh`,为DragonOS创建一块磁盘镜像文件。该脚本会自动完成创建磁盘镜像的工作,并将其移动到`bin/`目录下。
218+
218219
  请注意,由于权限问题,请务必使用**普通用户**权限运行此脚本。(运行后,需要提升权限时,系统可能会要求您输入密码)
219220

220221

docs/kernel/debug/debug-kernel-with-gdb.md

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
## 前言
55
  GDB是一个功能强大的开源调试工具,能够帮助您更好的诊断和修复程序中的错误。
6+
67
  它提供了一套丰富的功能,使您能够检查程序的执行状态、跟踪代码的执行流程、查看和修改变量的值、分析内存状态等。它可以与编译器配合使用,以便您在调试过程中访问程序的调试信息。
78

89
  此教程将告诉您如何在DragonOS中使用`rust-gdb`来调试内核,包括如何开始调试以及相应的调试命令。
@@ -29,6 +30,7 @@ debug = true
2930
### 1.2 运行DragonOS
3031

3132
  准备工作完成后,您就可以编译、运行DragonOS来开展后续的调试工作了。
33+
3234
  在DragonOS根目录中开启终端,使用`make run`即可开始编译运行DragonOS,如需更多编译命令方面的帮助,详见
3335
> [构建DragonOS](https://docs.dragonos.org/zh_CN/latest/introduction/build_system.html)
3436

docs/kernel/process_management/kthread.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
  内核线程的创建是通过调用`KernelThreadMechanism::create()`或者`KernelThreadMechanism::create_and_run()`函数,向`kthreadd`守护线程发送创建任务来实现的。也就是说,内核线程的创建,最终是由`kthread_daemon`来完成。
1010

1111
  当内核线程被创建后,默认处于睡眠状态,要使用`ProcessManager::wakeup`函数将其唤醒。
12+
1213
  当内核其他模块想要停止一个内核线程的时候,可以调用`KernelThreadMechanism::stop()`函数,等待内核线程的退出,然后获得返回值并清理内核线程的pcb。
1314

1415
  内核线程应当经常检查`KernelThreadMechanism::should_stop()`的结果,以确定其是否要退出。当检测到需要退出时,内核线程返回一个返回码,即可退出。(注意资源的清理)

docs/kernel/sched/cfs.md

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
  ``FairSchedEntity``是完全公平调度器中最重要的结构体,他代表一个实体单位,它不止表示一个进程,它还可以是一个组或者一个用户,但是它在cfs队列中所表示的就单单是一个调度实体。这样的设计可以为上层提供更多的思路,比如上层可以把不同的进程归纳到一个调度实体从而实现组调度等功能而不需要改变调度算法。
1717

1818
  在cfs中,整体的结构是**一棵树**,每一个调度实体作为``cfs_rq``中的一个节点,若该调度实体不是单个进程(它可能是一个进程组),则在该调度实体中还需要维护一个自己的``cfs_rq``,这样的嵌套展开后,每一个叶子节点就是一个单独的进程。需要理解这样一棵树,**在后续文档中会以这棵树为核心讲解**
19+
1920
  该结构体具体的字段意义请查阅源代码。这里提及几个重要的字段:
2021

2122

kernel/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ paste = "=1.0.14"
6363
slabmalloc = { path = "crates/rust-slabmalloc" }
6464
log = "0.4.21"
6565
kprobe = { path = "crates/kprobe" }
66-
xarray = "0.1.0"
6766
lru = "0.12.3"
6867

6968
rbpf = { path = "crates/rbpf" }
@@ -76,6 +75,7 @@ unwinding = { git = "https://git.mirrors.dragonos.org.cn/DragonOS-Community/unwi
7675
"panic",
7776
"personality"
7877
]}
78+
defer = "0.2.1"
7979

8080
# target为x86_64时,使用下面的依赖
8181
[target.'cfg(target_arch = "x86_64")'.dependencies]
@@ -106,4 +106,4 @@ debug = true # Controls whether the compiler passes `-g`
106106

107107
# The release profile, used for `cargo build --release`
108108
[profile.release]
109-
debug = false
109+
debug = true

kernel/crates/rbpf/src/interpreter.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -660,9 +660,9 @@ pub fn execute_program(
660660
// Save the callee saved registers
661661
pre_stack.save_registers(&reg[6..=9]);
662662
// Save the return address
663-
pre_stack.save_return_address(insn_ptr as u16);
663+
pre_stack.save_return_address(insn_ptr as u64);
664664
// save the stack pointer
665-
pre_stack.save_sp(reg[10] as u16);
665+
pre_stack.save_sp(reg[10]);
666666
let mut stack = StackFrame::new();
667667
log::trace!("BPF TO BPF CALL: new pc: {} + {} = {}",insn_ptr ,insn.imm,insn_ptr + insn.imm as usize);
668668
reg[10] = stack.as_ptr() as u64 + stack.len() as u64;
@@ -695,7 +695,7 @@ pub fn execute_program(
695695
// Restore the return address
696696
insn_ptr = stack.get_return_address() as usize;
697697
// Restore the stack pointer
698-
reg[10] = stack.get_sp() as u64;
698+
reg[10] = stack.get_sp();
699699
log::trace!("EXIT: new pc: {}", insn_ptr);
700700
}
701701
}

kernel/crates/rbpf/src/stack.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use crate::{ebpf::STACK_SIZE, vec, Vec};
22

33
pub struct StackFrame {
4-
return_address: u16,
4+
return_address: u64,
55
saved_registers: [u64; 4],
6-
sp: u16,
6+
sp: u64,
77
frame: Vec<u8>,
88
}
99

@@ -54,22 +54,22 @@ impl StackFrame {
5454
}
5555

5656
/// Save the return address
57-
pub fn save_return_address(&mut self, address: u16) {
57+
pub fn save_return_address(&mut self, address: u64) {
5858
self.return_address = address;
5959
}
6060

6161
/// Get the return address
62-
pub fn get_return_address(&self) -> u16 {
62+
pub fn get_return_address(&self) -> u64 {
6363
self.return_address
6464
}
6565

6666
/// Save the stack pointer
67-
pub fn save_sp(&mut self, sp: u16) {
67+
pub fn save_sp(&mut self, sp: u64) {
6868
self.sp = sp;
6969
}
7070

7171
/// Get the stack pointer
72-
pub fn get_sp(&self) -> u16 {
72+
pub fn get_sp(&self) -> u64 {
7373
self.sp
7474
}
7575
}

kernel/crates/system_error/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ edition = "2021"
77

88
[dependencies]
99
num-traits = { git = "https://git.mirrors.dragonos.org.cn/DragonOS-Community/num-traits.git", rev="1597c1c", default-features = false }
10-
num-derive = "0.3"
10+
num-derive = "0.3"

kernel/crates/system_error/src/lib.rs

+32-12
Original file line numberDiff line numberDiff line change
@@ -277,31 +277,51 @@ pub enum SystemError {
277277

278278
// === 以下错误码不应该被用户态程序使用 ===
279279
ERESTARTSYS = 512,
280+
ERESTARTNOINTR = 513,
281+
/// restart if no handler
282+
ERESTARTNOHAND = 514,
283+
284+
/// 没有对应的ioctlcmd
285+
ENOIOCTLCMD = 515,
286+
/// restart by calling sys restart syscall
287+
ERESTART_RESTARTBLOCK = 516,
288+
289+
// === TODO: 这几个KVM的错误码不要放在这里 ===
290+
280291
// VMX on 虚拟化开启指令出错
281-
EVMXONFailed = 513,
292+
EVMXONFailed = 1513,
282293
// VMX off 虚拟化关闭指令出错
283-
EVMXOFFFailed = 514,
294+
EVMXOFFFailed = 1514,
284295
// VMX VMWRITE 写入虚拟化VMCS内存出错
285-
EVMWRITEFailed = 515,
286-
EVMREADFailed = 516,
287-
EVMPRTLDFailed = 517,
288-
EVMLAUNCHFailed = 518,
289-
KVM_HVA_ERR_BAD = 519,
290-
/// 没有对应的ioctlcmd
291-
ENOIOCTLCMD = 520,
296+
EVMWRITEFailed = 1515,
297+
EVMREADFailed = 1516,
298+
EVMPRTLDFailed = 1517,
299+
EVMLAUNCHFailed = 1518,
300+
KVM_HVA_ERR_BAD = 1519,
301+
302+
MAXERRNO = 4095,
292303
}
293304

294305
impl SystemError {
295-
/// @brief 把posix错误码转换为系统错误枚举类型。
306+
/// 判断一个值是否是有效的posix错误码。
307+
pub fn is_valid_posix_errno<T>(val: T) -> bool
308+
where
309+
T: PartialOrd + From<i32>,
310+
{
311+
let max_errno = T::from(-(Self::MAXERRNO as i32));
312+
val < T::from(0) && val >= max_errno
313+
}
314+
315+
/// 尝试把posix错误码转换为系统错误枚举类型。
296316
pub fn from_posix_errno(errno: i32) -> Option<SystemError> {
297317
// posix 错误码是小于0的
298-
if errno >= 0 {
318+
if !Self::is_valid_posix_errno(errno) {
299319
return None;
300320
}
301321
return <Self as num_traits::FromPrimitive>::from_i32(-errno);
302322
}
303323

304-
/// @brief 把系统错误枚举类型转换为负数posix错误码。
324+
/// 把系统错误枚举类型转换为负数posix错误码。
305325
pub fn to_posix_errno(&self) -> i32 {
306326
return -<Self as num_traits::ToPrimitive>::to_i32(self).unwrap();
307327
}

kernel/src/arch/riscv64/ipc/signal.rs

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use log::error;
22

33
use crate::{
4-
arch::{sched::sched, CurrentIrqArch},
4+
arch::{interrupt::TrapFrame, sched::sched, CurrentIrqArch},
55
exception::InterruptArch,
6+
ipc::signal_types::SignalArch,
67
process::ProcessManager,
78
};
89

@@ -339,3 +340,18 @@ fn sig_continue(sig: Signal) {
339340
fn sig_ignore(_sig: Signal) {
340341
return;
341342
}
343+
344+
pub struct RiscV64SignalArch;
345+
346+
impl SignalArch for RiscV64SignalArch {
347+
// TODO: 为RISCV64实现信号处理
348+
// 注意,rv64现在在中断/系统调用返回用户态时,没有进入 irqentry_exit() 函数,
349+
// 到时候实现信号处理时,需要修改中断/系统调用返回用户态的代码,进入 irqentry_exit() 函数
350+
unsafe fn do_signal_or_restart(_frame: &mut TrapFrame) {
351+
todo!()
352+
}
353+
354+
fn sys_rt_sigreturn(_trap_frame: &mut TrapFrame) -> u64 {
355+
todo!()
356+
}
357+
}

kernel/src/arch/riscv64/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ pub use self::time::RiscV64TimeArch as CurrentTimeArch;
2727

2828
pub use self::elf::RiscV64ElfArch as CurrentElfArch;
2929

30+
pub use self::ipc::signal::RiscV64SignalArch as CurrentSignalArch;
31+
3032
pub use crate::arch::smp::RiscV64SMPArch as CurrentSMPArch;
3133

3234
pub use crate::arch::sched::RiscV64SchedArch as CurrentSchedArch;

kernel/src/arch/x86_64/asm/entry.S

+4-4
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ ENTRY(ret_from_intr)
6464
// 进入信号处理流程
6565
cli
6666

67-
// 将原本要返回的栈帧的栈指针传入do_signal的第一个参数
67+
// 将原本要返回的栈帧的栈指针传入irqentry_exit的第一个参数
6868
movq %rsp, %rdi
69-
callq do_signal
69+
callq irqentry_exit
7070
cli
7171

7272
__entry_ret_from_intr_before_gs_check_2:
@@ -375,10 +375,10 @@ ENTRY(syscall_64)
375375
sti
376376
callq *%rdx //调用服务程序
377377

378-
// 将原本要返回的栈帧的栈指针传入do_signal的第一个参数
378+
// 将原本要返回的栈帧的栈指针传入 irqentry_exit 的第一个参数
379379
movq %rsp, %rdi
380380

381-
callq do_signal
381+
callq irqentry_exit
382382

383383
cli
384384

kernel/src/arch/x86_64/interrupt/mod.rs

+27
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ pub struct TrapFrame {
125125
pub es: ::core::ffi::c_ulong,
126126
pub rax: ::core::ffi::c_ulong,
127127
pub func: ::core::ffi::c_ulong,
128+
/// - 该字段在异常发生时,保存的是错误码
129+
/// - 在系统调用时,由系统调用入口函数将其设置为系统调用号
128130
pub errcode: ::core::ffi::c_ulong,
129131
pub rip: ::core::ffi::c_ulong,
130132
pub cs: ::core::ffi::c_ulong,
@@ -182,6 +184,31 @@ impl TrapFrame {
182184
pub fn set_pc(&mut self, pc: usize) {
183185
self.rip = pc as u64;
184186
}
187+
188+
/// 获取系统调用号
189+
///
190+
/// # Safety
191+
/// 该函数只能在系统调用上下文中调用,
192+
/// 在其他上下文中,该函数返回值未定义
193+
pub unsafe fn syscall_nr(&self) -> Option<usize> {
194+
if self.errcode == u64::MAX {
195+
return None;
196+
}
197+
Some(self.errcode as usize)
198+
}
199+
200+
/// 获取系统调用错误码
201+
///
202+
/// # Safety
203+
/// 该函数只能在系统调用上下文中调用,
204+
/// 在其他上下文中,该函数返回值未定义
205+
///
206+
/// # Returns
207+
/// 返回一个 `Option<SystemError>`,表示系统调用的错误码。
208+
pub unsafe fn syscall_error(&self) -> Option<SystemError> {
209+
let val = self.rax as i32;
210+
SystemError::from_posix_errno(val)
211+
}
185212
}
186213

187214
impl ProbeArgs for TrapFrame {

0 commit comments

Comments
 (0)