从零制作操作系统——环境搭建以及HelloWorld

从零制作操作系统——环境搭建以及HelloWorld

起因

最近在学习操作系统,尝试自己照着书搓一个出来。

环境搭建

基础环境

我们的操作系统在x86平台的Linux下进行编写和运行。编辑器用的VIM。

我的系统是Fedora 36,当然你也可以使用Ubuntu或者其他Linux发行版。不用过于担心,这些发行版之间对本实验接下来的操作影响并不大,仅是包的安装方式不同。如果在安装环境的过程中有任何问题,相信你可以通过搜索引擎来解决。

安装Nasm

访问Nasm官网下载地址

  • https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/linux/

这里我选择nasm-2.16.01-0.fc36.x86_64.rpm这个版本

通过终端进入下载目录,然后执行以下命令进行安装

sudo rpm -ivh nasm-2.16.01-0.fc36.x86_64.rpm

验证是否安装成功:

nasm -v

如果出现版本信息则恭喜你已经成功装上Nasm了

NASM version 2.16.01 compiled on Dec 21 2022

安装KVM&QEMU

KVM是Linux内核的开源虚拟化平台,它对于你的硬件有些要求:

  • 带有 Intel VT-x 的 Intel 处理器或带有 AMD- v 的 AMD 处理器

在编写代码之前请确保你的处理器支持虚拟化技术,你可以通过以下命令验证:

grep -E --color '(vmx|svm)' /proc/cpuinfo

其中vmx扩展是Intel处理器的标志,而svm是AMD处理器的标志。

如果输出的flags中出现上述标志,则说明你的处理器支持虚拟化技术并开启了相应功能。

如果没有,请不要先着急,这不一定意味着处理器不支持该项技术,很大可能是没有开启。请在BIOS相关设置中启用该选项。(至于操作请根据主板型号自行网络搜索)

然后还要检测KVM内核是否已经加载

lsmod | grep -i kvm

依赖检测完成了,接下来就是安装虚拟化主包了

sudo dnf install -y qemu-kvm libvirt virt-install bridge-utils virt-manager

除此之外还要安装一些虚拟化模块

sudo dnf install -y libvirt-devel virt-top libguestfs-tools guestfs-tools

然后启用守护进程

sudo systemctl start libvirtd && sudo systemctl enable libvirtd

最后安装QEMU

sudo dnf install qemu

查看有哪些qemu命令被安装

ls /usr/bin/qemu-*

我们在之后主要使用qemu-system-x86_64这个命令。

此部分由于我的PC已经安装了QEMU,所以仅参考了Fedora官方文档。

HelloWorld

编写代码

如果说我们上来要写什么的话,对于程序员来讲莫过于HelloWorld。所以接下来我们将构建一个最简陋的程序,尽管它不能够被称之为OS,仅在屏幕上输出HelloWorld,但是这个程序具有操作系统的一些基础特性,对我们后面操作来讲仍有巨大意义。

创建一个存放项目的目录,并进入该目录

mkdir myos && cd myos

创建一个汇编文件boot.asm

touch boot.asm

接下来我们要在这个文件中编写汇编代码,在此之前你需要有一个编辑器,它可以是VSCode,也可以是Vim或者其它编辑器(哪个习惯用哪个)。

我们在该文件中编写如下代码

org 07c00h
mov ax,cs
    mov ds,ax
    mov es,ax
    call DispStr
    jmp $

DispStr:
    mov ax,BootMessage
    mov bp,ax
    mov cx,16
    mov ax,01301h 
    mov bx,000ch 
    mov dl,0 
    int 10h 
    ret

BootMessage:    db "Hello, OS World!"
times 510-($-$$) db 0 
dw 0xaa55

我们来对代码进行解释:

  • 在NASM,任何不被[]括起来的标签或变量名都被认为是地址
  • $表示当前行被汇编后的地质,$$表示一个section的开始被汇编后的地址。此程序只有一个section ,所以它也就是程序被编译后开始的地址。
  • $-$$表示本行距离程序开始处的相对距离
  • times 510-($-$$) db 0表示将0重复510-($-$$)遍,也就是在剩下的空间中不断填0,直到程序有510字节。
  • dw 0xaa55结束标志,占2字节,与上面加起来一共512字节

