Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .cache/clangd/index/bio.c.34489AC9E3FB27B2.idx
Binary file not shown.
Binary file added .cache/clangd/index/buf.h.7DA89D0539A50AFB.idx
Binary file not shown.
Binary file not shown.
Binary file added .cache/clangd/index/defs.h.72A9C4FFB86E6400.idx
Binary file not shown.
Binary file added .cache/clangd/index/elf.h.B51ED6807EFE6571.idx
Binary file not shown.
Binary file added .cache/clangd/index/entry.S.7790893A73F2EC77.idx
Binary file not shown.
Binary file added .cache/clangd/index/exec.c.C583EF6E813AE52A.idx
Binary file not shown.
Binary file added .cache/clangd/index/fcntl.h.204FC1983BB1DFC2.idx
Binary file not shown.
Binary file added .cache/clangd/index/file.c.E75BF18666EA6C16.idx
Binary file not shown.
Binary file added .cache/clangd/index/file.h.2A63A83574D7D652.idx
Binary file not shown.
Binary file added .cache/clangd/index/fs.c.DE158A81433875BE.idx
Binary file not shown.
Binary file added .cache/clangd/index/fs.h.F83902F1C88C3791.idx
Binary file not shown.
Binary file added .cache/clangd/index/initcode.S.373AF54AA740F373.idx
Binary file not shown.
Binary file not shown.
Binary file added .cache/clangd/index/kernelvec.S.06F25524429F6CAE.idx
Binary file not shown.
Binary file added .cache/clangd/index/log.c.D81C51C68A1AD96E.idx
Binary file not shown.
Binary file added .cache/clangd/index/main.c.2DC262271CAFD048.idx
Binary file not shown.
Binary file added .cache/clangd/index/memlayout.h.0B2C565D58B84A48.idx
Binary file not shown.
Binary file added .cache/clangd/index/param.h.37451DCC2B36E012.idx
Binary file not shown.
Binary file added .cache/clangd/index/pipe.c.2473E067140E4F18.idx
Binary file not shown.
Binary file added .cache/clangd/index/plic.c.2EA8519EDD3A2B20.idx
Binary file not shown.
Binary file added .cache/clangd/index/printf.c.0918689B2930FAE2.idx
Binary file not shown.
Binary file added .cache/clangd/index/proc.c.5346DCDE506E9F58.idx
Binary file not shown.
Binary file added .cache/clangd/index/proc.h.27341B4843D3B8B6.idx
Binary file not shown.
Binary file added .cache/clangd/index/riscv.h.6737E35D6CB953E7.idx
Binary file not shown.
Binary file not shown.
Binary file added .cache/clangd/index/sleeplock.h.56E9B1C95DBCB92F.idx
Binary file not shown.
Binary file not shown.
Binary file added .cache/clangd/index/spinlock.h.7E8FC04641EE310E.idx
Binary file not shown.
Binary file added .cache/clangd/index/start.c.92F9EB51DC5F96B3.idx
Binary file not shown.
Binary file added .cache/clangd/index/stat.h.AEE4CE7ADDE89C85.idx
Binary file not shown.
Binary file added .cache/clangd/index/string.c.87F56374FD494C3A.idx
Binary file not shown.
Binary file added .cache/clangd/index/swtch.S.11DB57B07ECB88BC.idx
Binary file not shown.
Binary file not shown.
Binary file added .cache/clangd/index/syscall.h.66E962A052CADC6A.idx
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added .cache/clangd/index/trap.c.E331BC8CB04ABF35.idx
Binary file not shown.
Binary file added .cache/clangd/index/types.h.9C15A82D28EB699F.idx
Binary file not shown.
Binary file added .cache/clangd/index/uart.c.382E637B5067D2B7.idx
Binary file not shown.
Binary file added .cache/clangd/index/virtio.h.7AE2FDAEE3C87964.idx
Binary file not shown.
Binary file not shown.
Binary file added .cache/clangd/index/vm.c.70D05D5C0213F437.idx
Binary file not shown.
6 changes: 6 additions & 0 deletions .gdbinit.tmpl-riscv
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,9 @@ target remote 127.0.0.1:1234
symbol-file kernel/kernel
set disassemble-next-line auto
set riscv use-compressed-breakpoints yes

file user/_uthread
b uthread.c:95
layout src
c

9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,12 @@ mkfs
kernel/kernel
user/usys.S
.gdbinit
*.zip
xv6.out*
.vagrant/
submissions/
ph
barrier
/lab-*.json
.DS_Store
*.dSYM
227 changes: 211 additions & 16 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@

# To compile and run with a lab solution, set the lab name in conf/lab.mk
# (e.g., LAB=util). Run make grade to test solution with the lab's
# grade script (e.g., grade-lab-util).

-include conf/lab.mk

K=kernel
U=user

OBJS = \
$K/entry.o \
$K/start.o \
$K/console.o \
$K/printf.o \
$K/uart.o \
$K/kalloc.o \
$K/spinlock.o \
$K/string.o \
$K/main.o \
$K/vm.o \
Expand All @@ -30,6 +32,34 @@ OBJS = \
$K/plic.o \
$K/virtio_disk.o

