筆者所使用的作業系統:Lubuntu 18.10。
環境建立
安裝 Cross Compiler
For Raspberry Pi 2:
sudo apt install gcc-arm-none-eabi
For Raspberry Pi 3:
sudo apt install gcc-aarch64-linux-gnu build-essential
安裝模擬器
sudo apt install qemu-system-arm
需要分別建立底下的檔案:
- The kernel entry point「boot.S 」
- The C code「kernel.c」
- Tying the pieces together「linker.ld」
- A special file that contains shell commands「Makefile」
底下就以RPI2與RPI3來當作例子吧。
1. Say "Hello" to RPI2 UART
在 https://jsandler18.github.io/ 裡,有針對這四個檔案做說明:
若不使用Makefile與make來編譯與執行時,需用底下指令來編譯
arm-none-eabi-gcc -mcpu=cortex-a7 -fpic -ffreestanding -c boot.S -o boot.o
arm-none-eabi-gcc -mcpu=cortex-a7 -fpic -ffreestanding -std=gnu99 -c kernel.c -o kernel.o -O2 -Wall -Wextra
arm-none-eabi-gcc -T linker.ld -o myos.elf -ffreestanding -O2 -nostdlib boot.o kernel.o
以及底下指令來執行
qemu-system-arm -m 256 -M raspi2 -serial stdio -kernel myos.elf
而在kernel.c的程式碼中有用到memory mapped IO 的觀念,這部份可參考此網頁的說明 https://jsandler18.github.io/extra/peripheral.html。
於是筆者將程式修改成會輸出中文字,如下圖:
讀者可從筆者的github下載修改過的程式碼:https://github.com/pinglunliao/miniOS_RPI2/tree/master/helloUart
2. Say "Hello" to RPI3 UART
樹莓派3需要底下幾個檔案:
讀者可從筆者的github下載修改過的程式碼:https://github.com/pinglunliao/miniOS_RPI3/tree/master/01helloUart1
入門的資訊就介紹到這兒,若想深入了解本文其他部份以及其他主題(如Processor initialization、Framebuffer、Interrupts、Processes等)請自行參考相關資料[1]、[2]、[3]。下圖就是Framebuffer的例子。(註:由GIMP可以輸出給framebuffer 用的 header file。)
- boot.S: https://jsandler18.github.io/explanations/boot_S.html
- kernel.c: https://jsandler18.github.io/explanations/kernel_c.html
- linker.ld: https://jsandler18.github.io/explanations/linker_ld.html
- Makefile: https://github.com/jsandler18/raspi-kernel/blob/9208b9b20134909b107cb344c90f57c2c72c377d/Makefile
若不使用Makefile與make來編譯與執行時,需用底下指令來編譯
arm-none-eabi-gcc -mcpu=cortex-a7 -fpic -ffreestanding -c boot.S -o boot.o
arm-none-eabi-gcc -mcpu=cortex-a7 -fpic -ffreestanding -std=gnu99 -c kernel.c -o kernel.o -O2 -Wall -Wextra
arm-none-eabi-gcc -T linker.ld -o myos.elf -ffreestanding -O2 -nostdlib boot.o kernel.o
qemu-system-arm -m 256 -M raspi2 -serial stdio -kernel myos.elf
而在kernel.c的程式碼中有用到memory mapped IO 的觀念,這部份可參考此網頁的說明 https://jsandler18.github.io/extra/peripheral.html。
於是筆者將程式修改成會輸出中文字,如下圖:
讀者可從筆者的github下載修改過的程式碼:https://github.com/pinglunliao/miniOS_RPI2/tree/master/helloUart
2. Say "Hello" to RPI3 UART
樹莓派3需要底下幾個檔案:
- start.S(等於前述RPI2的boot.S)。
- main.c、gpio.h、uart.c、uart.h(等於將前述RPI2的kernel.c模組化)。
- link.ld(等於前述RPI2的linker.ld)。
- Makefile。
讀者可從筆者的github下載修改過的程式碼:https://github.com/pinglunliao/miniOS_RPI3/tree/master/01helloUart1
入門的資訊就介紹到這兒,若想深入了解本文其他部份以及其他主題(如Processor initialization、Framebuffer、Interrupts、Processes等)請自行參考相關資料[1]、[2]、[3]。下圖就是Framebuffer的例子。(註:由GIMP可以輸出給framebuffer 用的 header file。)
沒有留言:
張貼留言