zoukankan      html  css  js  c++  java
  • 操作系统实战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://edu.csdn.net/course/detail/10393
    【新浪微博】 张昺华--sky
    【twitter】 @sky2030_
    【微信公众号】 张昺华
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    k8s采坑记
    [dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。
    亲测可用,iptables实现NAT转发。
    【转】干货,Kubernetes中的Source Ip机制。
    k8s实践
    干货!分享一款windows下的磁盘分析神器。
    干货,不小心执行了rm -f,除了跑路,如何恢复?
    Java8函数式编程
    搭建git服务器
    Python3安装
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/15184165.html
Copyright © 2011-2022 走看看