OBJS_KCSAN = \
$K/start.o \
$K/console.o \
$K/printf.o \
$K/uart.o \
$K/spinlock.o

ifdef KCSAN
OBJS_KCSAN += \
$K/kcsan.o
endif

ifeq ($(LAB),$(filter $(LAB), lock))
OBJS += \
$K/stats.o\
$K/sprintf.o
endif


ifeq ($(LAB),net)
OBJS += \
$K/e1000.o \
$K/net.o \
$K/sysnet.o \
$K/pci.o
endif


# riscv64-unknown-elf- or riscv64-linux-gnu-
# perhaps in /opt/riscv/bin
#TOOLPREFIX =
Expand Down Expand Up @@ -57,12 +87,28 @@ OBJCOPY = $(TOOLPREFIX)objcopy
OBJDUMP = $(TOOLPREFIX)objdump

CFLAGS = -Wall -Werror -O -fno-omit-frame-pointer -ggdb -gdwarf-2

ifdef LAB
LABUPPER = $(shell echo $(LAB) | tr a-z A-Z)
XCFLAGS += -DSOL_$(LABUPPER) -DLAB_$(LABUPPER)
endif

CFLAGS += $(XCFLAGS)
CFLAGS += -MD
CFLAGS += -mcmodel=medany
CFLAGS += -ffreestanding -fno-common -nostdlib -mno-relax
CFLAGS += -I.
CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)

ifeq ($(LAB),net)
CFLAGS += -DNET_TESTS_PORT=$(SERVERPORT)
endif

ifdef KCSAN
CFLAGS += -DKCSAN
KCSANFLAG = -fsanitize=thread -fno-inline
endif

# Disable PIE when possible (for Ubuntu 16.10 toolchain)
ifneq ($(shell $(CC) -dumpspecs 2>/dev/null | grep -e '[^f]no-pie'),)
CFLAGS += -fno-pie -no-pie
Expand All @@ -73,11 +119,17 @@ endif

LDFLAGS = -z max-page-size=4096

$K/kernel: $(OBJS) $K/kernel.ld $U/initcode
$(LD) $(LDFLAGS) -T $K/kernel.ld -o $K/kernel $(OBJS)
$K/kernel: $(OBJS) $(OBJS_KCSAN) $K/kernel.ld $U/initcode
$(LD) $(LDFLAGS) -T $K/kernel.ld -o $K/kernel $(OBJS) $(OBJS_KCSAN)
$(OBJDUMP) -S $K/kernel > $K/kernel.asm
$(OBJDUMP) -t $K/kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $K/kernel.sym

$(OBJS): EXTRAFLAG := $(KCSANFLAG)

$K/%.o: $K/%.c
$(CC) $(CFLAGS) $(EXTRAFLAG) -c -o $@ $<


$U/initcode: $U/initcode.S
$(CC) $(CFLAGS) -march=rv64g -nostdinc -I. -Ikernel -c $U/initcode.S -o $U/initcode.o
$(LD) $(LDFLAGS) -N -e start -Ttext 0 -o $U/initcode.out $U/initcode.o
Expand All @@ -89,6 +141,10 @@ tags: $(OBJS) _init

ULIB = $U/ulib.o $U/usys.o $U/printf.o $U/umalloc.o

ifeq ($(LAB),$(filter $(LAB), lock))
ULIB += $U/statistics.o
endif

_%: %.o $(ULIB)
$(LD) $(LDFLAGS) -T $U/user.ld -o $@ $^
$(OBJDUMP) -S $@ > $*.asm
Expand All @@ -107,7 +163,7 @@ $U/_forktest: $U/forktest.o $(ULIB)
$(OBJDUMP) -S $U/_forktest > $U/forktest.asm

mkfs/mkfs: mkfs/mkfs.c $K/fs.h $K/param.h
gcc -Werror -Wall -I. -o mkfs/mkfs mkfs/mkfs.c
gcc $(XCFLAGS) -Werror -Wall -I. -o mkfs/mkfs mkfs/mkfs.c

# Prevent deletion of intermediate files, e.g. cat.o, after first build, so
# that disk image changes after first build are persistent until clean. More
Expand All @@ -133,18 +189,89 @@ UPROGS=\
$U/_wc\
$U/_zombie\

fs.img: mkfs/mkfs README $(UPROGS)
mkfs/mkfs fs.img README $(UPROGS)



ifeq ($(LAB),$(filter $(LAB), lock))
UPROGS += \
$U/_stats
endif

ifeq ($(LAB),traps)
UPROGS += \
$U/_call\
$U/_bttest
endif

ifeq ($(LAB),lazy)
UPROGS += \
$U/_lazytests
endif

ifeq ($(LAB),cow)
UPROGS += \
$U/_cowtest
endif

ifeq ($(LAB),thread)
UPROGS += \
$U/_uthread

$U/uthread_switch.o : $U/uthread_switch.S
$(CC) $(CFLAGS) -c -o $U/uthread_switch.o $U/uthread_switch.S

