同步操作将从 jhb/armv8_os 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
a simple operating system base armv8 arch by qemu enumlature
基于armv8处理器架构,基于qemu模拟器仿真、学习操作系统
1、希望可以通过自己动手编写一个极简的操作系统,来进行操作系统学习
2、基于armv8处理器架构,使用qemu模拟器模拟硬件,做到不依赖开发板,随时随地都可以编写运行程序,测试验证,简化开发流程,重点关注操作系统逻辑开发
3、目前支持在ubuntu系统环境下进行软件代码的开发和编译以及调试
目前已经完成基础环境搭建和基本代码编写,支持aarch64架构汇编启动、中断和异常处理、串口输入输出,在此基础上进行操作系统相关学习并完成以下内容
希望可以一步步完成一个操作系统的最小系统,窥探其实现原理,并逐渐去添砖加瓦,丰富完善,做到从功能到性能
当前进度以及目标计划:
基础组件
操作系统功能
本项目在ubuntu系统下运行,需要依赖qemu模拟硬件和aarch64交叉编译工具链编译代码
sudo apt-get install qemu-system-arm
安装交叉编译工具链,用于编译程序。工具链下载地址:
一般需要下载 x86_64 Linux hosted cross compilers版本,就是说主机是X86_64架构,目标是aarch64架构,交叉编译工具链配置过程如下:
下载交叉编译工具文件: gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz
配置工具链:
创建一个文件夹用于放置工具链 sudo mkdir /opt/toolchain
解压压缩包到上面的目录
sudo tar -xvf path/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz /opt/toolchain
注意:path/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz 是指实际文件实际下载的目录
解压后可删除tar压缩包
sudo rm gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz
执行下面的命令添加环境变量
sudo gedit /etc/profile
在文件的最后一行添加:
export PATH=$PATH:/opt/toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin
重启虚拟机或者执行命令source /etc/profile
,使环境变量配置生效
验证配置结果
置好交叉编译工具链,输入aarch64-none-elf-gcc -v
命令出现如下提示表示工具链配置成功(若提示找不到aarch64-none-elf-gcc,可在命令行执行export PATH=$PATH:/usr/local/arm/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin
后重试)
aarch64-none-elf-gcc -v
gcc version 10.3.1 20210621 (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29))
执行下面的命令从github克隆代码
git clone https://github.com/jhbdream/armv8_os.git
使用下面的命令编译代码,启动qemu仿真器执行代码
make
make qemu
如果环境正常的话,运行正常会有如下打印信息:
qemu-system-aarch64 -machine virt,gic-version=3 -cpu cortex-a57 -smp 1 -m 1024 -nographic -serial mon:stdio -kernel app
run in main!
[ 0.002090] EasyLogger V2.2.99 is initialize success.
[ 0.003600] i am taska_fun run! line:[21]!
[ 0.503791] i am taska_fun run! line:[21]!
[ 1.003931] i am taska_fun run! line:[21]!
[ 1.004807] irq_enter
[ 1.004984] handle_domain_irq: [30]
[ 1.005165] switch from pid:[0]!
[ 1.005272] switch to pid:[1]!
[ 1.005392] irq_exit
[ 1.005618] i am taskb_fun run! line:[37]!
[ 1.505746] i am taskb_fun run! line:[37]!
[ 2.005875] i am taskb_fun run! line:[37]!
[ 2.006238] irq_enter
[ 2.006288] handle_domain_irq: [30]
[ 2.006405] switch from pid:[1]!
[ 2.006537] switch to pid:[2]!
[ 2.006625] irq_exit
[ 2.006721] i am taskc_fun run! line:[47]!
[ 2.506848] i am taskc_fun run! line:[47]!
[ 3.006940] i am taskc_fun run! line:[47]!
common
与硬件无关的逻辑代码,但是也会有调用硬件的接口
libcpu/aarch64
armv8 aarch64架构的cpu启动代码,完成处理器的一些寄存器配置,准备c运行环境,跳转到main
函数入口
driver
外设驱动程序,如串口、中断控制器等
user
用户应用程序目录
在 gcc.ld 文件中指定了代码的入口函数为StartUp
,该函数位于libcpu/aarch64/startup.S 文件中
_startup 主要由汇编代码组成,完成一些处理器相关寄存器的初始化配置,跳转到c环境中
关于处理器相关配置,该部分与处理器架构相关较大,如果感兴趣可以去了解一下armv8处理器架构相关资料
也可以掠过该部分,重点关注后面的操作系统逻辑
进入c环境之前,比较重要的工作有下面几个部分
对 bss 段进行清零
设置堆栈寄存器
完成上面的设置,可以尽快进入到C语言环境中,方便开发,避免过多设计汇编等语法
本项目提供了操作系统需要的几个最小组成部分
通过定时器中断timer_handler
驱动任务切换调度,基本可以满足开箱即用
本项目使用了 EasyLogger 组件用作调试日志输出 ,可以提供非常美观便捷的串口输出功能,可以到项目主页了解详情
本项目在微信公众号平台同步更新全部的开发教程,欢迎扫码关注:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。