Skip to content

Commit fe7fc26

Browse files
committed
format modify
1 parent f25fd2d commit fe7fc26

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

source/_posts/2018-8-os1.md

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ tags:
66
- 汇编
77
author: Lin
88
---
9-
## 0x00 开宗明义
9+
# 0x00 开宗明义
1010
对OS的兴趣一直都有。最近比较强。因为5月份广东红帽杯被血虐,想补强下二进制方面。后来发现自己之前的相关知识深度还不够,继续深入时,好多东西和OS绕不开。所以,在原来的基础上补下OS。写个OS这种标题,有点标题党,只是给自己定的一个目标。最终完成的功能包含以下,不能对比现在的Linux这种大型成熟的OS。
1111
* 启动
1212
* 基本的内存管理
@@ -30,9 +30,11 @@ author: Lin
3030

3131
这里,会着重从加载开始。有必要学习下汇编。所以,加载器我会自己写,参考的两本书,关于加载器的有些细节,没有说明,我会尽可能把自己已理解的说出来。我还专门买了本 Professional Assembly Language的中译本,来作为At&t汇编的参考。
3232

33-
## 0x01 加载器
33+
# 0x01 加载器
3434
加载器是OS启动的第一步。在使用PC的日常中,会出现磁盘主引导坏掉的情况,电脑会提示,No boot loader found。
35-
![Alt text](/images/1530951823888.png)
35+
36+
![Alt text](/images/1530951823888.png)
37+
3638
这是在Virtualbox里,找不到引导时的提示。结果就是OS启动不了了。
3739
加载器是什么:
3840
加载器是位于磁盘第一个扇区的特殊程序,它由BIOS加载,它负责加载OS的代码到特定位置,然后把执行权交给OS的初始化代码。
@@ -65,8 +67,10 @@ BIOS是为加载器的执行提供了环境。没有这个环境的话,加载
6567
定加载器之前,熟悉下执行环境。
6668
我使用的工具是bochs,可以调试OS,很牛的一个模拟器。
6769
我是自己编译的,安装在/opt目录下,不影响系统。
68-
![Alt text](/images/1530955947696.png)
69-
![Alt text](/images/1530955971227.png)
70+
71+
![Alt text](/images/1530955947696.png)
72+
![Alt text](/images/1530955971227.png)
73+
7074

7175

7276
看到了吧。
@@ -94,8 +98,9 @@ BIOS是为加载器的执行提供了环境。没有这个环境的话,加载
9498
times 510-($-$$) db 0
9599
dw 0xaa55
96100
```
97-
参考书里第一个代码,去掉了开头的org 0x7c00,不引用字符串的地址和调用函数DispStr。修改后的代码,调用int 10h的中断在屏幕上显示一个a,对应的ASCII是97.运行后,屏幕上成功出现了一个字母a。说明理解是对的。
98-
![Alt text](/images/1530968051043.png)
101+
参考书里第一个代码,去掉了开头的org 0x7c00,不引用字符串的地址和调用函数DispStr。修改后的代码,调用int 10h的中断在屏幕上显示一个a,对应的ASCII是97.运行后,屏幕上成功出现了一个字母a。说明理解是对的。
102+
![Alt text](/images/1530968051043.png)
103+
99104

100105
如果想显示一个字符串呢。
101106
先分析下这段代码,
@@ -136,8 +141,8 @@ ld -o hello.bin --oformat=binary hello.o
136141
dd if=hello.bin of=hello.img bs=512 count=1
137142
dd if=/dev/zero of=hello.img skip=1 seek=1 bs=512 count=2879
138143
```
139-
生成的hello.img就是一个虚拟的软盘。加载到bochs里,就能显示出字符串了
140-
![Alt text](/images/1531017963301.png)
144+
生成的hello.img就是一个虚拟的软盘。加载到bochs里,就能显示出字符串了
145+
![Alt text](/images/1531017963301.png)
141146
有兴趣的话,可以多显示一些。定字符串时的地址使用的是绝对,担心和代码段有冲突,将ds值置为1,使用的内存是
142147
0x0001:0x0000 - 0x0001:0xffff
143148
内存里的变量,严格来说都是数据,Intel实模式下,就是这样的规则。
@@ -148,4 +153,4 @@ dd if=/dev/zero of=hello.img skip=1 seek=1 bs=512 count=2879
148153
cs,就是代码段的段地址。它配合ip寄存器,指示了下个指令的位置。跳转时,如果是远跳转的话,cs寄存器的值也是会变的,但其他情况下,我们不会修改这个寄存器。
149154
ds,数据段。这个比较自由。想把数据存在什么位置,都可以直接操作它。极端来说,我们可以设置ds的值和cs同段,把当前的代码修改掉。有点像二进制里的控制流劫持一样。为什么能这样做呢?因为实模式里没有任何保护机制。这也是后面保护模式优势。在编写汇编代码时,程序员要对内存的布局非常清楚,哪段内存是什么样的用途,要不然,自己把自己玩死了。
150155
ss, 栈段。这个段是用来设置栈的。设置了它之后,再设置下sp和bp,就手动建立起来了一个栈。当然程序里可以有多个栈。切换到不同栈时,正确设置ss,sp, bp的值就可以了。
151-
gs,fs,es,额外段。8086提供的备用的段。除了在个别命令中有特别用途,这个程序员可以随便用。
156+
gs,fs,es,额外段。8086提供的备用的段。除了在个别命令中有特别用途,这个程序员可以随便用。

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy