自己動手寫最小的ARM操作系統。能夠看到自己的代碼,真的控制着硬件啓動起來,心情是不一樣的。
ARM是嵌入式設備,想寫個操作系統就需要了解硬件。在X86時代有BIOS幫我們,大部分東西簡化了。在ARM時代,最小的操作系統,是設置好串口。通過串口打印字符。
最小的PC,也是有鍵盤,顯示器和主機。
最小的嵌入式設備,無鍵盤,無顯示器,只有主機,最通用的就是串口了。所以最小的操作系統,也只能通過這裏輸出。
我們要做的工作,(目前沒有使用中斷,從最小系統的角度,已經夠了,理解就好。):
1.閱讀SOC的芯片手冊,找到如何設置UART寄存器。
2.往串口寫數據。
.org 0x0000
@
@ UART initialisation (38400 8N1)
@
ldr r0, =0x1c090000 @ UART base (Versatile Express)
mov r1, #0x10 @ ibrd
str r1, [r0, #0x24]
mov r1, #0xc300
orr r1, #0x0001 @ cr
str r1, [r0, #0x30]
mov r1, #'f'
str r1, [r0, #0x0]
mov r1, #'o'
str r1, [r0, #0x0]
mov r1, #'r'
str r1, [r0, #0x0]
mov r1, #'e'
str r1, [r0, #0x0]
mov r1, #'s'
str r1, [r0, #0x0]
mov r1, #'t'
str r1, [r0, #0x0]
mov r1, #'c'
str r1, [r0, #0x0]
mov r1, #'e'
str r1, [r0, #0x0]
mov r1, #'l'
str r1, [r0, #0x0]
mov r1, #'l'
str r1, [r0, #0x0]
mov r1, #0x0A
str r1, [r0, #0x0]
b .
Makefile
# Build an ELF linux image
IMAGE = boot.bin
BOOTLOADER = boot.S
CROSS_COMPILE = arm-none-linux-gnueabi-
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
all:$(IMAGE)
clean:
rm -f $(IMAGE)
$(IMAGE): $(BOOTLOADER)
$(AS) -o $@ $<
fastmodels模擬運行的截圖
qemu模擬運行的截圖