From a71e244a60313206139ce894775c192f4335b3a6 Mon Sep 17 00:00:00 2001 From: Yi-Ting Shih Date: Mon, 6 Apr 2026 21:47:10 +0800 Subject: [PATCH] Fix: use 1 based instead of 0 based fileid --- .gitignore | 1 + Dockerfile | 1 + Makefile | 9 ++++++++- code/Makefile | 6 ++---- code/test/Makefile.dep | 5 +++-- code/userprog/ksyscall.h | 25 +++++++++++++------------ 6 files changed, 28 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index c21152d..4ee5081 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ **.o +REQUIREMENTS.md diff --git a/Dockerfile b/Dockerfile index fac23c9..2667e0f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,7 @@ RUN dpkg --add-architecture i386 && \ zlib1g:i386 libncurses5:i386 \ libgcc1:i386 libstdc++5:i386 + WORKDIR / COPY mips-decstation.linux-xgcc.gz / RUN tar -zxvf /mips-decstation.linux-xgcc.gz diff --git a/Makefile b/Makefile index f2326dc..7f793b9 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,12 @@ .PHONY: all clean docker -docker: +docker: docker-build docker-run + +docker-build: docker build . -t afs2026 + +docker-run: docker run afs2026 -C code + +docker-shell: + docker run -it --rm --entrypoint sh afs2026 diff --git a/code/Makefile b/code/Makefile index c04f980..953fda5 100644 --- a/code/Makefile +++ b/code/Makefile @@ -1,13 +1,11 @@ -.PHONY: all clean run +.PHONY: all clean all: make -C build.linux depend make -C build.linux -j 16 make -C test -j 16 + make -C test run clean: make -C build.linux distclean make -C test distclean - -run: - make -C test run diff --git a/code/test/Makefile.dep b/code/test/Makefile.dep index 0330b6d..e2321bd 100755 --- a/code/test/Makefile.dep +++ b/code/test/Makefile.dep @@ -20,14 +20,15 @@ hosttype = unknown # !!! ADD PATH TO CPP and CROSS COMPILER ifeq ($(osname),Linux) -# full path name of your cpp program i.e.: +# full path name of your cpp program i.e.: CPP = ../../usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/cpp -# directory in which your gcc cross-compiler lives i.e.: +# directory in which your gcc cross-compiler lives i.e.: GCCDIR = ../../usr/local/nachos/bin/decstation-ultrix- LDFLAGS = -T script -N ASFLAGS = -mips2 CPPFLAGS = $(INCDIR) COFF2NOFF = ../../coff2noff/coff2noff.x86Linux +NACHOS = ../build.linux/nachos hosttype = x86Linux endif diff --git a/code/userprog/ksyscall.h b/code/userprog/ksyscall.h index 6b315f7..59408b3 100755 --- a/code/userprog/ksyscall.h +++ b/code/userprog/ksyscall.h @@ -41,36 +41,37 @@ void SysPrintInt(int value) { } OpenFileId SysOpen(char *name) { - OpenFileId id = -1; for (int i = 0; i < 20; i++) if (kernel->fileSystem->fileDescriptorTable[i] == NULL) { - id = i; - kernel->fileSystem->fileDescriptorTable[i] + kernel->fileSystem->fileDescriptorTable[i] = kernel->fileSystem->Open(name); if (kernel->fileSystem->fileDescriptorTable[i] == NULL) return -1; - break; + return i + 1; // OpenFileId starts from 1 } - return id; + return -1; } int SysWrite(char *buffer, int size, OpenFileId id) { - if (id < 0 || id >= 20 || kernel->fileSystem->fileDescriptorTable[id] == NULL) + int idx = id - 1; // Convert 1-based id to 0-based index + if (idx < 0 || idx >= 20 || kernel->fileSystem->fileDescriptorTable[idx] == NULL) return -1; - return kernel->fileSystem->fileDescriptorTable[id]->Write(buffer, size); + return kernel->fileSystem->fileDescriptorTable[idx]->Write(buffer, size); } int SysRead(char *buffer, int size, OpenFileId id) { - if (id < 0 || id >= 20 || kernel->fileSystem->fileDescriptorTable[id] == NULL) + int idx = id - 1; // Convert 1-based id to 0-based index + if (idx < 0 || idx >= 20 || kernel->fileSystem->fileDescriptorTable[idx] == NULL) return -1; - return kernel->fileSystem->fileDescriptorTable[id]->Read(buffer, size); + return kernel->fileSystem->fileDescriptorTable[idx]->Read(buffer, size); } int SysClose(OpenFileId id) { - if (id < 0 || id >= 20 || kernel->fileSystem->fileDescriptorTable[id] == NULL) + int idx = id - 1; // Convert 1-based id to 0-based index + if (idx < 0 || idx >= 20 || kernel->fileSystem->fileDescriptorTable[idx] == NULL) return 0; - delete kernel->fileSystem->fileDescriptorTable[id]; - kernel->fileSystem->fileDescriptorTable[id] = NULL; + delete kernel->fileSystem->fileDescriptorTable[idx]; + kernel->fileSystem->fileDescriptorTable[idx] = NULL; return 1; }