文章目录

  • 零、Oranges相关资源
  • 一、工作环境和准备工作
  • 二、第一章 马上动手写一个最小的“操作系统”
    • 1. 第一章笔记
    • 2. nasm学习
    • 3. 实际操作
  • 三、第二章 搭建你的工作环境
    • 1. bochs安装和使用步骤
    • 2. bochs调试操作系统

零、Oranges相关资源

在实验过程中,某一节的程序能成功运行后,我会把相关资源放到GitHub上:。目前已经更新完了书中的第一至第七章。


一、工作环境和准备工作

学习环境
Windows(原机) + Ubuntu 12.04.5(Oracle VM VirtualBox虚拟机) + Bochs.2.6.8 + NASM + GCC

环境搭建

  • 我们要在 windows 系统下安装 virtualbox 软件;
  • 之后要用 virtualbox 创建一个虚拟机,并为这个虚拟机安装 ubuntu 系统;
  • 接着启动刚装好的 ubuntu 虚拟机,在其中安装bochs(注意编译时的配置选项,书中有说明,不然将无法进行调试);
  • 最终运行书中的第一个示例

软件& Linux Distribution 版本要求

  • virtualbox:6.0.12
  • ubuntu 镜像:ubuntu-12.04.5-desktop-i386.iso
  • bochsbochs-2.6.8.tar.gz

简要的参考步骤

  • 卸载系统中已有的 virtualbox ,安装最新版本的
    https://www.virtualbox.org/wiki/Downloads

  • virtualbox 创建并安装 Ubuntu 系统,从 http://mirrors.163.com/ubuntu-releases 下载 ubuntu-12.04.5-desktop-i386.iso 镜像进行安装;

  • http://bochs.sourceforge.net/getcurrent.html 下载 bochs 源码 bochs-2.6.8.tar.gz,在 ubuntu 中编译安装 bochs 软件

  • 使用 bximage 创建软驱,调试书上第一个例子。具体书中已经写了。同时参考 http://bbs.21ic.com/blog-1423056-134746.html

书的第一章是简要开头,第二章是准备工作。


二、第一章 马上动手写一个最小的“操作系统”

1. 第一章笔记

书中给出的代码如下:

 org 07c00h          ; 告诉编译器程序加载到7c00处mov    ax, cs          mov ds, ax          ; 使ds,es段寄存器指向与cs相同的段mov    es, axcall  DispStr     ; 调用显示字符串例程jmp  $               ; 无限循环
DispStr:mov ax, BootMessagemov  bp, ax          ; ES:BP = 串地址mov   cx, 16          ; CX = 串长度mov  ax, 01301h      ; AH = 13,  AL = 01hmov   bx, 000ch       ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)mov   dl, 0int    10h             ; 10h 号中断ret
BootMessage:    db  "Hello, OS world!"
times 510-($-$$) db 0   ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw  0xaa55              ; 结束标志

上述代码实际上是一个引导扇区 boot sector它直接在裸机上运行,不依赖于其他软件。当计算机电源被打开后:

  • 计算机先进行加电自检 POST
  • 然后寻找启动盘,如果是选择从软盘打开,BIOS会检查软盘的 00 磁道 1 扇区,如果发现该扇区是以 0xaa55 结束,则BIOS认为它是一个 boot sector
  • 一旦BIOS发现了引导扇区,就会将这 512 字节的内容装载到内存地址 0000:7c00 处,然后跳转到 0000:7c00 处将控制权彻底交给这段引导代码;
  • 此后,计算机不再由BIOS控制,而是由操作系统的一部分来控制。

部分指令说明:

  • org 伪指令,用来规定程序存放单元的偏移量,如果在源程序的第一条指令使用了这样的指令如 org 2000h ,则汇编程序会把 ip 设为 2000h ,程序的第一个字节存放到 2000h 处,然后依次顺序存放后面的内容,直到遇到另一个 org
  • times 510-($-$$) db 00 字节重复 510-($-$$) 次。

2. nasm学习

本书使用的是 nasm 的语法(The Netwide Assembler) ,NASM是目前唯一开源免费的汇编器,和MASM一样遵从Intel语法,指令集、语法规则几乎完全相同。

实模式编程:Linux和Windows运行在x86的机器上,都是运行在保护模式下的,因此我们需要将编译好的实模式程序写进虚拟硬盘的主引导扇区,然后由虚拟机启动来观察程序运行效果。

