# # Makefile fragment for JOS kernel. # This is NOT a complete makefile; # you must run GNU make in the top-level directory # where the GNUmakefile is located. # OBJDIRS += kern KERN_LDFLAGS := $(LDFLAGS) -T kern/kernel.ld -nostdlib # entry.S must be first, so that it's the first code in the text segment!!! # # We also snatch the use of a couple handy source files # from the lib directory, to avoid gratuitous code duplication. KERN_SRCFILES := kern/entry.S \ kern/entrypgdir.c \ kern/init.c \ kern/console.c \ kern/monitor.c \ kern/pmap.c \ kern/env.c \ kern/kclock.c \ kern/picirq.c \ kern/printf.c \ kern/trap.c \ kern/trapentry.S \ kern/sched.c \ kern/syscall.c \ kern/kdebug.c \ lib/printfmt.c \ lib/readline.c \ lib/string.c # Source files for LAB4 KERN_SRCFILES += kern/mpentry.S \ kern/mpconfig.c \ kern/lapic.c \ kern/spinlock.c # Only build files if they exist. KERN_SRCFILES := $(wildcard $(KERN_SRCFILES)) # Binary program images to embed within the kernel. # Binary files for LAB3 KERN_BINFILES := user/hello \ user/buggyhello \ user/buggyhello2 \ user/evilhello \ user/testbss \ user/divzero \ user/breakpoint \ user/softint \ user/badsegment \ user/faultread \ user/faultreadkernel \ user/faultwrite \ user/faultwritekernel # Binary files for LAB4 KERN_BINFILES += user/idle \ user/yield \ user/dumbfork \ user/stresssched \ user/faultdie \ user/faultregs \ user/faultalloc \ user/faultallocbad \ user/faultnostack \ user/faultbadhandler \ user/faultevilhandler \ user/forktree \ user/sendpage \ user/spin \ user/fairness \ user/pingpong \ user/pingpongs \ user/primes # Binary files for LAB5 KERN_BINFILES += user/faultio\ user/spawnfaultio\ user/testfile \ user/spawnhello \ user/icode \ fs/fs # Binary files for LAB5 KERN_BINFILES += user/testpteshare \ user/testfdsharing \ user/testpipe \ user/testpiperace \ user/testpiperace2 \ user/primespipe \ user/testkbd \ user/testshell KERN_OBJFILES := $(patsubst %.c, $(OBJDIR)/%.o, $(KERN_SRCFILES)) KERN_OBJFILES := $(patsubst %.S, $(OBJDIR)/%.o, $(KERN_OBJFILES)) KERN_OBJFILES := $(patsubst $(OBJDIR)/lib/%, $(OBJDIR)/kern/%, $(KERN_OBJFILES)) KERN_BINFILES := $(patsubst %, $(OBJDIR)/%, $(KERN_BINFILES)) # How to build kernel object files $(OBJDIR)/kern/%.o: kern/%.c $(OBJDIR)/.vars.KERN_CFLAGS @echo + cc $< @mkdir -p $(@D) $(V)$(CC) -nostdinc $(KERN_CFLAGS) -c -o $@ $< $(OBJDIR)/kern/%.o: kern/%.S $(OBJDIR)/.vars.KERN_CFLAGS @echo + as $< @mkdir -p $(@D) $(V)$(CC) -nostdinc $(KERN_CFLAGS) -c -o $@ $< $(OBJDIR)/kern/%.o: lib/%.c $(OBJDIR)/.vars.KERN_CFLAGS @echo + cc $< @mkdir -p $(@D) $(V)$(CC) -nostdinc $(KERN_CFLAGS) -c -o $@ $< # Special flags for kern/init $(OBJDIR)/kern/init.o: override KERN_CFLAGS+=$(INIT_CFLAGS) $(OBJDIR)/kern/init.o: $(OBJDIR)/.vars.INIT_CFLAGS # How to build the kernel itself $(OBJDIR)/kern/kernel: $(KERN_OBJFILES) $(KERN_BINFILES) kern/kernel.ld \ $(OBJDIR)/.vars.KERN_LDFLAGS @echo + ld $@ $(V)$(LD) -o $@ $(KERN_LDFLAGS) $(KERN_OBJFILES) $(GCC_LIB) -b binary $(KERN_BINFILES) $(V)$(OBJDUMP) -S $@ > $@.asm $(V)$(NM) -n $@ > $@.sym # How to build the kernel disk image $(OBJDIR)/kern/kernel.img: $(OBJDIR)/kern/kernel $(OBJDIR)/boot/boot @echo + mk $@ $(V)dd if=/dev/zero of=$(OBJDIR)/kern/kernel.img~ count=10000 2>/dev/null $(V)dd if=$(OBJDIR)/boot/boot of=$(OBJDIR)/kern/kernel.img~ conv=notrunc 2>/dev/null $(V)dd if=$(OBJDIR)/kern/kernel of=$(OBJDIR)/kern/kernel.img~ seek=1 conv=notrunc 2>/dev/null $(V)mv $(OBJDIR)/kern/kernel.img~ $(OBJDIR)/kern/kernel.img all: $(OBJDIR)/kern/kernel.img grub: $(OBJDIR)/jos-grub $(OBJDIR)/jos-grub: $(OBJDIR)/kern/kernel @echo + oc $@ $(V)$(OBJCOPY) --adjust-vma=0x10000000 $^ $@