diff --git a/kernel/src/driver/virtio/transport_pci.rs b/kernel/src/driver/virtio/transport_pci.rs index 6a88aa71..5f83460a 100644 --- a/kernel/src/driver/virtio/transport_pci.rs +++ b/kernel/src/driver/virtio/transport_pci.rs @@ -7,7 +7,7 @@ use crate::driver::pci::pci::{ use crate::driver::pci::pci_irq::{IrqCommonMsg, IrqMsg, IrqSpecificMsg, PciInterrupt, IRQ}; use crate::include::bindings::bindings::pt_regs; -use crate::kdebug; + use crate::libs::volatile::{ volread, volwrite, ReadOnly, Volatile, VolatileReadable, VolatileWritable, WriteOnly, }; diff --git a/kernel/src/filesystem/vfs/file.rs b/kernel/src/filesystem/vfs/file.rs index 21c694ee..3c55fe89 100644 --- a/kernel/src/filesystem/vfs/file.rs +++ b/kernel/src/filesystem/vfs/file.rs @@ -277,8 +277,6 @@ impl File { self.offset += 1; dirent.d_ino = sub_inode.metadata().unwrap().inode_id.into() as u64; - dirent.d_off = 0; - dirent.d_reclen = 0; dirent.d_type = sub_inode.metadata().unwrap().file_type.get_file_type_num() as u8; // 根据posix的规定,dirent中的d_name是一个不定长的数组,因此需要unsafe来拷贝数据 unsafe { @@ -289,8 +287,13 @@ impl File { } // 计算dirent结构体的大小 - return Ok((name_bytes.len() + ::core::mem::size_of::() - - ::core::mem::size_of_val(&dirent.d_name)) as u64); + let size = (name_bytes.len() + ::core::mem::size_of::() + - ::core::mem::size_of_val(&dirent.d_name)) as u64; + + dirent.d_reclen = size as u16; + dirent.d_off += dirent.d_reclen as i64; + + return Ok(size); } pub fn inode(&self) -> Arc { diff --git a/kernel/src/process/fork.rs b/kernel/src/process/fork.rs index 474350ac..0a836d16 100644 --- a/kernel/src/process/fork.rs +++ b/kernel/src/process/fork.rs @@ -182,13 +182,13 @@ impl ProcessManager { let new_fd_table = current_pcb.basic().fd_table().unwrap().read().clone(); let new_fd_table = Arc::new(RwLock::new(new_fd_table)); new_pcb.basic_mut().set_fd_table(Some(new_fd_table)); + } else { + // 如果共享文件描述符表,则直接拷贝指针 + new_pcb + .basic_mut() + .set_fd_table(current_pcb.basic().fd_table().clone()); } - // 如果共享文件描述符表,则直接拷贝指针 - new_pcb - .basic_mut() - .set_fd_table(current_pcb.basic().fd_table().clone()); - return Ok(()); } diff --git a/kernel/src/process/init.rs b/kernel/src/process/init.rs index 241c9e49..39190815 100644 --- a/kernel/src/process/init.rs +++ b/kernel/src/process/init.rs @@ -36,9 +36,9 @@ pub fn initial_kernel_thread() -> i32 { /// 切换到用户态 fn switch_to_user() { - let path = String::from("/bin/shell.elf"); - let argv = vec![String::from("/bin/shell.elf")]; - let envp = vec![String::from("PATH=/bin")]; + let path = String::from("/bin/DragonReach"); + let argv = vec![String::from("/bin/DragonReach")]; + let envp = vec![String::from("PATH=/")]; unsafe { arch_switch_to_user(path, argv, envp) }; } diff --git a/user/Makefile b/user/Makefile index 4c53c5ce..1b600d77 100644 --- a/user/Makefile +++ b/user/Makefile @@ -14,7 +14,7 @@ current_CFLAGS := $(CFLAGS) DADK_VERSION=$(shell dadk -V | awk 'END {print $$2}') # 最小的DADK版本 -MIN_DADK_VERSION = 0.1.2 +MIN_DADK_VERSION = 0.1.3 DADK_CACHE_DIR = $(ROOT_PATH)/bin/dadk_cache # 旧版的libc安装路径 @@ -57,8 +57,9 @@ dadk_run: install_dadk .PHONY: dadk_clean dadk_clean: install_dadk - dadk --config-dir dadk/config --cache-dir $(DADK_CACHE_DIR) --dragonos-dir $(ROOT_PATH)/bin/sysroot clean src - dadk --config-dir dadk/config --cache-dir $(DADK_CACHE_DIR) --dragonos-dir $(ROOT_PATH)/bin/sysroot clean target +# 不运行dadk clean的原因是,把clean的工作交给应用程序自己去做,这样可以节省编译时间 +#dadk --config-dir dadk/config --cache-dir $(DADK_CACHE_DIR) --dragonos-dir $(ROOT_PATH)/bin/sysroot clean src +#dadk --config-dir dadk/config --cache-dir $(DADK_CACHE_DIR) --dragonos-dir $(ROOT_PATH)/bin/sysroot clean target $(user_sub_dirs): ECHO sys_api_lib diff --git a/user/dadk/config/dragon_reach-0.1.0.dadk b/user/dadk/config/dragon_reach-0.1.0.dadk new file mode 100644 index 00000000..b4ba1e92 --- /dev/null +++ b/user/dadk/config/dragon_reach-0.1.0.dadk @@ -0,0 +1,29 @@ +{ + "name": "DragonReach", + "version": "0.1.0", + "description": "init程序", + "task_type": { + "BuildFromSource": { + "Git": { + "url" : "https://git.mirrors.dragonos.org/DragonOS-Community/DragonReach.git", + "revision": "4aac1004fa" + } + } + }, + "depends": [], + "build": { + "build_command": "make install" + }, + "clean": { + "clean_command": "make clean" + }, + "install": { + "in_dragonos_path": "/" + }, + "envs": [ + { + "key": "TARGET", + "value": "${ROOT_PATH}/user/dadk/target/x86_64-unknown-dragonos.json" + } + ] +} diff --git a/user/dadk/config/relibc-0.1.0.dadk b/user/dadk/config/relibc-0.1.0.dadk index 38bd6684..e88de99c 100644 --- a/user/dadk/config/relibc-0.1.0.dadk +++ b/user/dadk/config/relibc-0.1.0.dadk @@ -6,8 +6,7 @@ "BuildFromSource": { "Git": { "url": "https://git.mirrors.dragonos.org/DragonOS-Community/relibc.git", - "branch": "dragonos-relibc", - "revision": null + "revision": "26536e7fcd" } } }, diff --git a/user/dadk/target/x86_64-unknown-dragonos.json b/user/dadk/target/x86_64-unknown-dragonos.json new file mode 100644 index 00000000..d1dfb39f --- /dev/null +++ b/user/dadk/target/x86_64-unknown-dragonos.json @@ -0,0 +1,35 @@ +{ + "arch": "x86_64", + "code-model": "kernel", + "cpu": "x86-64", + "os": "dragonos", + "target-endian": "little", + "target-pointer-width": "64", + "target-family": [ + "unix" + ], + "env": "musl", + "target-c-int-width": "32", + "data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", + "disable-redzone": true, + "features": "-3dnow,-3dnowa,-avx,-avx2", + "linker": "rust-lld", + "linker-flavor": "ld.lld", + "llvm-target": "x86_64-unknown-none", + "max-atomic-width": 64, + "panic-strategy": "abort", + "position-independent-executables": true, + "relro-level": "full", + "stack-probes": { + "kind": "inline-or-call", + "min-llvm-version-for-inline": [ + 16, + 0, + 0 + ] + }, + "static-position-independent-executables": true, + "supported-sanitizers": [ + "kcfi" + ] +}