multiboot support and memory-only (no disk) kernel
This commit is contained in:
		
							parent
							
								
									af6a6a4775
								
							
						
					
					
						commit
						89bfdd4db1
					
				
					 2 changed files with 97 additions and 2 deletions
				
			
		
							
								
								
									
										24
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										24
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
					@ -82,6 +82,11 @@ xv6.img: bootblock kernel fs.img
 | 
				
			||||||
	dd if=bootblock of=xv6.img conv=notrunc
 | 
						dd if=bootblock of=xv6.img conv=notrunc
 | 
				
			||||||
	dd if=kernel of=xv6.img seek=1 conv=notrunc
 | 
						dd if=kernel of=xv6.img seek=1 conv=notrunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					xv6memfs.img: bootblock kernelmemfs
 | 
				
			||||||
 | 
						dd if=/dev/zero of=xv6memfs.img count=10000
 | 
				
			||||||
 | 
						dd if=bootblock of=xv6memfs.img conv=notrunc
 | 
				
			||||||
 | 
						dd if=kernelmemfs of=xv6memfs.img seek=1 conv=notrunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bootblock: bootasm.S bootmain.c
 | 
					bootblock: bootasm.S bootmain.c
 | 
				
			||||||
	$(CC) $(CFLAGS) -fno-pic -O -nostdinc -I. -c bootmain.c
 | 
						$(CC) $(CFLAGS) -fno-pic -O -nostdinc -I. -c bootmain.c
 | 
				
			||||||
	$(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c bootasm.S
 | 
						$(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c bootasm.S
 | 
				
			||||||
| 
						 | 
					@ -102,11 +107,23 @@ initcode: initcode.S
 | 
				
			||||||
	$(OBJCOPY) -S -O binary initcode.out initcode
 | 
						$(OBJCOPY) -S -O binary initcode.out initcode
 | 
				
			||||||
	$(OBJDUMP) -S initcode.o > initcode.asm
 | 
						$(OBJDUMP) -S initcode.o > initcode.asm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
kernel: $(OBJS) bootother initcode
 | 
					kernel: $(OBJS) multiboot.o bootother initcode
 | 
				
			||||||
	$(LD) $(LDFLAGS) -Ttext 0x100000 -e main -o kernel $(OBJS) -b binary initcode bootother
 | 
						$(LD) $(LDFLAGS) -Ttext 0x100000 -e main -o kernel multiboot.o $(OBJS) -b binary initcode bootother fs.img
 | 
				
			||||||
	$(OBJDUMP) -S kernel > kernel.asm
 | 
						$(OBJDUMP) -S kernel > kernel.asm
 | 
				
			||||||
	$(OBJDUMP) -t kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > kernel.sym
 | 
						$(OBJDUMP) -t kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > kernel.sym
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# kernelmemfs is a copy of kernel that maintains the
 | 
				
			||||||
 | 
					# disk image in memory instead of writing to a disk.
 | 
				
			||||||
 | 
					# This is not so useful for testing persistent storage or
 | 
				
			||||||
 | 
					# exploring disk buffering implementations, but it is
 | 
				
			||||||
 | 
					# great for testing the kernel on real hardware without
 | 
				
			||||||
 | 
					# needing a scratch disk.
 | 
				
			||||||
 | 
					MEMFSOBJS = $(filter-out ide.o,$(OBJS)) memide.o
 | 
				
			||||||
 | 
					kernelmemfs: $(MEMFSOBJS) multiboot.o bootother initcode fs.img
 | 
				
			||||||
 | 
						$(LD) $(LDFLAGS) -Ttext 0x100000 -e main -o kernelmemfs multiboot.o $(MEMFSOBJS) -b binary initcode bootother fs.img
 | 
				
			||||||
 | 
						$(OBJDUMP) -S kernelmemfs > kernelmemfs.asm
 | 
				
			||||||
 | 
						$(OBJDUMP) -t kernelmemfs | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > kernelmemfs.sym
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tags: $(OBJS) bootother.S _init
 | 
					tags: $(OBJS) bootother.S _init
 | 
				
			||||||
	etags *.S *.c
 | 
						etags *.S *.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -187,6 +204,9 @@ QEMUOPTS = -hdb fs.img xv6.img -smp $(CPUS)
 | 
				
			||||||
qemu: fs.img xv6.img
 | 
					qemu: fs.img xv6.img
 | 
				
			||||||
	$(QEMU) -serial mon:stdio $(QEMUOPTS)
 | 
						$(QEMU) -serial mon:stdio $(QEMUOPTS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					qemu-memfs: xv6memfs.img
 | 
				
			||||||
 | 
						$(QEMU) xv6memfs.img -smp $(CPUS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
qemu-nox: fs.img xv6.img
 | 
					qemu-nox: fs.img xv6.img
 | 
				
			||||||
	$(QEMU) -nographic $(QEMUOPTS)
 | 
						$(QEMU) -nographic $(QEMUOPTS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										75
									
								
								multiboot.S
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								multiboot.S
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,75 @@
 | 
				
			||||||
 | 
					# Multiboot header, for multiboot boot loaders like GNU Grub.
 | 
				
			||||||
 | 
					# http://www.gnu.org/software/grub/manual/multiboot/multiboot.html
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Using GRUB 2, you can boot xv6 from a file stored in a
 | 
				
			||||||
 | 
					# Linux file system by copying kernel or kernelmemfs to /boot
 | 
				
			||||||
 | 
					# and then adding this menu entry:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# menuentry "xv6" {
 | 
				
			||||||
 | 
					# 	insmod ext2
 | 
				
			||||||
 | 
					# 	set root='(hd0,msdos1)'
 | 
				
			||||||
 | 
					# 	set kernel='/boot/kernel'
 | 
				
			||||||
 | 
					# 	echo "Loading ${kernel}..."
 | 
				
			||||||
 | 
					# 	multiboot ${kernel} ${kernel}
 | 
				
			||||||
 | 
					# 	boot
 | 
				
			||||||
 | 
					# }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "asm.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define STACK 4096
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SEG_KCODE 1  // kernel code
 | 
				
			||||||
 | 
					#define SEG_KDATA 2  // kernel data+stack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Multiboot header.  Data to direct multiboot loader.
 | 
				
			||||||
 | 
					.p2align 2
 | 
				
			||||||
 | 
					.text
 | 
				
			||||||
 | 
					.globl multiboot_header
 | 
				
			||||||
 | 
					multiboot_header:
 | 
				
			||||||
 | 
					  #define magic 0x1badb002
 | 
				
			||||||
 | 
					  #define flags (1<<16 | 1<<0)
 | 
				
			||||||
 | 
					  .long magic
 | 
				
			||||||
 | 
					  .long flags
 | 
				
			||||||
 | 
					  .long (-magic-flags)
 | 
				
			||||||
 | 
					  .long multiboot_header  # beginning of image
 | 
				
			||||||
 | 
					  .long multiboot_header
 | 
				
			||||||
 | 
					  .long edata
 | 
				
			||||||
 | 
					  .long end
 | 
				
			||||||
 | 
					  .long multiboot_entry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Multiboot entry point.  Machine is mostly set up.
 | 
				
			||||||
 | 
					# Configure the GDT to match the environment that our usual
 | 
				
			||||||
 | 
					# boot loader - bootasm.S - sets up.
 | 
				
			||||||
 | 
					.globl multiboot_entry
 | 
				
			||||||
 | 
					multiboot_entry:
 | 
				
			||||||
 | 
					  lgdt gdtdesc
 | 
				
			||||||
 | 
					  ljmp $(SEG_KCODE<<3), $mbstart32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mbstart32:
 | 
				
			||||||
 | 
					  # Set up the protected-mode data segment registers
 | 
				
			||||||
 | 
					  movw    $(SEG_KDATA<<3), %ax    # Our data segment selector
 | 
				
			||||||
 | 
					  movw    %ax, %ds                # -> DS: Data Segment
 | 
				
			||||||
 | 
					  movw    %ax, %es                # -> ES: Extra Segment
 | 
				
			||||||
 | 
					  movw    %ax, %ss                # -> SS: Stack Segment
 | 
				
			||||||
 | 
					  movw    $0, %ax                 # Zero segments not ready for use
 | 
				
			||||||
 | 
					  movw    %ax, %fs                # -> FS
 | 
				
			||||||
 | 
					  movw    %ax, %gs                # -> GS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Set up the stack pointer and call into C.
 | 
				
			||||||
 | 
					  movl $(stack + STACK), %esp
 | 
				
			||||||
 | 
					  call main
 | 
				
			||||||
 | 
					spin:
 | 
				
			||||||
 | 
					  jmp spin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Bootstrap GDT
 | 
				
			||||||
 | 
					.p2align 2                                # force 4 byte alignment
 | 
				
			||||||
 | 
					gdt:
 | 
				
			||||||
 | 
					  SEG_NULLASM                             # null seg
 | 
				
			||||||
 | 
					  SEG_ASM(STA_X|STA_R, 0x0, 0xffffffff)   # code seg
 | 
				
			||||||
 | 
					  SEG_ASM(STA_W, 0x0, 0xffffffff)         # data seg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gdtdesc:
 | 
				
			||||||
 | 
					  .word   (gdtdesc - gdt - 1)             # sizeof(gdt) - 1
 | 
				
			||||||
 | 
					  .long   gdt                             # address gdt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.comm stack, STACK
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue