Fix: use 1 based instead of 0 based fileid

This commit is contained in:
2026-04-06 21:47:10 +08:00
parent 69f2502823
commit a71e244a60
6 changed files with 28 additions and 19 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
**.o **.o
REQUIREMENTS.md

View File

@@ -8,6 +8,7 @@ RUN dpkg --add-architecture i386 && \
zlib1g:i386 libncurses5:i386 \ zlib1g:i386 libncurses5:i386 \
libgcc1:i386 libstdc++5:i386 libgcc1:i386 libstdc++5:i386
WORKDIR / WORKDIR /
COPY mips-decstation.linux-xgcc.gz / COPY mips-decstation.linux-xgcc.gz /
RUN tar -zxvf /mips-decstation.linux-xgcc.gz RUN tar -zxvf /mips-decstation.linux-xgcc.gz

View File

@@ -1,5 +1,12 @@
.PHONY: all clean docker .PHONY: all clean docker
docker: docker: docker-build docker-run
docker-build:
docker build . -t afs2026 docker build . -t afs2026
docker-run:
docker run afs2026 -C code docker run afs2026 -C code
docker-shell:
docker run -it --rm --entrypoint sh afs2026

View File

@@ -1,13 +1,11 @@
.PHONY: all clean run .PHONY: all clean
all: all:
make -C build.linux depend make -C build.linux depend
make -C build.linux -j 16 make -C build.linux -j 16
make -C test -j 16 make -C test -j 16
make -C test run
clean: clean:
make -C build.linux distclean make -C build.linux distclean
make -C test distclean make -C test distclean
run:
make -C test run

View File

@@ -20,14 +20,15 @@ hosttype = unknown
# !!! ADD PATH TO CPP and CROSS COMPILER # !!! ADD PATH TO CPP and CROSS COMPILER
ifeq ($(osname),Linux) 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 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- GCCDIR = ../../usr/local/nachos/bin/decstation-ultrix-
LDFLAGS = -T script -N LDFLAGS = -T script -N
ASFLAGS = -mips2 ASFLAGS = -mips2
CPPFLAGS = $(INCDIR) CPPFLAGS = $(INCDIR)
COFF2NOFF = ../../coff2noff/coff2noff.x86Linux COFF2NOFF = ../../coff2noff/coff2noff.x86Linux
NACHOS = ../build.linux/nachos
hosttype = x86Linux hosttype = x86Linux
endif endif

View File

@@ -41,36 +41,37 @@ void SysPrintInt(int value) {
} }
OpenFileId SysOpen(char *name) { OpenFileId SysOpen(char *name) {
OpenFileId id = -1;
for (int i = 0; i < 20; i++) for (int i = 0; i < 20; i++)
if (kernel->fileSystem->fileDescriptorTable[i] == NULL) { if (kernel->fileSystem->fileDescriptorTable[i] == NULL) {
id = i; kernel->fileSystem->fileDescriptorTable[i]
kernel->fileSystem->fileDescriptorTable[i]
= kernel->fileSystem->Open(name); = kernel->fileSystem->Open(name);
if (kernel->fileSystem->fileDescriptorTable[i] == NULL) if (kernel->fileSystem->fileDescriptorTable[i] == NULL)
return -1; return -1;
break; return i + 1; // OpenFileId starts from 1
} }
return id; return -1;
} }
int SysWrite(char *buffer, int size, OpenFileId id) { 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 -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) { 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 -1;
return kernel->fileSystem->fileDescriptorTable[id]->Read(buffer, size); return kernel->fileSystem->fileDescriptorTable[idx]->Read(buffer, size);
} }
int SysClose(OpenFileId id) { 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; return 0;
delete kernel->fileSystem->fileDescriptorTable[id]; delete kernel->fileSystem->fileDescriptorTable[idx];
kernel->fileSystem->fileDescriptorTable[id] = NULL; kernel->fileSystem->fileDescriptorTable[idx] = NULL;
return 1; return 1;
} }