1)cpu与外设通信的方式
CPU与外设采用IO端口的方式进行通信,通过把数据写入到相应的外设的寄存器中,其他的工作交给外设的控制器去执行,不需要CPU负责。
如何访问到端口呢?外设中的 rom 既然可以通过内存映射来访问,端口也可以,确实有些微机系统中是这样做的,把一些内存地址作为端口的映射,访问这些内存地址就相当于访问了这些端口。还有一些微机系统把端口独立编址,把所有端口从 0 开始编号,位于一个 IO 接口上的所有端口号都是连续的。以后讲解硬盘的时候大家就会看到了。
要是通过内存映射,端口就可以用 mov 指令来操作。但由于用的是独立编址,所以就不能把它当作内存来操作,因此 CPU 提供了专门的指令来干这事, in 和 out.
2)显卡
无底是哪种显卡,它提供给我们的可编程接口都是一样的: IO 端口和显存。
显卡的文本模式也是分为多种模式的 ,用“列数*行数”来表示,如 8025, 4025’ 8043 或者 8050,它们的乘积是整个屏幕上可以容纳的字符数。不同的模式可容纳的宇符数不同,如 8025 表示一行 80 个字符,共 25 行。显卡在加电后,默认就置为模式 8025 ,也就是一屏可以打印 2000 个宇符。我们也在这个默认模式下工作了。
每个字符在屏幕上都是由 2 个字节来表示的,而且是连续的 2 个字节。低字节用来表示字符的编码。通过发送编码,具体怎么显示的工作交给显卡的GPU来做。高字节用来表示字体的特征,如颜色、亮度等。
显存是从 OxB8000 到 OxBFFFF,范围是 32kb,一屏可以显示 2000 个字符,显示器上的每个字符占 2 字节大小,故每屏字符实际占用 4000 字节。这样,我们的 32KB 的显存可以容纳 32KB/4000B 约等于 8 屏的数据。所以 懂了为什么 Linux 可以用 alt 十 Fn 键实现fft的切换,当然这只是原理,具体的实现要涉及到显卡的寄存器设置。
3)直接操作显存显示,不使用BIOS的中断
编写mbr.S文件。
使用nasm编译:nasm -o mbr.bin mbr.S
将文件写入硬盘的0扇面0磁道1扇区:dd if=/boch/mbr.bin of=/boch/hd60M.img bs=512 count=1 conv=notrunc
运行bochs -f bochsrc.disk
相关文章: