소스 검색

fix(fs): fix ext4 fs in riscv64, It will work normally only when a single ext4 image is mounted.

Heinz 7 달 전
부모
커밋
faff005b55
4개의 변경된 파일16개의 추가작업 그리고 7개의 파일을 삭제
  1. 4 3
      Makefile.src
  2. 1 1
      src/fs/ext4.rs
  3. 1 1
      src/kernel/vfs/dentry.rs
  4. 10 2
      src/lib.rs

+ 4 - 3
Makefile.src

@@ -46,10 +46,8 @@ BINARY_DIR := $(BINARY_DIR_BASE)/$(MODE)
 QEMU_ARGS += \
 	-machine virt -kernel $(BINARY_DIR)/eonix_kernel \
 	-device virtio-blk-device,drive=disk0,bus=virtio-mmio-bus.0 \
-	-device virtio-blk-device,drive=disk1,bus=virtio-mmio-bus.1 \
 	-device virtio-net-device,netdev=mynet0 \
-	-drive id=disk0,file=build/boot-riscv64.img,format=raw,if=none \
-	-drive id=disk1,file=test/sdcard-rv.img,format=raw,if=none \
+	-drive id=disk0,file=test/sdcard-rv.img,format=raw,if=none \
 	-netdev user,id=mynet0 \
 	-rtc base=utc
 
@@ -122,6 +120,9 @@ $(BINARY_DIR)/eonix_kernel: $(KERNEL_DEPS)
 build/kernel.sym: $(BINARY_DIR)/eonix_kernel
 	cargo objcopy -q $(CARGO_FLAGS) -- --only-keep-debug build/kernel.sym
 
+build/fs-%.img: user-programs/init_script_%.sh script/build-img.sh $(USER_PROGRAMS)
+	ARCH=$* OUTPUT=$@ sh script/build-img.sh
+	
 build/mbr.bin: $(BINARY_DIR)/eonix_kernel
 	cargo objcopy -q $(CARGO_FLAGS) -- -O binary -j .mbr build/mbr.bin
 

+ 1 - 1
src/fs/ext4.rs

@@ -229,7 +229,7 @@ impl MountCreator for Ext4MountCreator {
     fn create_mount(&self, _source: &str, _flags: u64, mp: &Arc<Dentry>) -> KResult<Mount> {
         // TODO: temporarily the second disk, should generate from _source
         let (ext4fs, root_inode) = 
-            Ext4Fs::create(make_device(8, 16))?;
+            Ext4Fs::create(make_device(8, 0))?;
 
         Mount::new(mp, ext4fs, root_inode)
     }

+ 1 - 1
src/kernel/vfs/dentry.rs

@@ -103,7 +103,7 @@ impl Dentry {
         hasher.finish()
     }
 
-    fn find(self: &Arc<Self>, name: &[u8]) -> KResult<Arc<Self>> {
+    pub fn find(self: &Arc<Self>, name: &[u8]) -> KResult<Arc<Self>> {
         let data = self.data.load();
         let data = data.as_ref().ok_or(ENOENT)?;
 

+ 10 - 2
src/lib.rs

@@ -22,6 +22,7 @@ mod sync;
 
 use crate::kernel::task::alloc_pid;
 use alloc::{ffi::CString, sync::Arc};
+use eonix_log::println;
 use core::{
     hint::spin_loop,
     sync::atomic::{AtomicBool, Ordering},
@@ -146,7 +147,7 @@ async fn init_process(early_kstack: PRange) {
     fs::ext4::init();
 
     let load_info = {
-        // mount fat32 /mnt directory
+        // mount ext4 /mnt directory
         let fs_context = FsContext::global();
         let mnt_dir = Dentry::open(fs_context, Path::new(b"/mnt/").unwrap(), true).unwrap();
 
@@ -156,11 +157,18 @@ async fn init_process(early_kstack: PRange) {
             &mnt_dir,
             "/dev/sda",
             "/mnt",
-            "fat32",
+            "ext4",
             MS_RDONLY | MS_NOATIME | MS_NODEV | MS_NOSUID,
         )
         .unwrap();
 
+        println!("{:?}", mnt_dir.find(b"musl"));
+
+        let musl_dir = Dentry::open(fs_context, Path::new(b"/mnt/musl/").unwrap(), true).unwrap();
+        println!("{:?}", musl_dir.find(b"basic"));
+        let basic_dir = Dentry::open(fs_context, Path::new(b"/mnt/musl/basic/").unwrap(), true).unwrap();
+        println!("{:?}", basic_dir.find(b"run-all.sh"));
+
         let init_names = [
             &b"/sbin/init"[..],
             &b"/init"[..],