masm 的区别在于:

  • nasm 中任何不被方括号 [] 括起来的标签和变量名都是地址;访问标签中的内容必须用 [] ;因此不需要 offset 关键字;
  • nasm 中,变量和标签是一样的,下面两条语句是等价的:
    foo dw 1
    foo : dw 1
    
  • nasm 中的 $ 是当前语句的地址;$$ 是本节 section 的起始语句的地址。
  • nasm 中使用 section 表示一段代码,后面跟一个段的名称(自定义)和段属性。nasm 的标准段包括 section .data / section .text / section .bss ,它们默认包含 vstart = 0 的语义,即段内的指令和标号的汇编地址都是段内偏移地址。

先安装 nasm ,然后使用 nasm 编译上述的代码,我们就得到了一个 512 字节的 boot.bin 代码:

sudo apt-get install nasm
nasm boot.asm -o boot.bin

其他nasm指令参见nasm中文手册。


3. 实际操作

我的机器没有软驱,所以要创建一个虚拟软盘。由于 VirtualBox 不能像创建虚拟空白硬盘一样创建虚拟软盘,而只能选择一个已有的虚拟软驱 .img ,所以要先创建一个基于编译得到的 boot.bin 的虚拟软盘。 命令如下:

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

这条命令创建出一个大小为 512B ,名为 floppy.img ,写入了 boot.bin 的虚拟软盘镜像。其中 boot.bin 是读取位置,floppy.img 是写入位置。

为了实现像书中一样的效果,可以在 VirtualBox 里创建一个 MyOS 虚拟机。点击新建后,过程中要改动的默认设置有:操作系统和版本都选择 Other ,内存大小选 4 mb ,不创建虚拟硬盘。

建成后不要启动,还需要进行设置:

  • 选中建好的 MyOS ,点击设置 ,在系统中启动顺序只在软驱上打
  • 存储中,选择添加软盘控制器,然后添加虚拟软驱,选择文件夹下的 floppy.img ,点击OK
  • 这时虚拟机 MyOS 就完成了,启动后画面如下:

这样,第一章就完成了。


三、第二章 搭建你的工作环境

如果一直使用虚拟软盘,太麻烦了,所以我们需要使用 bochs 搭建工作环境。

书中分别介绍了 windowslinux 的安装过程,我这里虽然是 windows 的机器,但是全部过程都在 linux 虚拟机中完成。

尽管如此,为了使用实验提供的环境和程序源代码,我开启了VGA增强功能,创建了一个共享文件夹,用于主机和虚拟机的信息交换。

1. bochs安装和使用步骤

这一部分折腾了我许久,书中的一些配置现在已经不适合了,出现了许多错误。

① 预装相关程序和库:

sudo apt-get install build-essential xorg-dev libgtk2.0-dev

② 安装前的配置命令:(在 root 用户下)

./configure --with-x11 --with-wx --enable-debugger --enable-disasm --enable-all-optimizations --enable-readline --enable-long-phy-address --enable-debugger-gui

③ 编译安装

make
make install

④ 将 bochs2.6.8 目录下的 bios 文件夹中的全部内容复制到 /usr/share/bochs 目录中,没有 bochs 文件夹的话需要自己创建。

⑤ 设置配置文件。这一步相当重要,如果没有设置好的话,就会出现各种各样的错误:

###############################################################
# Configuration file for Bochs
################################################################ how much memory the emulated machine will have
megs: 32# filename of ROM images
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest# what disk images will be used
floppya: 1_44=a.img, status=inserted# choose the boot disk.
boot: floppy# where do we send log messages?
log: bochsout.txt# disable the mouse
mouse: enabled=0# enable key mapping, using US layout as default.
keyboard:  keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map

上面是我的配置文件 bochsrc 。如果照着书中的配置的话,会出现一些错误:

  • 运行bochsrc时,出现错误 ROM: couldn't open ROM image file '/usr/share/bochs/BIOS-bochs-latest' ,要将第 9 行的 romimage: file=/usr/share/bochs/BIOS-bochs-latest 改为 romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
  • 运行bochsrc时,出现错误 bochsrc:10: vgaromimage directive malformed ,要将 bochsrc 文件中第 10 行的 vgaromimage: /usr/share/vgabios/vgabios.bin 改为 vgaromimage: file=/usr/share/vgabios/vgabios.bin 或者改为我给出的配置文件中的形式,具体视 bochs/bios 中的内容和自己的文件夹组织方式而定;
  • 运行时出现关于 keymap 的错误如:

    需要将文件最后一行的 keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map 改为 keyboard: keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map

⑥ 利用 bximage 生成软盘映像,在第一步提示中输入 fd 即可。具体可以参照书中描述。

⑦ 将引导扇区 boot.bin 写入虚拟软盘:

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

⑧ 运行 bochs

  • 启动 bochs

    bochs
    
  • 默认选择 [6] ,因此回车即可,然后弹出一个黑框,无内容:
  • 此时在终端中键入 c 并回车就会执行:

