1.将游戏传奇的操作系统客户端和操作系统的源代码结合,因为都是出c++的缘故,所以先写操作系统,再进行游戏传奇的耦合。
我们需要先来用出c++写一个操作系统。
2.首先我们需要的文件是(包括一下源代码):
link.ld
ENTRY(loader) OUTPUT_FORMAT(elf32-i386) OUTPUT_ARCH(i386:i386) SECTIONS { .=0X0100000; .text : { *(.multiboot) *(.text*) *(.rodata) } .data : { start_ctors = .; *(.ctor*) KEEP(*(.init_array)); KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*))); end_ctors = .; start_dtors = .; *(.dtor*) end_dtors = .; *(.data) } .bss : { *(.bss) } /DISCARD/: { *(.fini_array*) *(.comment) } }
kernel.cpp
extern "C" void kernelMain(void* multiboot_structure,uint32_t) { printf("123"); while(1); }
loader.s
.set MAGIC, 0x1badd002 .set FLAGS, (1<<0 |1<<1) .set CHECKSUM, -(MAGIC+FLAGS) .text .align 4 .multiboot: .long MAGIC .long FLAGS .long CHECKSUM .text .text .align 4 .extern callConstructors .globl kernelMain kernelMain: .globl loader loader: mov $kernel_stack, %esp call callConstructors push %rax push %rax call kernelMain _stop: cli hlt jmp _stop .text .bss .space 2*1024*1024
Makefile
GPPPARAMS = -m32 -fno-use-cxa-atexit -fleading-underscore -fno-exceptions -fno-builtin -nostdlib -fno-rtti -fno-pie ASPARAMS = -m64 #有的版本是--32 LDPARAMS = -elf_i386 -no-pieo
objects = loader.o kernel.o
%.o: %.cpp g++ $(GPPPARAMS) -o $@ -c $< %.o: %.s as $(ASPARAMS) -o $@ $< mykernel.bin:linker.ld $(objects) ld $(LDPARAMS) -T $< -o $@ $(objects) install: mykernel.bin sudo cp $< /boot/mykernel.bin mykernel.iso: mykernel.bin sudo mkdir iso sudo mkdir iso/boot sudo mkdir iso/boot/grub sudo cp $< iso/boot/ sudo echo 'set timeout=0' >> iso/boot/grub/grub.cfg sudo echo 'set default=0' >> iso/boot/grub/grub.cfg sudo echo '' iso/boot/grub/grub.cfg sudo echo 'menuentry "My Operating System"' >> iso/boot/grub/grub.cfg sudo echo 'multiboot /boot/kernel.bin' >> iso/boot/grub/grub.cfg sudo echo 'boot' >> iso/boot/grub/grub.cfg sudo echo '}' >> iso/boot/grub/grub.cfg sudo grub -mkrescue --output=$@ iso
2.调出命令框,切换到目标文件下。
make mykernel.iso
3.只要弹出printf报错就行了。
4.附上我自己的github仓库,欢迎大家来逛。
我会持续更新,各种内容。