2)准备加载用户程序
我们将主引导扇区程序定义成一个段
SECTION mbr align = 16 vstart = 0x7c00
这一部分不是很清楚,等过一段时间再看看
3) 外围设备及其接口
加载器的下一个工作是从硬盘读取用户程序,即访问其他硬件。
所有和计算机相连的设备分两种,输入设备和输出设备。
输入设备:
- 键盘
- 鼠标
- 麦克风
- 摄像头
输出设备: - 显示器
- 打印机
- 扬声器
统称I/O设备。
每个设备的大概工作方式:
- 扬声器:需要模拟信号。每个扬声器需要两根线,用的插头是无线电行业里的标准。话筒也一样
- 键盘,用一根线向主机传送按键的 ACSII码,且一直采用PS/2标准
- USB键盘尽管也使用串行方式工作,信号却和老式键盘不同。
需要与处理器沟通的设备都需要一个I/O接口。
I/O接口可以是一个电路板,也可以是一块小芯片。其本质是一个典型的变换器或说是一个翻译器。
可能会遇到两个麻烦的问题:
- 不能将所有的I/O接口直接与处理器相连。
- 每个设备的I/O接口都抢着和处理器说话,容易发生冲突。
1,问题采用总线技术。说有外围设备包括处理器都连接到这排电线。 称为 Bus。
2.问题是使用输入输出控制设备集中器芯片 ICH。
ICH内集成了一些常规的外围设备接口,如USB,PATA,SATA 老式总线接口(IPC),时钟等。 另外还提供对PCI或者PCI Experss 总线的支持,该总线向外延伸,连接着主板的若干扩展槽,即插槽。
除局部总线和PCI Express总线,USB金额口就可能有很多同类型设备,故涉及线路复用和仲裁问题,他们也有自己的总线体系,称为通信总线或设备总线。
4) I/O端口和端口访问
一句话,处理器通过端口来和外围设备打交道,本质上,端口就是一些寄存器,处理器内部的寄存器。不同在于,这些叫端口的寄存器位于I/O接口电路中。
每个I/O接口都有还几个端口,分别有不同的目的。
例如连接硬盘的PATA/SATA接口就有好几个端口,分别为:
- 命令端口。(当向该端口写入0x20时,表明是从硬盘读数据;写入0x30时,表明时向硬盘写数据)
- 状态端口。(处理器根据这个端口的数据判断硬盘工作是否正常,操作是否成功,发生了那种错误)
- 参数端口。(处理器通过这些端口告诉硬盘读写的扇区数量,以及起始的逻辑扇区号)
- 数据端口。(通过这个端口连续的取得要读出的数据,或连续的发送要写入硬盘的数据。
每个端口都有自己的数据宽度。早期的系统端口可以是 8位的 16位的,现在会是32位的。到底是8位还是16位,这是设备和I/O接口制造者的自由。
端口再不同的计算机系统有不同的实现方式。在一些计算机系统中,端口号是映射到内存地址空间的。蔽日 0x00000
0xE0000是真实的物理内存地址,而0xE00010xFFFFF是从很多I/O接口哪里映射过来的。当访问这部分地址,实际是访问I/O接口。
而另一些是独立编址的,不和内存发生关系。这里只讨论独立编址。
端口的访问
不能使用mov类似的指令,取而代之的是in和out
in指令是从端口读:
in al,dx
或
in ax,dx
即,in指令的目的操作数必须是 寄存器AL或AX,当访问8位端口,使用寄存器AL;16位,使用AX。in指令的源操作数应当是寄存去DX。
out指令即通过端口向外围设备发送数
其目的caozs可以是8位立即数或寄存器DX,源操作数必须是寄存器AL或AX。
out 0x37,al ;写0x37端口(这是一个8位端口)
out 0xf5,ax ;写0xf5
端口(16位端口)
out dx,al
out dx,ax
in和out都不影响任何标志位
网友评论