2. bochs调试操作系统

运行的是一个有调试功能的 bochs ,启动后会出现若干选项,一般默认为 6. Begin simulation ,直接按回车键就可以了。不过之后 bochs 没有直接进入运转,而是给出了一个提示符,等待输入。

此时,如果要调试的话,可以设置断点、查看CPU寄存器、查看某个内存地址的内容等。具体过程见书。

一些常用的命令如下:

【操作系统】Oranges学习笔记(一) 第一章、第二章相关推荐

  1. Learning Perl学习笔记(1)第二章Scalar Data

    If Control Structure(IF循环) 脚本如下: #!/usr/bin/perl use warnings; use strict; use v5.24; my $line = < ...

  2. MYSQL学习笔记(自用) 第二章

    第二章 第一节. 内连接| Inner joins[在多张表格中检索数据] SELECT order_id, orders.customer_id, first_name, last_name FRO ...

  3. 《计算机网络——谢希仁》学习笔记(6)~~第二章 2.3 2.4 2.5

    <<计算机网络(第7版)>>--谢希仁版本的学习笔记,分享给大家进行参考,希望大家指出不足之处 此书个人感觉第七,第八版相差不大,均可进行学习. ps:许多感觉比较细节的文字是 ...

  4. 【学习笔记】编译原理 第二章 文法和语言

    以下为参考课件与<编译技术>(张莉等著)的个人整理,若有错误欢迎指出 第二章 文法和语言 文章目录 第二章 文法和语言 一.文法的非形式讨论 二.文法的形式定义 1.文法的形式定义 2.推 ...

  5. fast.ai 深度学习笔记:第一部分第二课

    原文:Deep Learning 2: Part 1 Lesson 2 作者:Hiromi Suenaga 论坛 笔记本 回顾上一课 [01:02] 我们使用 3 行代码来构建图像分类器. 为了训练模 ...

  6. Java 学习笔记:第一章 Java入门

    Java 学习笔记:第一章 Java入门 1.1 计算机语言发展史以及未来方向 1.2 常见编程语言介绍 C语言 C++ 语言 Java语言 PHP 语言 Object-C和Swift 语言 Java ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...

    Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 原文:Introduction to 3 ...

  8. 网易云课堂[Web安全工程师]第一部分 第二章WEB简介 学习记录

    [仍旧写在前面 个人学习笔记] 第一部分 WEB基础知识 第二章 WEB基础知识 第一节 前端开发基础--HTML课后小测验 1 HTML页面的注释符号是那种?<!-- --> 2 若要在 ...

  9. PMBOK(第六版) 学习笔记 ——《第一章 引论》

    系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...

最新文章

  1. Effective C++ 11 在operator=中处理“自我赋值” 笔记
  2. 《2020总结-2021展望》
  3. 使用Custom.pll修改标准Form的LOV
  4. MBR的Linux分区机制启动过程,linux系统启动流程(MBR)
  5. 多媒体交互应用基础(11)
  6. 面向过程和面向对象的本质理解
  7. mysql主从注意事项_mysql主从复制亲测,以及注意事项
  8. shiro使用WebService进行验证的实现
  9. 利用stringBuilder操作html文件
  10. 分水岭算法(Watershed)
  11. (十:2020.08.28)CVPR 2018 追踪之论文纲要(译)
  12. QT5安装自己下载的mingw32及一些常见报错解决
  13. 计算机微信接收excel打不开怎么回事,微信打不开收到的Excel
  14. LOJ 6198. 谢特(后缀数组+可持久化Trie)
  15. Mac 重启后,连接不上wifi
  16. 《那些年啊,那些事——一个程序员的奋斗史》——50
  17. python如何获取星期几
  18. tp3.2版本路由设置
  19. 1,9,49,125,81,() 或 1 9 49 125 81 ()
  20. 线程同步小例子:12306订票

热门文章

  1. 上证指数30年k线图_寻找上证指数二十年K线图的规律
  2. DIY制作示波器的超详细教程:(二)电路才是“硬”道理——硬件电路简述
  3. 记录windows上的VSCODE 远程到linux编译代码机器上的一些问题
  4. 《抽样技术》第2章 简单随机抽样(SRS)
  5. linux跑wrf.exe程序的前提,WRF模式上机手册
  6. 信捷plc485通信上位机_【新阁教育】穷学上位机系列——搭建STEP7仿真环境
  7. 《思考的技术》笔记一
  8. 打造IBM 的F11一键恢复系统
  9. Windows10开机执行自动拨号
  10. Do you want them to be removed from the project too?