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

news2024/11/27 0:40:43

从零制作操作系统——环境搭建以及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.coloradmin.cn/o/538025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

码云(Gitee)与Git配置

前提 本文配置的前提是已经申请好了码云(gitee)的账号和电脑上已经安装好了git 1.配置gitee的ssh公钥 在gitee的个人设置里面配置ssh公钥 就是将公钥复制到右侧的框中, 并点击确定即可。 1.1生成ssh公钥 右键鼠标打开git bash here 输入如下命令,邮箱就填自己…

栈与队列的对决:如何用栈实现队列?

本篇博客会讲解力扣“232. 用栈实现队列”的解题思路,这是题目链接。 先来审题: 以下是输出示例: 以下是提示和进阶: 栈是一种后进先出的数据结构,而队列是一种先进先出的数据结构,如何用栈实现队列呢&…

chatgpt赋能Python-pingouin_python

了解Pingouin Python对数据分析和统计学的优势 介绍Pingouin Python Pingouin Python是一个强大的Python包,它提供了在数据分析和统计学中所需的一些主要函数。使用Pingouin Python可以方便地进行t-检验、方差分析、相关性等常用的数据分析和统计学任务。 此外&a…

Vue组件复杂表格高级编辑功能

Vue 组件复杂表格高级编辑功能 文章目录 Vue 组件复杂表格高级编辑功能1. sync 父子组件数据同步更新2. 在 el-table 中开发高级编辑表格功能3. 参考文献 在vue中组件的定义是希望组件可以做单一的功能,做到高复用,低耦合,所以父子组件之间的…

【每日一题/简单模拟题】2446. 判断两个事件是否存在冲突

⭐️前面的话⭐️ 本篇文章介绍【2446. 判断两个事件是否存在冲突】题解,算法标签:【模拟】,【字符串】,展示语言c/java。 📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞&#x…

某大学信息安全竞赛——栈迁移加强版——只溢出0x8,无限ROP

芝士题目: 链接:https://pan.baidu.com/s/1uwFlcSg94MuC2tPi-HCb9w 提取码:joj6 感悟: 之前我只做过溢出超过0x10这样的栈迁移,思路就是找机会去泄露栈空间的地址然后把栈迁移到我们可以控制的栈空间,亦…

Linux_证书_Openssl工具详解

文章目录 OpenSSLopenssl实现对称加密openssl生成密钥对、非对称加密、数字签名根据CA颁布证书生成ca私钥和ca证书根据ca生成证书 小结 OpenSSL OpenSSL 是一个开源项目,其组成主要包括一下三个组件: openssl:多用途的命令行工具 libcrypt…

【滤波专题-第7篇】“类EMD”算法分解后要怎样使用(3)——EMD降噪方法及MATLAB代码实现

使用EMD分解(以及其他“类EMD”分解方法,以下为了简便统称EMD)做信号降噪,是EMD的一个比较重要的应用方向。EMD可以将复杂的信号分解为一系列的固有模态函数(IMFs),每一个IMF都包含了信号的一部…

“源擎”攻破银行核心系统建设痛点

银行业作为操作密集、数据密集、风险密集的行业,在向云转型的过程中面临着诸多独特的挑战,如银行需要具备不间断的业务创新能力,而不被系统开发周期制约;单一系统的开发和升级方式,越来越难以满足日益综合化的业务创新…

chatgpt赋能Python-pycharm关联python

Pycharm关联Python的介绍 Pycharm是一种非常流行的Python集成开发环境,开发人员可以在其中编写、调试和运行Python代码。Pycharm具有许多有用的功能,这些功能可以大大提高代码的效率和质量。其中一个最重要的功能是Pycharm如何关联Python,这…

HTB靶机012-Valentine-WP

012-Valentine 靶机IP:10.10.10.79 Scan nmap端口扫描: ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 10.10.10.79 -F Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-29 00:47 CST Nmap scan report for 10.10.10.79 Host is up (0.30s…

chatgpt赋能Python-pycharm和python关联

PyCharm与Python:超越代码编写的完美结合 如果你是一位Python开发者,那么你肯定需要一个好用的开发环境,以便快速且高效地完成代码任务。而PyCharm就是这样一个优秀的Python开发IDE。它专注于提高Python开发速度和质量,让Python编…

Flowable 生成的表都是干嘛的?(一)

一.简介 Flowable 默认一共生成了 79 张数据表,了解这些数据表,有助于我们更好的理解 Flowable 中的各种 API。 接下来我们就对这 79 张表进行一个简单的分类整理。 ACT_APP_*(5)ACT_CMMN_*(12)ACT_CO_*…

chatgpt赋能Python-pycharm取消所有断点

Pycharm取消所有断点:提高编程效率的必备技巧 Pycharm作为Python程序员必备的开发工具之一,其强大的调试功能广受好评。但是,在开发过程中,我们可能会设置过多的断点或者设置了错误的断点,这样会让程序的运行速度变慢…

Java面向对象程序设计实验报告(实验四 抽象类的练习)

✨作者:命运之光 ✨专栏:Java面向对象程序设计实验报告 ​ 目录 ✨一、需求设计 ✨二、概要设计 ✨三、详细设计 ✨四、调试结果 ✨五、测试结果 ✨附录:源程序代码(带注释) demo4类 Car类 Circle类 Shape…

谷歌chrome浏览器无法自动播放video标签视频的问题

问题根源详见:Chrome中的自动播放政策>> https://developer.chrome.com/blog/autoplay/ The Autoplay Policy launched in Chrome 66 for audio and video elements and is effectively blocking roughly half of unwanted media autoplays in Chrome. For t…

基于数组实现的顺序表(SeqList)

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。 它的详细定义如下: 顺序表是一种数据结构,用于存储一组具有相同数据类型的元素,并按照元素在内存中的…

数据库【库,表操作】

目录 简单了解1.连接数据库服务器2.创建数据库3.创建表4.使用数据库5.数据库框架6.SQL的分类7.存储引擎 库操作1.创建数据库2.查看系统默认字符集以及校验规则3.查看数据库支持的字符集和校验规则4.查看数据库5.显示数据库语句6.删除数据库7.修改数据库8.备份和恢复9.查看连接情…

20 SQL——多表查询 (消除无效笛卡尔积)

create table dept(id int primary key auto_increment,name varchar(15))comment 部门;insert into dept(id, name) values (1,研发部),(2,市场部),(3,财务部),(4,销售部),(5,总经办),(6,人事部);create table staff (id int primary key auto_increment commentID,name …

【面试篇】Redis持久化面试题

文章目录 Redis持久化🙎‍♂️面试官:什么是Redis持久化? AOF日志AOF日志原理🙎‍♂️面试官:AOF日志是怎么工作的/AOF写入磁盘的流程?🙎‍♂️面试官: 刚刚说到了Redis先执行写入的…