Compare commits

..

13 Commits

Author SHA1 Message Date
Philipp Oppermann
bef5f13560 Print a “Hello World!” in Rust 2017-11-19 10:30:36 +01:00
Philipp Oppermann
a1743eb3dd Set the panic strategy to abort to fix _Unwind_Resume errors 2017-11-19 10:30:36 +01:00
Philipp Oppermann
13cffc3319 Add target directory to .gitignore 2017-11-19 10:30:36 +01:00
Philipp Oppermann
ff623a90e3 Use --gc-sections to remove unused program sections 2017-11-19 10:30:36 +01:00
Philipp Oppermann
5d8758df59 Add a dependency on rlibc 2017-11-18 11:10:17 +01:00
Philipp Oppermann
ca2ccc31aa Call the rust_main function from assembly 2017-11-18 11:10:17 +01:00
Philipp Oppermann
8dd179a6f4 Adjust the Makefile to build and link Rust code 2017-11-18 11:10:17 +01:00
Philipp Oppermann
9f578640d8 Add a target spcification that disables SSE and the red zone 2017-11-18 11:10:17 +01:00
Philipp Oppermann
8e5a85ece4 Create a new no_std cargo project 2017-05-12 21:31:28 +02:00
Philipp Oppermann
1c88c7f945 Update Readme for “Set Up Rust” post 2017-05-12 21:31:28 +02:00
Philipp Oppermann
9136a7b66f Zero all segment registers 2017-05-12 21:31:28 +02:00
Philipp Oppermann
415d27814f Do a far jump to long mode and print OKAY 2017-05-12 21:31:28 +02:00
Philipp Oppermann
e684bfd262 Create and load a 64-bit GDT 2017-05-12 21:31:28 +02:00
9 changed files with 101 additions and 8 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
build
target

10
Cargo.toml Normal file
View File

@@ -0,0 +1,10 @@
[package]
name = "blog_os"
version = "0.1.0"
authors = ["Philipp Oppermann <dev@phil-opp.com>"]
[lib]
crate-type = ["staticlib"]
[dependencies]
rlibc = "1.0"

View File

@@ -1,6 +1,8 @@
arch ?= x86_64
kernel := build/kernel-$(arch).bin
iso := build/os-$(arch).iso
target ?= $(arch)-blog_os
rust_os := target/$(target)/debug/libblog_os.a
linker_script := src/arch/$(arch)/linker.ld
grub_cfg := src/arch/$(arch)/grub.cfg
@@ -8,7 +10,7 @@ assembly_source_files := $(wildcard src/arch/$(arch)/*.asm)
assembly_object_files := $(patsubst src/arch/$(arch)/%.asm, \
build/arch/$(arch)/%.o, $(assembly_source_files))
.PHONY: all clean run iso
.PHONY: all clean run iso kernel
all: $(kernel)
@@ -27,8 +29,12 @@ $(iso): $(kernel) $(grub_cfg)
@grub-mkrescue -o $(iso) build/isofiles 2> /dev/null
@rm -r build/isofiles
$(kernel): $(assembly_object_files) $(linker_script)
@ld -n -T $(linker_script) -o $(kernel) $(assembly_object_files)
$(kernel): kernel $(rust_os) $(assembly_object_files) $(linker_script)
@ld -n --gc-sections -T $(linker_script) -o $(kernel) \
$(assembly_object_files) $(rust_os)
kernel:
@xargo build --target $(target)
# compile assembly files
build/arch/$(arch)/%.o: src/arch/$(arch)/%.asm

View File

@@ -1,12 +1,12 @@
# Blog OS (Entering Longmode)
[![Build Status](https://travis-ci.org/phil-opp/blog_os.svg?branch=post_2)](https://travis-ci.org/phil-opp/blog_os/branches)
# Blog OS (Set Up Rust)
[![Build Status](https://travis-ci.org/phil-opp/blog_os.svg?branch=post_3)](https://travis-ci.org/phil-opp/blog_os/branches)
This repository contains the source code for the [Entering Longmode](http://os.phil-opp.com/entering-longmode.html) post of the [Writing an OS in Rust](http://os.phil-opp.com) series.
This repository contains the source code for the [Set Up Rust](http://os.phil-opp.com/set-up-rust.html) post of the [Writing an OS in Rust](http://os.phil-opp.com) series.
**Check out the [master branch](https://github.com/phil-opp/blog_os) for more information.**
## Building
You need to have `nasm`, `grub-mkrescue`, `xorriso`, and `qemu` installed. Then you can run it using `make run`.
You need to have `nasm`, `grub-mkrescue`, `xorriso`, `qemu`, and a nigthly Rust compiler installed. Then you can run it using `make run`.
Please file an issue if you have any problems.

View File

@@ -1,4 +1,5 @@
global start
extern long_mode_start
section .text
bits 32
@@ -12,6 +13,11 @@ start:
call set_up_page_tables
call enable_paging
; load the 64-bit GDT
lgdt [gdt64.pointer]
jmp gdt64.code:long_mode_start
; print `OK` to screen
mov dword [0xb8000], 0x2f4b2f4f
hlt
@@ -147,3 +153,12 @@ p2_table:
stack_bottom:
resb 64
stack_top:
section .rodata
gdt64:
dq 0 ; zero entry
.code: equ $ - gdt64 ; new
dq (1<<43) | (1<<44) | (1<<47) | (1<<53) ; code segment
.pointer:
dw $ - gdt64 - 1
dq gdt64

View File

@@ -6,7 +6,7 @@ SECTIONS {
.boot :
{
/* ensure that the multiboot header is at the beginning */
*(.multiboot_header)
KEEP(*(.multiboot_header))
}
.text :

View File

@@ -0,0 +1,22 @@
global long_mode_start
extern rust_main
section .text
bits 64
long_mode_start:
; load 0 into all data segment registers
mov ax, 0
mov ss, ax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
; call the rust main
extern rust_main
call rust_main
; print `OKAY` to screen
mov rax, 0x2f592f412f4b2f4f
mov qword [0xb8000], rax
hlt

26
src/lib.rs Normal file
View File

@@ -0,0 +1,26 @@
#![feature(lang_items)]
#![no_std]
extern crate rlibc;
#[no_mangle]
pub extern fn rust_main() {
// ATTENTION: we have a very small stack and no guard page
let hello = b"Hello World!";
let color_byte = 0x1f; // white foreground, blue background
let mut hello_colored = [color_byte; 24];
for (i, char_byte) in hello.into_iter().enumerate() {
hello_colored[i*2] = *char_byte;
}
// write `Hello World!` to the center of the VGA text buffer
let buffer_ptr = (0xb8000 + 1988) as *mut _;
unsafe { *buffer_ptr = hello_colored };
loop{}
}
#[lang = "eh_personality"] extern fn eh_personality() {}
#[lang = "panic_fmt"] #[no_mangle] pub extern fn panic_fmt() -> ! {loop{}}

13
x86_64-blog_os.json Normal file
View File

@@ -0,0 +1,13 @@
{
"llvm-target": "x86_64-unknown-none",
"data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
"linker-flavor": "gcc",
"target-endian": "little",
"target-pointer-width": "64",
"target-c-int-width": "32",
"arch": "x86_64",
"os": "none",
"disable-redzone": true,
"features": "-mmx,-sse,+soft-float",
"panic-strategy": "abort"
}