把这段代码编译下,得到一个512字节的boot.bin

nasm boot.asm -o boot.bin

将它写入到镜像

dd if=boot.bin of=boot.img bs=512 count=1

使用QEMU去运行它

qemu-system-x86_64 -fda output.img

现在你可以看到效果了

编写脚本

在编译运行的时候我们并不想要每次都输入这么长的shell命令。所以干脆直接编写个脚本文件,每次需要重新编译运行时,直接执行该文件即可

创建run.sh文件

touch run.sh

使用编辑器编辑文件,内容如下

nasm boot.asm -o boot.bin
dd if=boot.bin of=output.img bs=512 count=1
qemu-system-x86_64 -fda output.img

赋予权限

chmod x+u run.sh

然后运行

./run.sh

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/21539.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IBM 创新方案+SNP数据转型助一汽大众实现数据平稳、高效迁移

近日,IBM 采用基于SNP Bluefield技术迁移的IBM Rapid Move创新数据迁移方案, 成功为一汽-大众实施了企业运营数据系统从 ECC 到 S/4 的升级项目。该项目系统切换耗时仅三天,不仅助客户高效、平稳迁移了系统数据,升级了数据底座,还…

SpringBoot项目打包部署到Nginx【无需配置Nginx】

0.前置知识 springboot打包的项目共分为jar和war两种类型 jar包 jar类型项目使用SpringBoot打包插件打包时,会在打成的jar中 内置一个tomcat 的jar 所以我们可以使用jdk直接运行,将功能代码放到其内置的tomcat中运行。 war包 在打包时需要将 内置的tom…

关于单目视觉 SLAM 的空间感知定位技术的讨论

尝试关于单目视觉 SLAM 的空间感知定位技术的学习,做以调查。SLAM算法最早在机器人领域中提出,视觉SLAM又可以分为单目、双目和深度相机三种传感器模式,在AR应用中通常使用轻便、价格低廉的单目相机设备。仅使用一个摄像头作为传感器完成同步…

prettier 使用详细介绍

prettier 使用详细介绍 prettier是一个代码格式化工具,可以通过自定义规则来重新规范项目中的代码,去掉原始的代码风格,确保团队的代码使用统一相同的格式。 安装 npm i prettier -Dyarn add prettier --dev创建一个prettierrc.*配置文件&…

六级备考28天|CET-6|听力第二讲|长对话满分技巧|听写技巧|2022年6月考题|14:30~16:00

目录 1. 听力策略 2. 第一二讲笔记 3. 听力原文复现 (5)第五小题 (6)第六小题 (7)第七小题 (8)第八小题 扩展业务 expand business 4. 重点词汇 1. 听力策略 2. 第一二讲笔记 3. 听力原文复现 (5)第五小题 our guest is Molly Sundas, a university stud…

learn C++ NO.5 ——类和对象(3)

日期类的实现 在前面类和对象的学习中,由于知识多比较多和碎,需要一个能够将之前所学知识融会贯通的东西。下面就通过实现日期类来对类和对象已经所学的知识进行巩固。 日期类的基本功能(.h文件) //Date.h//头文件内容 #includ…

【数据结构】广度优先遍历(BFS)模板及其讲解

🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【勋章】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🎁定义 🎁遍历方法 🎁根…

什么是边缘计算盒子?边缘计算盒子可以做什么?一文带你了解边缘计算云服务器 ECS

