Explorar el Código

fix(fs): fix ext4 fs, now x86_64 can read test image normally

Heinz hace 7 meses
padre
commit
de242d19af

+ 4 - 5
Makefile.src

@@ -49,14 +49,14 @@ QEMU_ARGS += \
 	-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=build/fs-riscv64.img,format=raw,if=none \
+	-drive id=disk1,file=test/sdcard-rv.img,format=raw,if=none \
 	-netdev user,id=mynet0 \
 	-rtc base=utc
 
 CARGO_FLAGS += --target riscv64gc-unknown-none-elf
 
 .PHONY: build
-build: $(BINARY_DIR)/eonix_kernel build/boot-riscv64.img build/fs-riscv64.img
+build: $(BINARY_DIR)/eonix_kernel build/boot-riscv64.img
 
 else ifeq ($(ARCH),x86_64)
 
@@ -66,8 +66,10 @@ BINARY_DIR := $(BINARY_DIR_BASE)/$(MODE)
 QEMU_ARGS += \
 	-machine q35 \
 	-device ahci,id=ahci -device ide-hd,drive=disk,bus=ahci.0 \
+	-device ide-hd,drive=disk1,bus=ahci.1 \
 	-device e1000e,netdev=mynet0 \
 	-drive id=disk,file=build/boot-x86_64.img,format=raw,if=none \
+	-drive id=disk1,file=test/sdcard-rv.img,format=raw,if=none \
 	-netdev user,id=mynet0
 
 CARGO_FLAGS += --target x86_64-unknown-none.json
