• 自己动手从零写桌面操作系统GrapeOS系列教程——18.外设和IO


    学习操作系统原理最好的方法是自己写一个简单的操作系统。


    一、外设和I/O接口

    前面我们介绍过冯·诺依曼结构包含5部分,其中输入设备和输出设备统称为外部设备,简称外设。常见的外设有鼠标、键盘、显示器、硬盘等。由于外设种类多、差异大、速度慢等原因,导致CPU无法直接与外设沟通。于是在CPU和外设之间产生了“中间人”,这个“中间人”就是I/O接口。如下图:

    CPU与外设的信息交流都是通过I/O接口来间接实现的。比如我们前面向屏幕输出字符,并不是CPU直接将数据传递给屏幕,而是先传递给显卡,显卡再去操控屏幕。显卡就是一种I/O接口。后面我们将要学习如何读写硬盘,同样CPU无法直接读写硬盘,而是通过“中间人”硬盘控制器来间接实现读写硬盘。硬盘控制器也是一种I/O接口。上图中只举了显示器和硬盘两个例子,实际还有很多,图中用省略号代表了,后面我们学到哪个再讲哪个。

    二、I/O端口和端口访问

    我们知道在CPU内部有一些寄存器,而在每个I/O接口上面也都有一些寄存器,通常叫做I/O端口。CPU与I/O接口的交流,主要就是读写这些I/O端口,也叫端口访问。
    CPU访问I/O端口有两种方式,一种是通过内存地址访问,另一种是通过端口号来访问。

    1.通过内存地址访问端口

    这种方式就是将一部分内存地址映射到相应的端口上,CPU读写这些端口就和读写内存的指令是一样的。

    2.通过端口号访问端口

    这种方式是为每一个端口分配一个唯一的编号,叫端口号,然后通过端口号就可以读写这个端口。我们后面主要用这种。
    我们需要注意2点:

    • 在x86架构中端口号的最大取值范围是0~65535,也就是2个字节表示的范围。
    • 端口作为一种寄存器,它的数据宽度有的是8位,也有的是16位。具体是多少位,我们用到的端口都会介绍。

    三、端口访问代码

    1.读端口代码

    读端口总共有4种方式,代码如下:

    in al,dx
    in ax,dx
    in al,立即数
    in ax,立即数
    

    以上4行代码,每一行都表示从指定端口读取数据到al或ax寄存器中。
    这里需要注意2点:

    • 源操作数就是端口号,只能用dx或立即数表示,而且立即数只能在0~255范围内。
    • 目的操作数只能是al或ax,如果端口是8位的就用al,如果端口是16位的就用ax。

    2.写端口代码

    写端口也有4种方式,代码如下:

    out dx,al
    out dx,ax
    out 立即数,al
    out 立即数,ax
    

    以上4行代码,每一行都表示将al或ax中的数据写入到指定的端口中。
    同样需要注意2点:

    • 目的操作数就是端口号,只能用dx或立即数表示,而且立即数只能在0~255范围内。
    • 源操作数只能是al或ax,如果端口是8位的就用al,如果端口是16位的就用ax。

    本讲视频版地址:https://www.bilibili.com/video/BV1ig4y1b7cs/
    配套的代码与资料在:https://gitee.com/jackchengyujia/grapeos-course
    GrapeOS操作系统交流QQ群:643474045

  • 相关阅读:
    【云原生K8S】kubeadm部署kubernetes集群
    systemui屏蔽通知栏
    在kaggle上的pandas学习总结
    高并发下如何防重?
    四种插入排序
    matlab第三方硬件支持包下载和安装
    GIT | 基础操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤销修改 | 删除文件
    老旧电力系统安全隐患增加 该如何预防电气线路老化等因素引发的电气火灾呢?
    枯竭的水库求生的稻田 国稻种芯·九江:位于抗旱一线的都昌
    基于表面电势的AlGaN/GaN MODFET紧凑模型
  • 原文地址:https://www.cnblogs.com/chengyujia/p/17232431.html