读书笔记《Linux内核完全注释》第二章硬件部分
能源及电源,有了电能就可以控制电子管的通与不通,从而实现与、或、非、异或、位移、脉冲、传输、存储等基础功能。
1:CPU通过系统总线(3合1的通信总线)与其他外设相接。
大多数控制器、控制卡都集成于主板上,以大规模集成电路芯片组成的功能电路。
把控制器、控制卡集成到南桥芯片和北桥芯片中。
2:CPU与IO接口控制器、控制卡通信接口是IO端口。
IO端口类型及作用
访问数据:数据端口。
输出命令:命令端口。
访问控制器状态:状态端口。
IO端口地址的设置方法:
统一编址:将IO端口地址归入存储器寻址地址空间范围内,访问IO端口使用访问内存的指令。
独立编址:将IO端口的寻址空间单独作为一个独立的地址空间,使用专门的IO指令来访问端口。
cat /proc/ioports #查看linux本机的IO端口地址范围。
IO接口数据传输控制方式:
程序循环查询(耗费CPU时间,linux只在设备或者控制器能立即返回信息时才会在很少几个地方采用)。
中断处理(IO设备通过中断向CPU提出处理请求,及硬件中断。CPU在事先设置好的中断向量表中找到中断处理服务过程并上下文切换执行。大多数设备采用的方式)。
DMA传输(直接存储器访问,IO设备与系统内存之间进行批量数据传送,过程中无需CPU插手)。
3:主存储器、BIOS、CMOS
主存储器:
初代个人电脑:1981年IBM PC机:640KB RAM内存,20根地址线 8088/8086CPU寻址1024KB。BIOS处于CPU能寻址的内存最高端位置处。
二代:intel 32位CPU(寻址4GB、64GB(通过修改页面大小实现))。BIOS任然处于CPU能寻址的内存最高端位置处,为了与原来的PC机在软件上兼容,系统1MB以下物理内存的使用和分配仍然与原来的PC基本一致,BIOS将从4G处以下位置拷贝一份(称为影子)放到1MB位置处以下的位置, 以到达兼容一代。
物理内存使用规范:
除了[0xA0000, 0xFFFFF](640KB-1MB)和[0xFFFE0000, 0xFFFFFFFF](4GB最后64KB)两段被用于IO设备和BIOS程序。其他地址可以作为系统内存。
Linux不使用BIOS功能,也不使用BIOS设置的中断向量表。所以此部分[0x00000, 0x00500]也可以当做系统内存。
BIOS:(存放于ROM中)
Linux只在初始化时会利用BIOS提供的一些系统参数(因为BIOS的功能是必要的),运行中不使用BIOS中的功能(因为BIOS不能并发)。
系统引导时的控制流:(加电)->0xFFFFFFF0->[0xFFFF0000, 0xFFFFFFFF]->(Big Mode)->(Self-Test and Init)->(copy 64KB to 0xF0000)->[0xF0000, 0x100000]->(CPU进入实地址模式)->(load boot to 0x7c00)->(load os kernel)
CMOS:
存储空间很小(例如64Byte/128Byte),存放实时时钟信息、系统硬件配置信息。通常和实时时钟芯片做在一块集成块中。CMOS地址空间是独立编址。
4:控制器和控制卡
4.1:中断控制器:实现IO设备的中断控制数据存取方式。IBM PC/AT 80x86兼容微机使用两片级联的8259A可编程中断控制芯片组成一个中断控制器。
1:初始时ROM BIOS对中断控制器芯片进行初始化。
2:并把15级中断优先级分配给时钟定时器、键盘、串行口、打印口、软盘控制、协处理器、硬盘等设备或控制器使用。
3:同时在内存开始处[0x000, 0xFFF]区域内建立一个中断向量表。
注:这些设置违背了Intel公司的要求,Linux kernel初始化期间又会重新设置中断控制器及中断向量表。
中断控制器电路图:
ROM BIOS根据上图中的 硬件中断请求号 设置成 下图中的 中断向量号(电信号->内存记录)。(后期Linux会重新设置)
4.2:DMA控制器:让外设和内存直接传输数据来增强系统性能。通常由Intel 8237芯片或其他兼容芯片实现。
4.3:定时/计数器:每隔一个固定间隔发出一个信号产生中断请求信号(IRQ0),产生内核工作脉搏。Intel 8253/8254芯片(可编程定时/计数器)。
4.4:键盘控制器:对接收到的键盘扫描码进行解码,把解码后的数据发送到操作系统的键盘数据队列中。Intel 8042单片微处理器芯片或其他兼容电路。
键盘编码器(键盘上的处理器,Intel8048或兼容芯片)收集扫描码(按下(接通码)和松开(断开码)的状态信息),并发送到键盘控制器。
键盘所有按键的接通码和断开码组成了键盘的一个扫描码集。
扫描码集已有三套:
AT键盘默认发送的是第二套扫码集。为了向前兼容,键盘控制器会把它转换成第一套扫码集,也就意味着软件只需要认识第一套扫码集。
键盘控制器收到键盘发来的11位串行格式数据,其中,第1位是起始位,第2-9位是8位键盘扫描码,第10位是奇校验校验位,第11位是停止位。然后转换成第一套扫码集中的扫描码,然后通过中断控制器IRQ1引脚向CPU发送中断请求。当CPU响应该中断请求后,就会调用键盘中断处理程序来读取控制器中的扫描码(第一套扫码集,同一个键盘按键的接通码加上0x80就是断开码)。
注意:扫描码不等于字符代码。
第一套扫码集(PC/XT)标准83键键盘以后新添加的(扩展)AT键盘上的按键(例如右手边的ctrl、右手边的alt键等),其接通码和断开码通常有2-4字节,并且第1字节一定是0xE0。(第一套原有键接通码只有1字节)
现今主板上不再包括独立的8042芯片,但会主板上的其他集成电路会兼容8042芯片的功能,所以现在键盘的编程方式仍然采用8042的编程方法。
另外键盘控制器8042的输出端口P2用于其他目的:P20引脚用于实现CPU复位,P21引脚用于控制A20信号线开关。
4.5:串行控制卡:串行数据的收发工作。2个符合RS-232C标准的串行接口+串行控制器(由通用异步接收/发送器控制芯片UART组成,或者16650A及兼容芯片(支持FIFO传输(最多16字节才引发一次中断)))。
串行接口:25芯的DB-25或9芯的DB-9链接器,主要连接MODEM设备。
串行通信:在线路上以一次一个bit进行传输的通信方式。可分为同步和异步两种类型。
异步串行通信:一个字符作为一个通信单位(帧)进行传输。
发送方:无数据传输时发送方处于传号(MARK,1)状态,持续发1。需要发送数据时,发送方需要首先发送一个空号(SPACE)起始位。接收方收到空号后就开始与发送方同步,然后接收随后的数据位,奇偶校验位,停止位。多个字符帧之间可以不用传号,也可以任意多个传号。
注:数据位长范围是[5, 8]bit,奇偶校验位可有可无,停止位可以是1、1.5、2位。但是再通信开始之前,双方必须设置成相同的格式。
接收方:每接收到一字符帧时,可能检测到三种错误之一。
奇偶校验错误:应要求对方重发。
过速错误:取字符速度慢于接收速度,修改程序加快取字符频率。
帧格式错误:线路干扰、或者双方帧格式设置的不一样导致。
同步串行通信:以多个字符或字节 组成的序列作为一帧数据进行传输。
PC启动时通过MR引脚对串行控制卡复位,此后使用之前需要初始化编程操作设置工作波特率、数据位数以及工作方式等。
4.6:显示控制:
可以使用多种不同标准的显卡,有单色和彩色的。后面的AGP显示卡也兼容前几种标准。
单色MDA标准:(Monochrome Display Adapter)
仅支持黑白两色显示,只支持独有的文本字符显示方式(BIOS显示方式7)。
显示规格是80列*25行,共可以显示2000字符。
每个字符除了ASCII编码1字节外,还带有1个属性字节。因此显示1屏(1帧)内容需要占4KB,其中偶数地址(0,2,4...,3998)字节存放字符代码,奇数地址(1,3,5...,3999)字节存放属性字节。
MDA显卡配置了8KB显示内存,在PC机内存寻址范围是[0xb0000, 0xb2000]。能够通过计算得出屏幕中指定位置字符在内存寻址中的地址。
每个字符的属性:D7置1使字符闪烁,D3置1使字符高亮度显示。其他位对显示的影响效果如下图。
彩色CGA标准:(Color Graphics Adapter)
支持7种 彩色和图形显示 方式(BIOS显示方式0--6)。
其中有两种80列*25行的文本字符显示方式:单色和16色彩色两种(BIOS显示方式2和3),这两种和MDA标准类似。
CGA显卡标配有16KB显示内存(内存地址范围为[0xb8000, 0xbc000]),能存放4帧显示信息。在console.c程序中只使用了8KB([0xb8000, 0xba000])。
在CGA16色彩色文本显示方式中,每个字符属性字节的格式如下表:
RGB位标识了每个字符的颜色和背景色:
EGA标准、VGA标准:(增强型图形适配器(Enhanced Grpahics Adapter)、视频图形阵列(Video Graphics Adapter))
除了兼容MDA和CGA的显示方式外,还支持其他在图形显示方面的增强显示方式。标配32KB显示内存,还是占用从0xa0000开始的物理内存地址。兼容(MDA/CGA)模式下运行的话显存地址也是兼容的。
4.7:软盘、硬盘控制器:(FDC(Floppy Disk Controller))
外存原理:利用磁性介质在电磁化后的剩磁状态来存储信息。
外存控制子系统=盘片+盘驱动器。硬盘驱动器和硬盘盘片放在一起不可分割。
例如:软盘:300转/分钟。硬盘:5000转/分钟。
磁头先转到相应的磁道,磁盘相对于磁头做匀速运动,相当于磁头在切割磁介质上的磁力线,从而根据剩磁状态方向不同在磁头的读线圈上产生不同方向的电流,并转换成0/1信号读入。
GAP:间隔字段,起隔离作用,通常是12字节的0。
地址场的地址字段:存放柱面号、磁头号、扇区号。读这个区域就能得到唯一标识地址。
磁盘控制器:CPU和驱动器之间的逻辑接口电路,他从CPU接收请求命令,向驱动器发送寻道、读写和控制信号,并控制和转换数据流形式。控制器与驱动器之间串行传输所有驱动器读到的数据,控制器负责分离出地址信息、其他控制信息和数据,并转为并行字节数据。