这个跟考试一毛钱关系没有 纯个人爱好 考试党划走
Linux 8086映像
3.1Intel 8086寄存器
INTEL处理器通常有十六个寄存器 他们之间可以相互做运算
3.2 8086的内存访问
内存的数据交换
内存和寄存器通过16根地址线建立数据的交换,数据线的宽度和寄存器的宽度相等
注意观察低地址和高地址的写法
取指令和执行指令
- 第一条指令的操作码 A1代表这是一个传送的指令代表讲000C位置的数存放在AX寄存器中,
- 第二条指令0306操作码代表是一个加法指令 第一个加数是AX中的值 结果也存放在AX中
- 相加的结果是14C7所以AX的结果是14C7
3.4 程序的重定位难题
为了能让处理器自动的取指令和执行指令,我们需要设立一个寄存器自动的跟踪程序的执行,我们把这个寄存器设为IPR,IPR是程序要执行下一条指令的地址,在程序开始之前我们需要将第一条指令的地址送人这个寄存器,也就有了上方的过程。IPR_next = IPR + 这条指令的长度。
但是如果程序的整体位置发生移动,那么IPR的值也要从开始发生变化如果继续寻址000C的话就会发生错误,我们需要设置一个良好的机制来对应浮动程序。
现代操作系统一个比较好的解决方式是采用分段机制。
3.5 段地址和偏移地址
上一节我们说到,如果采用物理的地址的话不利于运行上下浮动的程序。那么采用重定位的方法,具体的定位过程大家都在CSAPP学过具体内容不再赘述
3.6 8086内存访问的困境
8086系统有20根地址线 16根数据线也就是说他最多访问的数据是2MB,
在教材的第20页,CS确定段的位置然对于操作数给的是相对位置需要加上DS的内容才能真正找到操作数的地址。
3.7 8086地址选择策略
为什么采用这种方式,因为有20根地址线,但是寄存器只有16位这样可能不符合要求,所以我们总是选择最后一个地址为0的内存地址去掉0之后送入寄存器。也就是说只有以0结尾的地址才有可能称为段地址。
3.8 8086内存访问过程
接上边的内容,我们解决了分段的问题,但是想象一下这样的场景:在第一条指令执行完之前,需要将CS或者是PC的值修改为30CE3,但是由于内存地址是16为不能存放下最后一个3,总不能丢弃吧?
这个时候我们引入IP寄存器
这个IP = 7 的计算方法是将原有的指令长度3 加上第二条指令的长度4 也就是4+3 = 7
3.9逻辑地址和分段的灵活性
首先分段必须选用最后一位从0开始的地方。
一个物理地址可以对应多个逻辑地址
最大段地址和偏移地址计算方法和可逆过程如上图所示。
实战
4.0 bios开机启动原理
- 操作系统进行一个热启动
- 将CS 代码段寄存器置为FFFF 并将其他所有寄存器的值设置为0(包括段寄存器和通用寄存器)
- CS << 4 + IP = 0xFFFF0传递给地址线,去这个位置取第一条指令
8086系统中一次可以访问1MB的内容,我们以为的0-fff是连续的 实际上并不一定是连续的,如下图所示,这些地址可能会被地址分配电路分配成几个独立的部分。
-
从下到上依次是内存条,是由电容构成的,需要定时刷新,简称DRAM,外部设备的接口,ROM只读存储器(通过特殊方式写入的)可以将指令固化在ROM中
如果没有跳转的话,对于指令是一条一条的执行的,8086系统每次会从内存中读取一条1MB的指令如图所示,EA代表跳转E05B和F000分别代表段地址和偏移地址。转化成汇编语言如下图所示。 -
这个位置可能存放着有关开机诊断的一些代码之类的。
-
微指令执行就可以控制
4.1创建主引导扇区程序
因为采用低端字节序存放方式所以 C0 00 主引导扇区总长度是512字节,而这一条指令是八个字节,为了保证正确的阅读前面需要510个字节并且最后两个字节是55和AA
逻辑块公式
LBA:正常情况下磁盘需要给出一个逻辑块的地址,采用C柱面 H磁头 S扇区 逻辑块地址
将程序写入虚拟磁盘
发现和编译结果相同
今天先写这么多吧 明天正确把文字显示出来
补充 创建磁盘新磁盘的方法(转载)
在Ubuntu上添加一个虚拟磁盘,并对其进行分区、建立文件系统、格式化,给分区创建文件系统,实现挂载、自动挂载。
1.添加sdb磁盘
关机,菜单栏中找到虚拟机—设置,点击硬盘—添加,按步骤走就可以了,启动虚拟机,就有sdb了
2.查看硬盘信息
终端: ls /dev/sd*
可以看到有两块磁盘:第一块sda,另一个是sdb。
也可以终端:sudo fdisk -l
可以看出sdb硬盘分区表是空的,还没有分区和格式化
3.创建硬盘分区
终端: sudo fdisk /dev/sdb
在分区过程中,一般先输入“m”,查看各个参数的说明
然后通过“p”参数,查看硬盘的分区表信息
可以看到sdb未分区,通过“n”参数新建分区,分区类型为主分区,分区编号为1,起始扇区默认为2048,最后扇区为8388608,分区大小为4GB
按照上面步骤,在剩余硬盘空间上新建第二个分区,分区类型为主分区,分区编号为2,起始扇区默认为8388609,最后扇区为20971519,分区大小为6GB
使用“p”参数查看分区表信息
分区完成后,使用“w”参数保存并退出,否则之前分区无效
4.为各分区创建文件系统(实验要求做到这一步)
终端:sudo mkfs -t ext3 /dev/sdb1
按照相同步骤对/dev/sdb2分区格式化
5.挂载磁盘分区
在挂载前,需要新建挂载点,在/mnt目录下新建两个目录,作为分区的挂载点
使用mount命令将/dev/sdb1分区挂载到mnt/sdb1 ,/dev/sdb2分区挂载到mnt/sdb2
终端:sudo mount -t ext3 /dev/sdb1 /mnt/sdb1
挂载分区之后,就可以使用该分区。此时再次查看硬盘分区表信息
终端:sudo fdisk -l