jos-style Makefrags and directories

上级 451f323d
#
# XXX compiling user progs with -mcmodel=kernel
#
# Custom config file? Otherwise use defaults. # Custom config file? Otherwise use defaults.
-include config.mk -include config.mk
Q ?= @ Q ?= @
...@@ -30,159 +26,47 @@ NM = $(TOOLPREFIX)nm ...@@ -30,159 +26,47 @@ NM = $(TOOLPREFIX)nm
OBJCOPY = $(TOOLPREFIX)objcopy OBJCOPY = $(TOOLPREFIX)objcopy
STRIP = $(TOOLPREFIX)strip STRIP = $(TOOLPREFIX)strip
# XXX(sbw)
# -nostdinc -nostdinc++
COMFLAGS = -static -fno-builtin -fno-strict-aliasing -O2 -Wall \ COMFLAGS = -static -fno-builtin -fno-strict-aliasing -O2 -Wall \
-g -MD -m64 -Werror -fms-extensions -mno-sse \ -g -MD -m64 -Werror -fms-extensions -mno-sse \
-mcmodel=large -mno-red-zone -I$(QEMUSRC) -fno-omit-frame-pointer \ -mno-red-zone -Iinclude -I$(QEMUSRC) -fno-omit-frame-pointer \
-DHW_$(HW) -include param.h -include compiler.h -DXV6 -DHW_$(HW) -include param.h -include include/compiler.h -DXV6
COMFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) COMFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)
CFLAGS := $(COMFLAGS) -std=c99 $(CFLAGS) CFLAGS := $(COMFLAGS) -std=c99 $(CFLAGS)
CXXFLAGS := $(COMFLAGS) -std=c++0x -Wno-sign-compare -fno-exceptions -fno-rtti $(CXXFLAGS) CXXFLAGS := $(COMFLAGS) -std=c++0x -Wno-sign-compare -fno-exceptions -fno-rtti $(CXXFLAGS)
ASFLAGS = -m64 -gdwarf-2 -MD ASFLAGS = -Iinclude -m64 -gdwarf-2 -MD
LDFLAGS = -m elf_x86_64 LDFLAGS = -m elf_x86_64
OBJS = \ all:
async.o \
bio.o \ include net/Makefrag
bootdata.o \ include lib/Makefrag
cga.o \ include bin/Makefrag
cilk.o \ include kernel/Makefrag
condvar.o \ include tools/Makefrag
console.o \
cpprt.o \
crange.o \
e1000.o \
exec.o \
file.o \
fmt.o \
fs.o \
ioapic.o \
lapic.o \
hwvm.o \
hz.o \
kalloc.o \
kmalloc.o \
kbd.o \
main.o \
memide.o \
mp.o \
net.o \
pci.o \
picirq.o \
pipe.o \
proc.o \
prof.o \
gc.o \
rnd.o \
sampler.o \
sched.o \
spinlock.o \
swtch.o \
string.o \
syscall.o \
sysfile.o \
sysproc.o \
uart.o \
vm.o \
trap.o \
trapasm.o \
wq.o \
incbin.o
OBJS := $(addprefix $(O)/, $(OBJS))
ULIB = ulib.o usys.o printf.o umalloc.o uthread.o fmt.o
ULIB := $(addprefix $(O)/, $(ULIB))
UPROGS= \
_cat \
_echo \
_init \
_forkexectree \
_forkexecbench \
_forktree \
_login \
_ls \
_mapbench \
_maptest \
_sh \
_thrtest \
_halt \
_time \
_sleep \
_dirbench \
_usertests \
_lockstat \
_preadtest \
_perf
UPROGS := $(addprefix $(O)/, $(UPROGS))
all: $(O)/kernel
include net.mk
$(O)/kernel: $(O) $(O)/boot.o $(OBJS)
@echo " LD $@"
$(Q)$(LD) $(LDFLAGS) -T kernel.ld -z max-page-size=4096 -e start \
-o $@ $(O)/boot.o $(OBJS)
$(O):
$(Q)mkdir $(O)
$(Q)mkdir $(O)/net
$(O)/%.o: %.c $(O)/%.o: %.c
@echo " CC $@" @echo " CC $@"
$(Q)mkdir -p $(@D)
$(Q)$(CC) $(CFLAGS) -c -o $@ $< $(Q)$(CC) $(CFLAGS) -c -o $@ $<
$(O)/%.o: %.cc $(O)/%.o: %.cc
@echo " CXX $@" @echo " CXX $@"
$(Q)$(CXX) $(CXXFLAGS) -c -o $@ $< $(Q)mkdir -p $(@D)
$(Q)$(CXX) $(CXXFLAGS) $(XXFLAGS) -c -o $@ $<
$(O)/incbin.o: ASFLAGS+=-DMAKE_OUT=$(O)
$(O)/incbin.o: $(O)/initcode $(O)/bootother $(O)/fs.img
$(O)/%.o: %.S
@echo " CC $@"
$(Q)$(CC) $(ASFLAGS) -c -o $@ $<
$(O)/initcode: TTEXT = 0x0
$(O)/bootother: TTEXT = 0x7000
$(O)/%: %.S
@echo " CC $@"
$(Q)$(CC) $(CFLAGS) -nostdinc -I. -c $< -o $@.o
$(Q)$(LD) $(LDFLAGS) -N -e start -Ttext $(TTEXT) -o $@.out $@.o
$(Q)$(OBJCOPY) -S -O binary $@.out $@
xv6memfs.img: bootblock kernelmemfs xv6memfs.img: bootblock kernelmemfs
dd if=/dev/zero of=xv6memfs.img count=10000 dd if=/dev/zero of=xv6memfs.img count=10000
dd if=bootblock of=xv6memfs.img conv=notrunc dd if=bootblock of=xv6memfs.img conv=notrunc
dd if=kernelmemfs of=xv6memfs.img seek=1 conv=notrunc dd if=kernelmemfs of=xv6memfs.img seek=1 conv=notrunc
$(O)/_%.unstripped: $(O)/%.o $(ULIB) $(O)/fs.img: $(O)/tools/mkfs README $(UPROGS)
@echo " LD $@"
$(Q)$(LD) $(LDFLAGS) -N -e main -Ttext 0x100000 -o $@ $^
$(O)/_%: $(O)/_%.unstripped
@echo " STRIP $@"
$(Q)$(STRIP) -o $@ $<
$(O)/mkfs: mkfs.c fs.h
gcc -m32 -Werror -Wall -o $@ mkfs.c
$(O)/perf-report: perf-report.cc sampler.h
$(CXX) -std=c++0x -m64 -Werror -Wall -o $@ perf-report.cc
$(O)/fs.img: $(O)/mkfs README $(UPROGS)
@echo " MKFS $@" @echo " MKFS $@"
$(Q)$(O)/mkfs $@ README $(UPROGS) $(Q)$(O)/tools/mkfs $@ README $(UPROGS)
mscan.syms: $(O)/kernel
$(NM) -S $< > $@
mscan.kern: $(O)/kernel
cp $< $@
-include *.d .PRECIOUS: $(O)/%.o
-include $(O)/*.d
.PRECIOUS: $(O)/%.o $(O)/_%.unstripped
.PHONY: clean qemu gdb rsync .PHONY: clean qemu gdb rsync
## ##
...@@ -192,14 +76,20 @@ QEMUOPTS = -smp $(QEMUSMP) -m 512 -serial mon:stdio -nographic \ ...@@ -192,14 +76,20 @@ QEMUOPTS = -smp $(QEMUSMP) -m 512 -serial mon:stdio -nographic \
-net user -net nic,model=e1000 \ -net user -net nic,model=e1000 \
-redir tcp:2323::23 -redir tcp:8080::80 -redir tcp:2323::23 -redir tcp:8080::80
qemu: $(O)/kernel qemu: $(KERN)
$(QEMU) $(QEMUOPTS) -kernel $(O)/kernel $(QEMU) $(QEMUOPTS) -kernel $(KERN)
gdb: $(O)/kernel gdb: $(KERN)
$(QEMU) $(QEMUOPTS) -kernel $(O)/kernel -S -s $(QEMU) $(QEMUOPTS) -kernel $(KERN) -S -s
## ##
## mtrace ## mtrace
## ##
mscan.syms: $(KERN)
$(NM) -S $< > $@
mscan.kern: $(KERN)
cp $< $@
MTRACEOPTS = -rtc clock=vm -mtrace-enable -mtrace-file mtrace.out \ MTRACEOPTS = -rtc clock=vm -mtrace-enable -mtrace-file mtrace.out \
-mtrace-quantum 100 -mtrace-quantum 100
mtrace.out: mscan.kern mscan.syms mtrace.out: mscan.kern mscan.syms
...@@ -212,8 +102,8 @@ mscan.out: $(QEMUSRC)/mtrace-tools/mscan mtrace.out ...@@ -212,8 +102,8 @@ mscan.out: $(QEMUSRC)/mtrace-tools/mscan mtrace.out
mscan.sorted: mscan.out $(QEMUSRC)/mtrace-tools/sersec-sort mscan.sorted: mscan.out $(QEMUSRC)/mtrace-tools/sersec-sort
$(QEMUSRC)/mtrace-tools/sersec-sort < $< > $@ $(QEMUSRC)/mtrace-tools/sersec-sort < $< > $@
rsync: $(O)/kernel rsync: $(KERN)
rsync -avP $(O)/kernel amsterdam.csail.mit.edu:/tftpboot/$(HW)/kernel.xv6 rsync -avP $(KERN) amsterdam.csail.mit.edu:/tftpboot/$(HW)/kernel.xv6
clean: clean:
rm -fr $(O) rm -fr $(O)
UPROGS= \
cat \
echo \
init \
forkexectree \
forkexecbench \
forktree \
login \
ls \
mapbench \
maptest \
sh \
thrtest \
halt \
time \
sleep \
dirbench \
usertests \
lockstat \
preadtest \
perf
ifeq ($(HAVE_LWIP),y)
UPROGS += \
telnetd \
httpd
endif
UPROGS := $(addprefix $(O)/bin/, $(UPROGS))
$(O)/bin/%.unstripped: $(O)/bin/%.o $(ULIB)
@echo " LD $@"
$(Q)mkdir -p $(@D)
$(Q)$(LD) $(LDFLAGS) -N -e main -Ttext 0x100000 -o $@ $^
$(O)/bin/%: $(O)/bin/%.unstripped
@echo " STRIP $@"
$(Q)mkdir -p $(@D)
$(Q)$(STRIP) -o $@ $<
.PRECIOUS: $(O)/bin/%.o $(O)/bin/%.unstripped
-include $(O)/bin/*.d
// Boot loader.
//
// Part of the boot sector, along with bootasm.S, which calls bootmain().
// bootasm.S has put the processor into protected 32-bit mode.
// bootmain() loads an ELF kernel image from the disk starting at
// sector 1 and then jumps to the kernel entry routine.
#include "types.h"
#include "elf.h"
#include "amd64.h"
#include "memlayout.h"
#define SECTSIZE 512
void readseg(uchar*, uint, uint);
void
bootmain(void)
{
struct elfhdr *elf;
struct proghdr *ph, *eph;
void (*entry)(void);
uchar *pa;
elf = (struct elfhdr*)0x10000; // scratch space
// Read 1st page off disk
readseg((uchar*)elf, 4096, 0);
// Is this an ELF executable?
if(elf->magic != ELF_MAGIC)
return; // let bootasm.S handle error
// Load each program segment (ignores ph flags).
ph = (struct proghdr*)((uchar*)elf + elf->phoff);
eph = ph + elf->phnum;
for(; ph < eph; ph++){
pa = (uchar*)ph->pa;
readseg(pa, ph->filesz, ph->offset);
if(ph->memsz > ph->filesz)
stosb(pa + ph->filesz, 0, ph->memsz - ph->filesz);
}
// Call the entry point from the ELF header.
// Does not return!
entry = (void(*)(void))(elf->entry & 0xFFFFFF); // XXX get ridd off 0xFFFFF
entry();
}
void
waitdisk(void)
{
// Wait for disk ready.
while((inb(0x1F7) & 0xC0) != 0x40)
;
}
// Read a single sector at offset into dst.
void
readsect(void *dst, uint offset)
{
// Issue command.
waitdisk();
outb(0x1F2, 1); // count = 1
outb(0x1F3, offset);
outb(0x1F4, offset >> 8);
outb(0x1F5, offset >> 16);
outb(0x1F6, (offset >> 24) | 0xE0);
outb(0x1F7, 0x20); // cmd 0x20 - read sectors
// Read data.
waitdisk();
insl(0x1F0, dst, SECTSIZE/4);
}
// Read 'count' bytes at 'offset' from kernel into virtual address 'va'.
// Might copy more than asked.
void
readseg(uchar* va, uint count, uint offset)
{
uchar* eva;
eva = va + count;
// Round down to sector boundary.
va -= offset % SECTSIZE;
// Translate from bytes to sectors; kernel starts at sector 1.
offset = (offset / SECTSIZE) + 1;
// If this is too slow, we could read lots of sectors at a time.
// We'd write more to memory than asked, but it doesn't matter --
// we load in increasing order.
for(; va < eva; va += SECTSIZE, offset++)
readsect(va, offset);
}
// The kernel layout is:
//
// text
// rodata
// data
// bss
//
// Conventionally, Unix linkers provide pseudo-symbols
// etext, edata, and end, at the end of the text, data, and bss.
// For the kernel mapping, we need the address at the beginning
// of the data section, but that's not one of the conventional
// symbols, because the convention started before there was a
// read-only rodata section between text and data.
//
// To get the address of the data section, we define a symbol
// named data and make sure this is the first object passed to
// the linker, so that it will be the first symbol in the data section.
//
// Alternative approaches would be to parse our own ELF header
// or to write a linker script, but this is simplest.
.data
.align 4096
.globl data
data:
.word 1
OBJS = \
async.o \
bio.o \
bootdata.o \
cga.o \
cilk.o \
condvar.o \
console.o \
cpprt.o \
crange.o \
e1000.o \
exec.o \
file.o \
fmt.o \
fs.o \
ioapic.o \
lapic.o \
hwvm.o \
hz.o \
kalloc.o \
kmalloc.o \
kbd.o \
main.o \
memide.o \
mp.o \
net.o \
pci.o \
picirq.o \
pipe.o \
proc.o \
prof.o \
gc.o \
rnd.o \
sampler.o \
sched.o \
spinlock.o \
swtch.o \
string.o \
syscall.o \
sysfile.o \
sysproc.o \
uart.o \
vm.o \
trap.o \
trapasm.o \
wq.o \
incbin.o
OBJS := $(addprefix $(O)/kernel/, $(OBJS))
KERN = $(O)/kernel.elf
all: $(KERN)
$(KERN): $(O)/kernel/boot.o $(OBJS) $(LDEPS) kernel/kernel.ld
@echo " LD $@"
$(Q)mkdir -p $(@D)
$(Q)$(LD) $(LDFLAGS) -T kernel/kernel.ld -z max-page-size=4096 -e start \
-o $@ $(O)/kernel/boot.o $(OBJS) -L$(O) $(LFLAGS)
$(O)/kernel/%.o: lib/%.cc
@echo " CXX $@"
$(Q)mkdir -p $(@D)
$(Q)$(CXX) $(CXXFLAGS) -c -o $@ $<
$(O)/kernel/%.o: CFLAGS+=-mcmodel=large
$(O)/kernel/%.o: CXXFLAGS+=-mcmodel=large
$(O)/kernel/incbin.o: ASFLAGS+=-DMAKE_OUT=$(O)
$(O)/kernel/incbin.o: $(O)/kernel/initcode $(O)/kernel/bootother $(O)/fs.img
$(O)/kernel/%.o: kernel/%.S
@echo " CC $@"
$(Q)mkdir -p $(@D)
$(Q)$(CC) $(ASFLAGS) -c -o $@ $<
$(O)/kernel/initcode: TTEXT = 0x0
$(O)/kernel/bootother: TTEXT = 0x7000
$(O)/kernel/%: kernel/%.S
@echo " CC $@"
$(Q)mkdir -p $(@D)
$(Q)$(CC) $(CFLAGS) -nostdinc -I. -c $< -o $@.o
$(Q)$(LD) $(LDFLAGS) -N -e start -Ttext $(TTEXT) -o $@.out $@.o
$(Q)$(OBJCOPY) -S -O binary $@.out $@
.PRECIOUS: $(O)/kernel/%.o
-include $(O)/kernel/*.d
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论