$U/_uthread: $U/uthread.o $U/uthread_switch.o $(ULIB)
$(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $U/_uthread $U/uthread.o $U/uthread_switch.o $(ULIB)
$(OBJDUMP) -S $U/_uthread > $U/uthread.asm

ph: notxv6/ph.c
gcc -o ph -g -O2 $(XCFLAGS) notxv6/ph.c -pthread

barrier: notxv6/barrier.c
gcc -o barrier -g -O2 $(XCFLAGS) notxv6/barrier.c -pthread
endif

ifeq ($(LAB),pgtbl)
UPROGS += \
$U/_pgtbltest
endif

ifeq ($(LAB),lock)
UPROGS += \
$U/_kalloctest\
$U/_bcachetest
endif

ifeq ($(LAB),fs)
UPROGS += \
$U/_bigfile
endif



ifeq ($(LAB),net)
UPROGS += \
$U/_nettests
endif

UEXTRA=
ifeq ($(LAB),util)
UEXTRA += user/xargstest.sh
endif


fs.img: mkfs/mkfs README $(UEXTRA) $(UPROGS)
mkfs/mkfs fs.img README $(UEXTRA) $(UPROGS)

-include kernel/*.d user/*.d

clean:
rm -f *.tex *.dvi *.idx *.aux *.log *.ind *.ilg \
clean:
rm -rf *.tex *.dvi *.idx *.aux *.log *.ind *.ilg *.dSYM *.zip \
*/*.o */*.d */*.asm */*.sym \
$U/initcode $U/initcode.out $K/kernel fs.img \
mkfs/mkfs .gdbinit \
$U/usys.S \
$(UPROGS)
$U/initcode $U/initcode.out $U/usys.S $U/_* \
$K/kernel \
mkfs/mkfs fs.img .gdbinit __pycache__ xv6.out* \
ph barrier

# try to generate a unique GDB port
GDBPORT = $(shell expr `id -u` % 5000 + 25000)
Expand All @@ -155,12 +282,22 @@ QEMUGDB = $(shell if $(QEMU) -help | grep -q '^-gdb'; \
ifndef CPUS
CPUS := 3
endif
ifeq ($(LAB),fs)
CPUS := 1
endif

FWDPORT = $(shell expr `id -u` % 5000 + 25999)

QEMUOPTS = -machine virt -bios none -kernel $K/kernel -m 128M -smp $(CPUS) -nographic
QEMUOPTS += -global virtio-mmio.force-legacy=false
QEMUOPTS += -drive file=fs.img,if=none,format=raw,id=x0
QEMUOPTS += -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0

ifeq ($(LAB),net)
QEMUOPTS += -netdev user,id=net0,hostfwd=udp::$(FWDPORT)-:2000 -object filter-dump,id=net0,netdev=net0,file=packets.pcap
QEMUOPTS += -device e1000,netdev=net0,bus=pcie.0
endif

qemu: $K/kernel fs.img
$(QEMU) $(QEMUOPTS)

Expand All @@ -171,3 +308,61 @@ qemu-gdb: $K/kernel .gdbinit fs.img
@echo "*** Now run 'gdb' in another window." 1>&2
$(QEMU) $(QEMUOPTS) -S $(QEMUGDB)

ifeq ($(LAB),net)
# try to generate a unique port for the echo server
SERVERPORT = $(shell expr `id -u` % 5000 + 25099)

server:
python3 server.py $(SERVERPORT)

ping:
python3 ping.py $(FWDPORT)
endif

##
## FOR testing lab grading script
##

ifneq ($(V),@)
GRADEFLAGS += -v
endif

print-gdbport:
@echo $(GDBPORT)

grade:
@echo $(MAKE) clean
@$(MAKE) clean || \
(echo "'make clean' failed. HINT: Do you have another running instance of xv6?" && exit 1)
./grade-lab-$(LAB) $(GRADEFLAGS)

##
## FOR submissions
##

submit-check:
@if ! test -d .git; then \
echo No .git directory, is this a git repository?; \
false; \
fi
@if test "$$(git symbolic-ref HEAD)" != refs/heads/$(LAB); then \
git branch; \
read -p "You are not on the $(LAB) branch. Hand-in the current branch? [y/N] " r; \
test "$$r" = y; \
fi
@if ! git diff-files --quiet || ! git diff-index --quiet --cached HEAD; then \
git status -s; \
echo; \
echo "You have uncomitted changes. Please commit or stash them."; \
false; \
fi
@if test -n "`git status -s`"; then \
git status -s; \
read -p "Untracked files will not be handed in. Continue? [y/N] " r; \
test "$$r" = y; \
fi

zipball: clean submit-check
git archive --verbose --format zip --output lab.zip HEAD

.PHONY: zipball clean grade submit-check
2 changes: 2 additions & 0 deletions answers-thread.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
I think the reason is :with parallel programming,two threads may try to operate on one object without using lock,and
the result is the latter thread will overwrite the former thread's operation.
Loading