操作系统实战45讲:HelloOS运行笔记

简介: 操作系统实战45讲:HelloOS运行笔记

1.实验环境:


1.1 系统环境


  • Ubuntu 20.04.2.0 LTS
  • vmware虚拟机


1.2 安装编译环境


  • 安装汇编编译器


sudo apt-get install nasm


  • 安装gcc(该命令会安装包括gcc在内的所有软件)


sudo apt install build-essential


2. HelloOS实现说明


2.1 HelloOS文件构成


  • entry.asm
  • 供grub调用的引导程序,用于设置CPU工作模式与工作环境,并调用C语言编写的main函数


main.c

  • 打印字符串


#include "vgastr.h"
void main() {
  printf("Hello OS!");
  return;
}


vgastr.c / vgastr.h

  • 实现在显示屏上输出信息


void _strwrite(char *string) {
  char *p_strdst = (char *)(0xb8000);  //指向显存开始的地址
  while(*string) {
    *p_strdst = *string++;
    p_strdst += 2;  //每两个字节对应一个字符,其中一个字节是字符的ASCII码,另一个字节为字符的的颜色值
  }
  return;
}
void printf(char *fmt, ...) {
  _strwrite(fmt);
  return;
}


hello.lds

  • 链接器脚本,用于指导链接过程,设定不同程序段的布局


ENTRY(_start)
OUTPUT_ARCH(i386)
OUTPUT_FORMAT(elf32-i386)
SECTIONS
{
  . = 0x200000;
  __begin_start_text = .;
  .start.text : ALIGN(4) { *(.start.text) }
  __end_start_text = .;
  __begin_text = .;
  .text : ALIGN(4) { *(.text) }
  __end_text = .;
  __begin_data = .;
  .data : ALIGN(4) { *(.data) }
  __end_data = .;
  __begin_rodata = .;
  .rodata : ALIGN(4) { *(.rodata) *(.rodata.*) }
  __end_rodata = .;
  __begin_kstrtab = .;
  .kstrtab : ALIGN(4) { *(.kstrtab) }
  __end_kstrtab = .;
  __begin_bss = .;
       .bss : ALIGN(4) { *(.bss) }
  __end_bss = .;
}


  • Makefile
  • 编译脚本


2.2 屏幕显示说明


若想使用屏幕显示出字符,则需要使用代码对显卡进行控制。


不论是集显、核显、独显,它们都支持VESA标准,该标准有两种工作模式:字符模式与图形模式。这些显卡为了兼容VESA标准,他们都会提供VGABIOS的固件程序。


2.2.1 显卡的字符模式


在字符模式下,屏幕将会被分为24行,每行80个字符,然后将这24 * 80个字符映射到从0xb8000地址开始的内存中,每两个字节对应一个字符,一个字节对应字符的ASCII码,一个字节对应字符的颜色。


ad9d77ea43c84d41bbb560f2f476ecc5.png



更多关于显卡文本模式下输出字符,可参考下文的chapter 2:点击查看


2.3 部署HelloOS


部署之前,首先了解下HelloOS的引导流程


PC机的BIOS固化在主板上的ROM中,上电后第一条指令就是BIOS固件中的,它负责检测与初始化CPU,内存,主板,之后加载引导设备中的第一个扇区,到0x7c00地址开始的内存空间,然后跳转到0x7c00处执行指令。


本次实验使用的是GRUB引导程序。

d140190aedcd4490bde8945785c88576.png

2.3.1 准备文件


2.3.1.1 编译HelloOS


  • 将生成的HelloOS.bin文件复制到boot文件夹下。(也可将bin文件放置在其他文件夹下,不过一般放在boot中)
  • sudo mv HelloOS.bin /boot/


2.3.1.2 修改启动项等待时间


  • 修改默认启动项的等待时间,打开grub文件,修改GRUB_TIMEOUT参数,默认为10s
  • sudo gedit /etc/default/grub


ad1c0c2de63b4be7babed3736c888eaf.png


  • 修改之后使用以下命令更新文件设置,该命令会将/boot/grub/grub.cfg文件给初始化,若之前有所修改,则需要再次进行修改
  • sudo update-grub


2.3.1.3 虚拟机添加启动项


  • 打开grub.cfg文件:sudo gedit /boot/grub/grub.cfg
  • 在文件中插入以下代码
  • 代码之间使用的是空格,不能是tab键或其他字符(tab键将会导致启动时找不到相关命令)
