操作系统实战45讲01:运行HelloOS
目录
1. HelloOS说明
1.1 HelloOS构成
1.2 HelloOS编译
2. 部署HelloOS
2.1 设置grub进入引导菜单
2.2 增加HelloOS启动选项
2.3 启动HelloOS
1. HelloOS说明
1.1 HelloOS构成
HelloOS为极客时间《操作系统实战45讲》中引入的示例OS,在L02中由如下文件构成,
各文件内容简介如下,
① entry.asm
供grub调用的引导程序,用于设置CPU工作模式与工作环境,并调用C语言编写的main函数
② main.c
实现main函数,此处用于打印字符串
③ vgastr.c / vgastr.h
实现字符串在显示器上的输出
说明1:写入字符ASCII码的目标地址为0xb8000起始的内存,映射到该地址的,是显卡字符模式下的显存
说明2:每显示一个字符将p_strdst + 2,是因为显存中每个字符对应2B,分别为字符编码和字符显示属性
参考资料:关于在显卡文本模式下输出字符,可参考下文的chapter 2
https://blog.csdn.net/chenchengwudi/article/details/116066133
④ hello.lds
链接器脚本,用于指导链接过程,设定不同程序段的布局
⑤ Makefile
编译脚本,用于指导编译过程
1.2 HelloOS编译
HelloOS编译过程如下图所示,
说明1:nasm汇编器
X86体系结构的汇编语言编译器有多种,如MASM / FASM / TASM / AS86 / NASM等,此处使用的nasm汇编器有如下特点,
① 开源免费(有些汇编语言编译器是需要付费的)
② 支持多种操作系统平台
③ 允许汇编语言源程序中只包含指令(作为对比,MASM编译器需要在源程序中定义很多组件才能开始编程)
Ubuntu中默认未安装nasm汇编器,可使用如下命令安装,
sudo apt-get install nasm
说明2:链接器-map选项
在Makefile中,在链接生成HelloOS.elf时,使用了-map选项
该选项将使得在链接过程中,生成链接布局文件,通过该文件可知HelloOS的内存映射布局
编译HelloOS时生成的map文件如下图所示,
2. 部署HelloOS
说明:实验环境为VMware + Ubuntu 16.04
2.1 设置grub进入引导菜单
我们将HelloOS作为一个操作系统启动项供grub启动,因此需要能够在PC启动时进入grub引导菜单,并选择启动HelloOS
为了能够每次启动时进入grub引导菜单,需要进行如下设置
① 修改/etc/default/grub
a. 注释掉HIDDEN所在的2行
b. 将GRUB_TIMEOUT设置为30(使用默认值10其实也可以)
c. 将GRUB_CMDLINE_LINUX_DEFAUL设置为text
参考资料:https://jingyan.baidu.com/article/6dad50755e35d1a123e36ecc.html
② 执行如下命令,更新grub配置
sudo update-grub
2.2 增加HelloOS启动选项
修改/boot/grub/grub.cfg,增加HelloOS启动项
说明1:set root属性需要根据实际情况填写,应填写/boot目录所在分区,可使用df命令查看
mount命令也可查看
说明2:关于insmod part_msdos & insmod ext2的设置
此处需要加载的模块信息,可以参考系统已有的启动项设置
此处参考的是实验用虚拟机中默认启动Ubuntu的menuentry,这样可以确保依据不同实验平台设置一致
比如对于使用GPT分区表的实验环境,需要加载insmod part_gpt模块
2.3 启动HelloOS
此时重启虚拟机,便可见到HelloOS启动项
选择该启动项,即可启动HelloOS
说明:在grub的命令行模式可以查看硬盘分区信息
在进入grub引导菜单后,按下'c'键可以进入命令行模式
在grub的命令行模式中,使用ls命令可以查看硬盘分区信息
使用ls命令也可以验证set root参数设置是否正确
操作系统实战45讲01:运行HelloOS相关推荐
- 操作系统实战 45 讲:运行HelloOS界面
目录 一.运行要求 二.开始运行 三.重启linux 细节补充 一.运行要求 实验环境VMware + Ubuntu18.04 安装gcc,nasm,make 命令为:sudo apt-get ins ...
- MySQL实战45讲学习笔记
文章目录 MySQL实战45讲-学习笔记 01 基础架构:一条SQL查询语句是如何执行的? mysql逻辑架构 连接器 查询缓存 分析器 优化器 执行器 02 日志系统:一条SQL更新语句如何执行 r ...
- mysql 实战 45讲 学习笔记 基础知识 原理剖析
MySQL 实战45讲 持续更新中~ 00讲 开篇 我们知道如何写出逻辑正确的SQL语句来实现业务目标,却不确定这个语句是不是最优的 我们听说了一些使用数据库的最佳实践,但是更想了解为什么这么做 我们 ...
- MySQL 实战45讲--笔记
文章目录 MySQL 实战45讲-->笔记 开篇词 基础篇(8讲) 01 | 基础架构:一条SQL查询语句是如何执行的? 1.1 SQL 语句在 MySQL 的各个功能模块中的执行过程. 依次看 ...
- 《Mysql实战45讲》学习笔记 1-22
Mysql <Mysql实战45讲> 1.一条sql查询语句是如何执行的 Server层: 连接器,查询缓存,分析器,优化器,执行器 存储引擎层: 负责数据的存储和提取 (Innodb, ...
- mysql实战45讲(15-22)
mysql实战45讲学习笔记 15 日志与索引的关系 15.1 日志 1,分析一下在两阶段提交的不同时刻,MySQL 异常重启会出现什么现象. 如果在图中时刻 A 的地方,也就是写入 redo log ...
- 《MySQL实战45讲》——学习笔记12 “InnoDB刷脏页的控制策略“
本篇介绍MYSQL InnoDB的WAL机制带来的小问题--利用WAL技术,数据库将随机写转换成了顺序写,大大提升了数据库的性能,但也带来了内存脏页的问题: 脏页会被后台线程自动flush,也会由于数 ...
- 《MySQL实战45讲》——学习笔记01-03 “MySQL基本架构、日志系统、事务隔离“
最近有新闻说"丁奇"炒股失败欠债,赶紧去极客时间买了他的<MySQL 实战 45 讲>以防下架,顺带重新系统的复习下MYSQL相关知识,记录下学习笔记: 本篇介绍: M ...
- MySQL实战45讲——MySQL是怎么保证数据不丢的?
文章摘抄自林晓斌老师<MySQL实战45讲>.今天这篇文章, 我会继续和你介绍在业务高峰期临时提升性能的方法. 从文章标题"MySQL是怎么保证数据不丢的? ", 你就 ...
最新文章
- python启动appium服务_python下appium服务的自启动和关闭
- 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------剑指offer系列
- win10 输入法不见了、繁体 问题解决
- WGAN的提出背景以及解决方案
- poj 1041(欧拉回路+输出字典序最小路径)
- Oracle Long类型转换为Clob类型
- 想都不敢想!这8个神奇“黑科技”原来已经有人弄出来了
- linux内核源码目录分析
- c#设计模式-适配器模式
- fedora27 GPaste
- 基于QT和DCMTK的Dicom 图像浏览器---收尾
- 牛客小白月赛2 H 武 【Dijkstra】
- 今天是星期一,两天后是星期三,5天后是星期六;今天是星期六,3天后是星期二。
- VScode 删除远程资源管理器中SSH TARGETS
- 谈谈令你印象深刻的技术问题
- 高通平台做GSI测试时,开机重启失败问题
- C# 终本案件、综合执行人、裁判文书爬虫
- 给找工作的同学一点参考
- 数据分享|R语言关联规则挖掘apriori算法挖掘评估汽车性能数据
- SolidCAM 2020 基础到五轴 车铣 编程视频教程 2021教程
热门文章
- Python Web项目自定义虚拟环境
- Spring Cloud Stream与RabbitMQ 死信队列
- java中final语句_Java中使用非final变量的不可访问语句
- mysql 事务日志备份_SQL Server恢复模式与事务日志备份
- javaSE----进制
- java鸟_java飞扬的小鸟
- ideadebug热更新_Spring Boot 在IDEA中debug时的hot deployment(热部署)
- ssh协议是osi_你见过这份864页神仙级的TCP/IP协议吗?,太香了!
- MYSQL8.0 排序查询报错 this is incompatible with sql_mode=only_full_group_by
- Kotlin 1.2 有哪些新特性