上文,我们已经为大家介绍了什么是边缘计算、边缘计算的诞生、以及边缘计算与CDN之间的关系,感兴趣的小伙伴欢迎阅读以往文章: 边缘计算节点是啥?边缘计算与CDN有什么关系?一文带你了解边缘计算节点BEC(1&am…

nest笔记十一:一个完整的nestjs示例工程(nestjs_template)

概述 链接:nestjs_template 相关文章列表 nestjs系列笔记 示例工程说明 这个工程是我使用nestjs多个项目后,总结出来的模板。这是一个完整的工程,使用了yaml做为配置,使用了log4js和redis和typeorm,sawgger&#…

Elasticsearch 集群部署插件管理及副本分片概念介绍

Elasticsearch 集群配置版本均为8以上 安装前准备 CPU 2C 内存4G或更多 操作系统: Ubuntu20.04,Ubuntu18.04,Rocky8.X,Centos 7.X 操作系统盘50G 主机名设置规则为nodeX.qingtong.org 生产环境建议准备单独的数据磁盘主机名 #各自服务器配置自己的主机名 hostnamectl set-ho…

STM32实现基于RS485的简单的Modbus协议

背景 我这里用STM32实现,其实可以搬移到其他MCU,之前有项目使用STM32实现Modbus协议 这个场景比较正常,很多时候都能碰到 这里主要是Modbus和变频器通信 最常见的是使用Modbus实现传感器数据的采集,我记得之前用过一些传感器都…

学习RHCSA的day.03

目录 2.6 Linux系统的目录结构 2.7 目录操作命令 2.8 文件操作命令 2.6 Linux系统的目录结构 1、Linux目录结构的特点 分区加载于目录结构: 使用树形目录结构来组织和管理文件。整个系统只有一个位于根分区的一个根目录(树根)、一棵树。…

盘点 | 10大类企业管理系统有哪些

人类的发展史也是一部工具的进化史,企业管理手段同样不例外。移动互联网时代给了传统低下的手工操作方式致命一击,应运而生的各类企业管理系统工具为企业管理插上腾飞的翅膀,彻底颠覆了手动低效率的历史,变得更加移动化、智能化。…

求最小生成树(Prim算法与Kruskal算法与并查集)

目录 1、案例要求2、算法设计与实现2.1 Prim算法2.1.1 构造无向图2.1.2 编写Prim算法函数2.1.3 实现代码2.1.4 运行结果截图 2.2 Kruskal算法2.2.1 构造无向图2.2.2 编写并查集UnionFind类2.2.3 编写Kruskal算法2.2.4 实现代码2.2.5 运行结果截图 3、总结 1、案例要求 利用贪心…

低代码与其拓荒,不如颠覆开发行业

目录 一、前言 二、低代码是一个值得信赖的“黑盒子” 粗略总结,开发者对低代码平台所见即所得设计器有两种反应: 三、人人都爱黑盒子 四、用“低代码平台”来开发是什么样的感受? 五、结论 一、前言 在科幻电影中,我们看到…

【OpenCV】C++红绿灯轮廓识别+ROS话题实现

目录 前言 一、背景知识 Opencv轮廓检测 ROS相关知识 二、环境依赖 三、具体实现 Step1:初始化ROS,订阅话题 Step2:接收话题,进入回调 1. 帧处理 2. 膨胀腐蚀处理 Step3:红绿特征处理 1. 提取绘制轮廓 2…

【网络协议详解】——数据链路层协议(学习笔记)

📖 前言:数据链路层是 OSI 模型中的第二层,位于物理层之上,是通信网络中的重要组成部分之一。数据链路层协议负责将网络层传输的数据分组封装成帧,传输到物理层,并通过物理介质进行传输。同时,数…

算法笔记:A2-A4-RSRQ切换算法

1 LTE 切换 LTE切换是移动通信网络中的一个过程,移动设备在保持无间断服务的情况下,将其连接从一个基站切换到另一个基站。当移动设备离开当前基站的覆盖范围或网络资源拥塞时,就需要进行切换。LTE切换通常是基于特定的条件触发的&#xff0…

makefile 学习(1):C/C++ 编译过程

1. GCC 介绍 1.1 介绍 GCC 官方文档 https://gcc.gnu.org/onlinedocs/ 官方文档是最权威的,网上所有的答案都来自官方文档国内论坛参差不齐,找到好的答案比较花时间,并且很容易被错误的文档误导。所以推荐看官方文档靠谱点,并且…

二、数据字典开发

文章目录 二、数据字典开发1、搭建service-cmn模块1.1 搭建service-cmn模块1.2 修改配置1.3 启动类 2、数据字典列表2.1 数据字典列表接口2.1.1 model模块添加数据字典实体2.1.2 添加数据字典mapper2.1.4 添加数据字典controller 2.2 数据字典列表前端2.2.1 添加路由2.2.2 定义…
最新文章