menuentry 'HelloOS' {
  insmod part_msdos     #GRUB加载分区模块识别分区
  insmod ext2           #GRUB加载ext文件系统模块识别ext文件系统
  set root='hd0,msdos5' #注意boot目录挂载的分区,这是我机器上的情况
  multiboot2 /boot/HelloOS.bin  #GRUB以multiboot2协议加载HelloOS.bin
  boot
}

insmod 与 set root说明


set root=‘***’里面填写的是存放HelloOS.bin的文件夹,在 2.3.1.1 中其实说过,HelloOS.bin文件放在哪里都是可以的,不一定要放在/boot文件夹下。而set root=’'中填写的就是存放HelloOS.bin的文件夹所在的磁盘分区。


查找HelloOS.bin文件所在分区:

重启时长按ESC键,进入grub引导界面

按下c键进入命令交互模式

使用ls命令查看磁盘分区信息

使用ls (hdx,msdosx)/boot/ 命令查找HelloOS.bin文件,然后将包含有bin文件的磁盘写入set root参数


455b6787e56e4cc5812f50b57da08fdc.png

multiboot2说明


该参数是HelloOS.bin文件存放的路径,该参数设置错误的话,启动HelloOS时将会出现“HelloOS.bin not found”错误


boot挂载情况主要分为两种:独立分区单独挂载 与 属于根分区的一部分


使用df -h /boot/ 命令查看boot的挂载情况,也可使用df -h查看所有的挂在


属于根分区的一部分


multiboot2 /boot/HelloOS.bin

8f16d5a5ba304e5b9be851e1e0207db1.png


1c9e72a2502d41eeb165ccde40041707.png


独立分区单独挂载

multiboot2 /HelloOS.bin


796ca7aef6104ad4a27afc3e6d3a5687.png


2.3.1.4 物理机添加启动项


  • 参考 2.3.1.3 虚拟机添加启动项 进入grub引导界面,查看磁盘分区信息


0e64129b20224438a86e4f06e667cf55.png

  • 这里物理机的磁盘分区为gpt方式,修改insmod参数
  • insmod part_gpt
  • 使用ls (hdx,gptx)/ls (hdx,gptx)/boot/命令进行查找bin文件(前者为单独分区,后者为属于根分区的一部分)
  • 启动代码
menuentry 'HelloOS' {
  insmod part_gpt #GRUB加载分区模块识别分区
  insmod ext2 #GRUB加载ext文件系统模块识别ext文件系统
  set root='hd0,gpt5' #注意boot目录挂载的分区,这是我机器上的情况
  multiboot2 /HelloOS.bin #GRUB以multiboot2协议加载HelloOS.bin
  boot #GRUB启动HelloOS.bin
}


HelloOS运行结果


9a132c3d5c974849abb5fb84f02ca3a5.png

相关文章
人工智能 运维 架构师
384 0
|
弹性计算 人工智能 运维
阿里云操作系统控制台实战评测:提升云资源管理与监控效率
阿里云操作系统控制台是一款集成了可视化管理、问题分析和智能助手等功能的运维工具,适用于企业和个人用户。它通过统一界面监控和优化系统运行,结合AI与自动化技术,提升操作系统的使用效率和稳定性。用户无需专业运维知识即可完成系统维护和故障诊断。主要功能包括进程热度追踪、系统诊断等,提供直观的数据展示和详细的分析报告,帮助用户快速定位并解决问题。建议进一步完善操作文档和优化数据可视化效果,以提升用户体验。
313 0
|
前端开发 JavaScript 开发工具
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
987 5
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
989 11
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
JavaScript 编译器 开发工具
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
769 2
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
703 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
人工智能 并行计算 安全
用户实操:如何以龙蜥操作系统为底座在 CPU 上运行 DeepSeek-R1
介绍如何在 CPU 上使用 llama.cpp 推理 671B 版本的 DeepSeek R1,以及实际效果。
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2866 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
JSON JavaScript 前端开发
harmony-chatroom 自研纯血鸿蒙OS Next 5.0聊天APP实战案例
HarmonyOS-Chat是一个基于纯血鸿蒙OS Next5.0 API12实战开发的聊天应用程序。这个项目使用了ArkUI和ArkTS技术栈,实现了类似微信的消息UI布局、输入框光标处插入文字、emoji表情图片/GIF动图、图片预览、红包、语音/位置UI、长按语音面板等功能。
1157 4

推荐镜像

更多