@@ -120,9 +122,6 @@ $(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
 

+ 10 - 12
src/fs/ext4.rs

@@ -20,28 +20,26 @@ use crate::{
 
 pub struct Ext4BlockDevice {
     device: Arc<BlockDevice>,
-    block_size: u64,
 }
 
 impl Ext4BlockDevice {
-    pub fn new(device: Arc<BlockDevice>, block_size: u64) -> Self {
+    pub fn new(device: Arc<BlockDevice>) -> Self {
         Self {
             device,
-            block_size,
         }
     }
 }
 
 impl Ext4BlockDeviceTrait for Ext4BlockDevice {
     fn read_offset(&self, offset: usize) -> Vec<u8> {
-        let mut buffer = vec![0u8; self.block_size as usize];
+        let mut buffer = vec![0u8; 4096];
         let mut byte_buffer = ByteBuffer::new(buffer.as_mut_slice());
         match self.device.read_some(offset, &mut byte_buffer) {
             Ok(fill_result) => {
                 buffer
             }
             Err(_) => {
-                vec![0u8; self.block_size as usize]
+                vec![0u8; 4096]
             }
         }
     }
@@ -92,8 +90,7 @@ impl Ext4Fs {
 impl Ext4Fs {
     pub fn create(device: DevId) -> KResult<(Arc<Self>, Arc<dyn Inode>)>  {
         let device = BlockDevice::get(device)?;
-        let device_size = device.size();
-        let ext4_device = Ext4BlockDevice::new(device.clone(), device_size);
+        let ext4_device = Ext4BlockDevice::new(device.clone());
         let ext4 = Ext4::open(Arc::new(ext4_device));
         let mut ext4fs = Arc::new_cyclic(|weak: &Weak<Ext4Fs>| Self {
             inner: ext4,
@@ -101,7 +98,6 @@ impl Ext4Fs {
             icache: BTreeMap::new(),
             weak: weak.clone(),
         });
-        
         let root_inode_ref = ext4fs.inner.get_inode_ref(2);
         let root_inode = DirInode::new(root_inode_ref.inode_num as Ino, ext4fs.weak.clone(), root_inode_ref.inode.size() as u32);
         Ok((ext4fs, root_inode))
@@ -203,7 +199,7 @@ impl Inode for DirInode {
 
         let entries = ext4fs.inner.fuse_readdir(self.ino as u64, 0, offset as i64)
             .map_err(|_| EIO)?;
-        let mut nread = 0usize;
+        let mut current_offset = 0;
 
         for entry in entries {
             let name_len = entry.name_len as usize;
@@ -221,9 +217,9 @@ impl Inode for DirInode {
                 break;
             }
 
-            nread += entry.entry_len as usize;
+            current_offset += 1;
         }
-        Ok(nread)
+        Ok(current_offset)
     }
 }
 
@@ -231,7 +227,9 @@ struct Ext4MountCreator;
 
 impl MountCreator for Ext4MountCreator {
     fn create_mount(&self, _source: &str, _flags: u64, mp: &Arc<Dentry>) -> KResult<Mount> {
-        let (ext4fs, root_inode) = Ext4Fs::create(make_device(8, 1))?;
+        // TODO: temporarily the second disk, should generate from _source
+        let (ext4fs, root_inode) = 
+            Ext4Fs::create(make_device(8, 16))?;
 
         Mount::new(mp, ext4fs, root_inode)
     }

+ 0 - 4
src/kernel/block.rs

@@ -281,10 +281,6 @@ impl BlockDevice {
             Ok(FillResult::Partial(nfilled))
         }
     }
-
-    pub fn size(&self) -> u64 {
-        self.size
-    }
 }
 
 pub struct BlockDeviceRequest<'lt> {

+ 6 - 0
user-programs/init_script_riscv64.sh

@@ -25,6 +25,7 @@ do_or_freeze $BUSYBOX mknod -m 666 /dev/null c 1 3
 do_or_freeze $BUSYBOX mknod -m 666 /dev/zero c 1 5
 do_or_freeze $BUSYBOX mknod -m 666 /dev/sda b 8 0
 do_or_freeze $BUSYBOX mknod -m 666 /dev/sda1 b 8 1
+do_or_freeze $BUSYBOX mknod -m 666 /dev/sdb b 8 16
 do_or_freeze $BUSYBOX mknod -m 666 /dev/ttyS0 c 4 64
 do_or_freeze $BUSYBOX mknod -m 666 /dev/ttyS1 c 4 65
 
@@ -41,6 +42,11 @@ echo ok >&2
 do_or_freeze mkdir -p /etc /root /proc
 do_or_freeze mount -t procfs proc proc
 
+echo -n -e "Mounting the ext4 image... " >&2
+do_or_freeze mkdir -p /mnt1
+do_or_freeze mount -t ext4 /dev/sdb /mnt1
+echo ok >&2
+
 cp /mnt/ld-musl-i386.so.1 /lib/ld-musl-i386.so.1
 ln -s /lib/ld-musl-i386.so.1 /lib/libc.so
 

+ 6 - 0
user-programs/init_script_x86_64.sh

@@ -25,6 +25,7 @@ do_or_freeze $BUSYBOX mknod -m 666 /dev/null c 1 3
 do_or_freeze $BUSYBOX mknod -m 666 /dev/zero c 1 5
 do_or_freeze $BUSYBOX mknod -m 666 /dev/sda b 8 0
 do_or_freeze $BUSYBOX mknod -m 666 /dev/sda1 b 8 1
+do_or_freeze $BUSYBOX mknod -m 666 /dev/sdb b 8 16
 do_or_freeze $BUSYBOX mknod -m 666 /dev/ttyS0 c 4 64
 do_or_freeze $BUSYBOX mknod -m 666 /dev/ttyS1 c 4 65
 
@@ -41,6 +42,11 @@ echo ok >&2
 do_or_freeze mkdir -p /etc /root /proc
 do_or_freeze mount -t procfs proc proc
 
+echo -n -e "Mounting the ext4 image... " >&2
+do_or_freeze mkdir -p /mnt1
+do_or_freeze mount -t ext4 /dev/sdb /mnt1
+echo ok >&2
+
 cp /mnt/ld-musl-i386.so.1 /lib/ld-musl-i386.so.1
 ln -s /lib/ld-musl-i386.so.1 /lib/libc.so