操作系统实战45讲01:运行HelloOS【转】
转自:https://blog.csdn.net/chenchengwudi/article/details/116707122
目录
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参数设置是否正确
————————————————
版权声明:本文为CSDN博主「麦兜的学习笔记」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chenchengwudi/article/details/116707122
原文地址:https://www.cnblogs.com/sky-heaven/p/15184165.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 中解决Viewpage调用notifyDataSetChanged()时界面无刷新的问题
- 基于自定义Toast全面解析
- Android中DialogFragment自定义背景与宽高的方法
- Android 常用log 关键字
- Android PopWindow 设置背景亮度的实例
- ubuntu20.04设置静态ip地址(包括不同版本)
- LayoutAnimation给ListView中的item设置动态出场效果(实例)
- android studio2.3如何编译动态库的过程详解
- Android RecyclerView设置下拉刷新的实现方法
- Android 动态添加view或item并获取数据的实例
- Centos7实现MySQL基于日志还原数据的示例代码
- Android 三种延迟操作的实现方法
- 基于Android在布局中动态添加view的两种方法(总结)
- Android向node.js编写的服务器发送数据并接收请求
- Android startActivityForResult和setResult的区别