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


一、外设和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

自己动手从零写桌面操作系统GrapeOS系列教程——18.外设和IO的更多相关文章

  1. 别人写的一个Bootstrap系列教程

    http://www.cnblogs.com/lansy/category/659061.html

  2. 一个人写的操作系统 - Sparrow OS

    一个人写的操作系统 - Sparrow OS 自己写一个操作系统,这是在过去的几年里我一直为之努力的目标,现在终于完成了. 缘起 自己动手写操作系统的动机最初来自于学习Linux遇到的困难. 我是一个 ...

  3. 自制 os 极简教程1:写一个操作系统有多难

    为什么叫极简教程呢?听我慢慢说 不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了 ...

  4. 【操作系统】关于Linux桌面操作系统

    以前是Win+Ubuntu+黑苹果,周末想体验一下deepin,于是简单安装了一下,安装过程很简单,这里不再描述.安装之后,第一次打开系统,确实很惊艳,赏心悦目的操作系统. 之前用Ubuntu时候,C ...

  5. 盘点|2021年最受欢迎Linux桌面操作系统前十名

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 阿里云开源镜像站利用云服务上的优势,提供快速.稳定的镜像分发服务.和免费的CDN加速服务.更新频率高,基本上一天一更新,对于Centos/Ubun ...

  6. 手把手教你从零写一个简单的 VUE

    本系列是一个教程,下面贴下目录~1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 今天给大家带来的是实现一个简单的类似 VUE 一样的前端框架,VUE 框架现在应 ...

  7. 《一步一步写嵌入式操作系统》读书笔记1—Skyeye介绍、安装和HelloWorld

    2013-11-14 最近在看<一步一步写嵌入式操作系统>,感觉此书甚好,许多地方讲得很清楚.可操作性强,计划边读边实践边写笔记,希望能够逐步熟悉嵌入式操作系统底层的东西,最终剪裁出一套实 ...

  8. Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)

    我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...

  9. Zedboard学习(一):移植Ubuntu桌面操作系统 标签: ubuntu移植zedboardFPGA 2017-07-04 21:53 26人阅读

    环境准备: 首先,需要的肯定是Ubuntu操作系统.可以在自己的电脑上安装物理机,也可以是虚拟机下运行的.我的是在Vmware下运行的Ubuntu14.04 32位操作系统. 由于zedboard上的 ...

  10. 27、从零写UVC驱动之分析数据传输(设置ubuntu通过串口打印,指定打印到文件,ubuntu切换root用户)

    A. 设置ubuntu让它从串口0输出printk信息a. 设置vmware添加serial port, 使用文件作为串口(在vmware中设置,文件是保存在windows中)b. 启动ubuntu, ...

随机推荐

  1. HCIA-ICT实战基础07-访问控制列表ACL进阶

    HCIA-ICT实战基础-访问控制列表ACL进阶 目录 二层ACL技术及配置 高级ACL的扩展使用方法及使用场景 1 二层ACL技术及配置 1.1 二层ACL概念 使用报文的以太网帧头来定义规则, 根 ...

  2. 冰冻三尺非一日之寒,记录Java

    一.数据类型 Java是一种强类型语言,什么是强类型语言? 强类型语言:要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用 Java的数据类型又分为两大类: 1.基本类型:基本类型有分为数值 ...

  3. 阿里云 rocketMq 延时消息

    初始化消费者和生产者 生产者 设置rocketmq的accesskey 和secretkey 以及rocketmq的 binder server. 首先 编辑一个配置类,将关于配置rocketmq的东 ...

  4. 模态框拖拽案例分析--元素偏移量 offset 系列

    弹出框,我们也称为模态框. 模态框拖拽案例分析: (1)点击弹出层, 会弹出模态框, 并且显示灰色半透明的遮挡层. (2)点击关闭按钮,可以关闭模态框,并且同时关闭灰色半透明遮挡层. (3)鼠标放到模 ...

  5. 解决通过Eclipse启动Tomcat-Run On Server出现The selection cannot be run on any server

    有时候通过Eclipse启动Tomcat-Run On Server会出现The selection cannot be run on any server的情况如下图: 这是因为没有在eclipse ...

  6. 在Scorpio 1.0(天蝎座)中使用C# System.Diagnostics.Process打开chrome遇到的问题

    1 //在天蝎座 中使用C# System.Diagnostics.Process打开chrome遇到的问题 2 DiagProcess = import_type("System.Diag ...

  7. Floyd算法求最短路径

    floyd算法用于求图中各个点到其它点的最短路径,无论其中经过多少个中间点.该算法的核心理念是基于动态规划, 不断更新最短距离,遍历所有的点. 知识基础:图的邻接矩阵表示: 如图是一个简单图,从A开始 ...

  8. Python使用双层列表推导式输出九九乘法表

    print('\n'.join([' '.join(['%2d *%2d = %2d' % (col, row, col * row) for col in range(1, row + 1)]) f ...

  9. BGP反射器

    路由反射器是一种减少自治系统内IBGP对等体连接数量的方法. 根据BGP路由通告原则,要求一个AS内的所有BGP Speaker将建立全连接关系(BGP Speaker两两建立邻接关系).当AS内的B ...

  10. 【C++小程序】《我要抽签》b1.0做好了~

    也许是的,得横空出世了 如你所见 这款基于\(C++\)能模仿Mrs. Yao抽签系统的cpp终于做完了啦~ 初期功能很少.\(BUG\)极多. 所以为了您的体验:) 请遵守格式 代码: #inclu ...