【操作系统】Oranges学习笔记(一) 第一章、第二章
文章目录
- 零、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
bochs
:bochs-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会检查软盘的
0
面0
磁道1
扇区,如果发现该扇区是以0xaa55
结束,则BIOS认为它是一个boot sector
; - 一旦BIOS发现了引导扇区,就会将这
512
字节的内容装载到内存地址0000:7c00
处,然后跳转到0000:7c00
处将控制权彻底交给这段引导代码; - 此后,计算机不再由BIOS控制,而是由操作系统的一部分来控制。
部分指令说明:
org
伪指令,用来规定程序存放单元的偏移量,如果在源程序的第一条指令使用了这样的指令如org 2000h
,则汇编程序会把ip
设为2000h
,程序的第一个字节存放到2000h
处,然后依次顺序存放后面的内容,直到遇到另一个org
。times 510-($-$$) db 0
将0
字节重复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
搭建工作环境。
书中分别介绍了 windows
和 linux
的安装过程,我这里虽然是 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学习笔记(一) 第一章、第二章相关推荐
- Learning Perl学习笔记(1)第二章Scalar Data
If Control Structure(IF循环) 脚本如下: #!/usr/bin/perl use warnings; use strict; use v5.24; my $line = < ...
- MYSQL学习笔记(自用) 第二章
第二章 第一节. 内连接| Inner joins[在多张表格中检索数据] SELECT order_id, orders.customer_id, first_name, last_name FRO ...
- 《计算机网络——谢希仁》学习笔记(6)~~第二章 2.3 2.4 2.5
<<计算机网络(第7版)>>--谢希仁版本的学习笔记,分享给大家进行参考,希望大家指出不足之处 此书个人感觉第七,第八版相差不大,均可进行学习. ps:许多感觉比较细节的文字是 ...
- 【学习笔记】编译原理 第二章 文法和语言
以下为参考课件与<编译技术>(张莉等著)的个人整理,若有错误欢迎指出 第二章 文法和语言 文章目录 第二章 文法和语言 一.文法的非形式讨论 二.文法的形式定义 1.文法的形式定义 2.推 ...
- fast.ai 深度学习笔记:第一部分第二课
原文:Deep Learning 2: Part 1 Lesson 2 作者:Hiromi Suenaga 论坛 笔记本 回顾上一课 [01:02] 我们使用 3 行代码来构建图像分类器. 为了训练模 ...
- Java 学习笔记:第一章 Java入门
Java 学习笔记:第一章 Java入门 1.1 计算机语言发展史以及未来方向 1.2 常见编程语言介绍 C语言 C++ 语言 Java语言 PHP 语言 Object-C和Swift 语言 Java ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...
Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 原文:Introduction to 3 ...
- 网易云课堂[Web安全工程师]第一部分 第二章WEB简介 学习记录
[仍旧写在前面 个人学习笔记] 第一部分 WEB基础知识 第二章 WEB基础知识 第一节 前端开发基础--HTML课后小测验 1 HTML页面的注释符号是那种?<!-- --> 2 若要在 ...
- PMBOK(第六版) 学习笔记 ——《第一章 引论》
系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...
最新文章
- Effective C++ 11 在operator=中处理“自我赋值” 笔记
- 《2020总结-2021展望》
- 使用Custom.pll修改标准Form的LOV
- MBR的Linux分区机制启动过程,linux系统启动流程(MBR)
- 多媒体交互应用基础(11)
- 面向过程和面向对象的本质理解
- mysql主从注意事项_mysql主从复制亲测,以及注意事项
- shiro使用WebService进行验证的实现
- 利用stringBuilder操作html文件
- 分水岭算法(Watershed)
- (十:2020.08.28)CVPR 2018 追踪之论文纲要(译)
- QT5安装自己下载的mingw32及一些常见报错解决
- 计算机微信接收excel打不开怎么回事,微信打不开收到的Excel
- LOJ 6198. 谢特(后缀数组+可持久化Trie)
- Mac 重启后,连接不上wifi
- 《那些年啊,那些事——一个程序员的奋斗史》——50
- python如何获取星期几
- tp3.2版本路由设置
- 1,9,49,125,81,() 或 1 9 49 125 81 ()
- 线程同步小例子:12306订票
热门文章
- 上证指数30年k线图_寻找上证指数二十年K线图的规律
- DIY制作示波器的超详细教程:(二)电路才是“硬”道理——硬件电路简述
- 记录windows上的VSCODE 远程到linux编译代码机器上的一些问题
- 《抽样技术》第2章 简单随机抽样(SRS)
- linux跑wrf.exe程序的前提,WRF模式上机手册
- 信捷plc485通信上位机_【新阁教育】穷学上位机系列——搭建STEP7仿真环境
- 《思考的技术》笔记一
- 打造IBM 的F11一键恢复系统
- Windows10开机执行自动拨号
- Do you want them to be removed from the project too?