前言:看过很多书,但总是忘得很快。知识广度越大越容易接纳新东西,但从考察角度来说,自然是对某个方面了解越深越好。那些大而全的著作虽然每本都是经典中的经典,但实际工作中可能只用到其中的一小部分。我现在越发觉得少即是多,看再多东西没有理解透彻都是白搭,把最常用的每天过一遍才是最有效的。
操作系统概念->王道操作系统考研书->操作系统导论->深入理解计算机系统->汇编/保护模式汇编/gcc内嵌汇编->哈工大李志军老师的操作系统慕课及实验->linux内核设计及实现->linux命令行与shell编程->linux内核完全剖析->unix环境高级编程->unix网络编程->Linux/unix系统编程上下册->linux技术内幕(非常重量级,是基于内核3.2的,结合全部源码看最好)
这一套我大概花了2年,比较费劲,但是学完了能将计算机基础课中所有的知识点串起来,会有种悟道的感觉,有空闲时间的同学非常建议去学一学。学完这一套,只要不是面大厂的操作系统相关核心岗位,在操作系统与网络这一部分基本上不会有啥压力。就是比较废时间,加油呀!
1、计算机系统概述
主要讲授信息的数字化表示、存储程序与冯诺依曼体制;计算机的诞生和发展;计算机系统的层次结构和硬件系统组织;计算机的主要性能指标。
第一节 计算机系统层次结构
1.计算机系统的基本组成:硬件+软件
硬件部分
- 最底层的微处理机,由中央处理机中算术和逻辑处理单元、寄存器以及操作控制用的逻辑电路组成。
- 第二层微型计算机,是在微处理机的基础上,设计适当的总线结构以及存储器、外部设备接口等,构成一个硬件计算机。
- 第三层是机器语言环境,程序员能够通过计算机提供的机器语言环境,编制机器语言程序,控制计算机完成预定的任务。
软件部分
- 在操作系统层面,系统操作员可以基于操作系统环境,采用一般的运算指令和I/O操作指令,进行编程,使用计算机全部的系统资源。
- 同理,汇编程序员和高级语言程序员,用各自规定的语言形式提交各自的处理任务,由相应层上的解释或编译程序进行处理。
- 应用程序层是给最终用户使用的环境,在该层次中,用户使用时,并不需要了解计算机是如何工作的,在他们的视角下,计算机可能就是一个游戏机、图文处理工具等。
在计算机技术中,从某种角度看,把本来客观存在的事务或属性视作不见的现象,称作透明性
(Transparency)。
2.计算机硬件的基本组成:运算器+存储器+控制器+输入设备+输出设备
- 运算器:信息加工部件。对二进制编码数据进行算术运算(按算数规则进行运算,如加减乘除)和逻辑运算(非算术性运算,如比较,位移等)
- 存储器:内存储器(主存,大多数是由半导体器件组成)和外存储器(辅助存储器或外存)。CPU只能直接访问内存中数据,计算机不能与外存直接交换数据,而是和内存交换数据。常见外存如硬盘,光驱,U盘 等,容量大,数据不丢失,存取慢
- 控制器:指挥中心。如从存储器中取出指令,控制计算机各部分协调运行 控制器和运算器整合在CPU中
- 输入设备:使计算机从外部获得信息的设备如鼠标,键盘,光笔,扫描仪,话筒,数码相机,摄像头, 手写板
- 输出设备:把计算机处理信息的结果以人们能够识别的形式表示出来的设备如显示器,打印机,绘图仪,音箱,投影仪
3.系统软件和应用软件
- 系统软件:指控制和协调计算机及外部设备,支持应用软件开发和运行的系统,是无需用户干预的各种程序的集合。
- 应用软件:是用户可以使用的各种程序设计语言,以及用各种程序设计语言编制的应用程序的集合。
计算机软件系统是由“系统软件”和“应用软件”两部分组成。系统软件是指担负控制和协调计算机及其外部设备、支持应用软件的开发和运行的一类计算机软件;应用软件是指为特定领域开发、并为特定目的服务的一类软件。
系统软件和应用软件的区别:系统软件是指控制和协调计算机及外部设备,支持应用软件开发和运行的系统;应用软件是用户可以使用的各种程序设计语言,以及用各种程序语言编制的应用程序的集合。
功能不同
- 系统软件:主要功能是调度,监控和维护计算机系统;负责管理计算机系统中各种独立的硬件,使得它们可以协调工作。
- 应用软件:件是为满足用户不同领域、不同问题的应用需求而提供的那部分软件。它可以拓宽计算机系统的应用领域,放大硬件的功能。
特点不同
- 系统软件:使得计算机使用者和其他软件将计算机当作一个整体而不需要顾及到底层每个硬件是如何工作的。
- 应用软件:是利用计算机解决某类问题而设计的程序的集合,供多用户使用。
4.(易考)翻译程序:
- 汇编程序(汇编器)将汇编语言程序翻译成机器语言程序
- 解释程序(解释器)将源程序翻译成机器指令并立即执行
- 编译程序(编译器)将高级语言翻译城机器语言或汇编语言
第二节 计算机性能指标
计算机功能的强弱或性能的好坏,不是由某项指标决定的,而是由它的系统结构、指令系统、硬件组成、软件配置等多方面的因素综合决定的。对于大多数普通用户来说,可以从以下几个指标来大体评价计算机的性能。
- 1.吞吐量:一台计算机在某一时间间隔内能够处理的信息量。
- 2.响应时间:用户输入一个作业至输出开始之间的时间。
- 3.主频:主频f:是描述计算机运算速度最重要的一个指标。通常所说的计算机运算速度是指计算机在每秒钟所能执行的指令条数,即中央处理器在单位时间内平均“运行”的次数,其速度单位为MHz(兆赫兹)或GHz(吉赫兹)。
- 4.时钟周期:主频的倒数,T=1/f,度量单位μs (微秒),ns(纳秒)。
1μs=10^-6s,1ns=10^-9s
- 5.CPI:表示每条指令周期数,即执行每条指令所需的平均时钟周期数。
计算公式:CPI=执行某段程序所需的CPU时钟周期数/程序包含的指令条数
- 6.CPU执行时间:表示CPU执行一段程序所占用的CPU时间。
计算公式:CPU执行时间=CPU时钟周期数*CPU时钟周期
- 7.MIPS(Million Instructions Per Second):单字长定点指令平均执行速度 Million Instructions Per Second的缩写,每秒处理的百万级的机器语言指令数。这是衡量CPU速度的一个指标。像是一个Intel80386 电脑可以每秒处理3百万到5百万机器语言指令,即我们可以说80386是3到5MIPS的CPU,所以这个是运算速度。
计算公式:MIPS=指令数/(程序执行时间*10^6)
- 8.FLOPS是Floating-point Operations Per Second每秒所执行的浮点运算次数的英文缩写。它是一个衡量计算机计算能力的量,这个量经常使用在那些需要大量浮点运算的科学运算中。有时也会被记为flop/s。
MIPS=指令数/(程序执行时间*10^6)
各种FLOPS的含义
一个 MFLOPS (megaFLOPS) 等于每秒1百万 (=10^6) 次的浮点运算, 一个 GFLOPS (gigaFLOPS) 等于每秒10亿 (=10^9) 次的浮点运算, 一个 TFLOPS (teraFLOPS) 等于每秒1万亿 (=10^12) 次的浮点运算, 一个 PFLOPS (petaFLOPS) 等于每秒1千万亿 (=10^15) 次的浮点运算。
8.1 MFLOPS(Million Floating-point Operations per Second,每秒百万个浮点操作),衡量计算机系统的技术指标,不能反映整体情况,只能反映浮点运算情况。MFLOPS=操作浮点数/(执行时间*10^6)。
8.2 GFLOPS 就是 Giga Floating-point Operations Per Second,即每秒10亿次的浮点运算数,常作为GPU性能参数但不一定代表GPU的实际表现,因为还要考虑具体如何拆分多边形和像素、以及纹理填充,理论上该数值越高越好。1GFlops = 1,000MFlops。
8.3 TFLOPS (teraFLOPS) 等于每秒1万亿 (=10^12) 次的浮点运算
8.4 PFLOPS (petaFLOPS) 等于每秒1千万亿 (=10^15) 次的浮点运算。
- 9.处理机字长:一般来说,计算机在同一时间内处理的一组二进制数称为一个计算机的“字”,而这组二进制数的位数就是“字长”,在其他指标相同的情况下,字长越长,计算机处理数据的速度就越快。
- 10.总线宽度:一般指CPU中运算器与存储器之间进行互连的内部总线二进制位数。总线宽度分为地址总线宽度和数据总线宽度,其中,地址总线宽度决定了CPU能够使用多大容量的 主存储器, 若计算机的地址总线的宽度为32位,则最多允许直接访问2^32= 2^2*2^30=4*1GB=4GB 的物理空间。
- 11.存储器容量:存储器中所有存储单元的总数,通常用KB,MB,GB,TB来表示。
有内存储器和外存储器之分:内存储器:是CPU可以直接访问的存储器,需要执行的程序与需要处理的数据就是存放在主存中的。内存的性能指标主要包括存储容量和存取速度。
1B=8bit;1KB=1024B;1MB=1024KB;1GB=1024MB;TB=1024GB;1PB=1024TB
外存储器:通常是指硬盘容量。外存储器容量越大,可存储的信息就越多,可安装的应用软件就越丰富。
- 12.存储器带宽:单位时间内从存储器读出的二进制数信息量,一般用字节数/秒表示。
- 13.利用率:在给定的时间间隔内系统被实际使用的时间所占的比率,用百分比表示。即在一段时间内被使用的时间(次数)占总时间(总使用次数)的百分比,有硬件利用率、软件利用率、指令利用率等。
题目总结:①对于高级语言程序员来说,浮点数格式、乘法指令、数据如何在运算器中运算时透明的。对于汇编语言程序员,指令格式,机器构造,数据格式则不是透明的。
②在CPU中,IR、MAR、MDR对各类程序员都是透明的。
③机器字长,指令字长,存储字长
机器字长也称字长——是计算机直接处理二进制数据的位数,机器字长一半等于内部寄存器的大小,它决定了计算机的运算精度。
指令字长——一个指令中包含的二进制代码的位数。
存储字长——一个存储单元中二进制代码的长度。
指令字长一般是存储字长的整数倍,若指令字长等于存储字长的2倍,则需要2次访存来取出一条指令,因此
取值周期为机器周期的2倍;若指令字长等于存储字长,则取值周期等于机器周期。
2、数据的表示、运算与校验
主要讲授数值型和字符型数据的表示,数据的运算方法,奇偶校验等常用的数据校验方法。
数制与编码
- 编码:用少量简单的基本符号,对大量复杂多样信号进行一定规律的组合表示
数值数据的编码表示
- 数值数据的表示方法:直接用二进制表示:定点或浮点表示方法; BCD码…
- 数值数据在计算机内部编码表示的数称为机器数。机器数真正的值称为机器数的真值
校验码
- 校验位:在有效信息数据代码之外,再扩充几位。增加的部分称为冗余位或校验位
- 码字:若干位二进制代码组成的一个字
- 码制:包含若干种码字的集合 (ASCII码、BCD码…)
- 距离:在一种码制中将两个码字逐位比较,具有不同代码的位的个数叫做这两个码字间的“距离” (例如在8421BCD码中,0000和1001的距离为2)
- 码距:将一种码制中各码字间的最小距离称为“码距”(例如在8421BCD码中,码距为1。如果发生1位传输错误,则无法查出错误)
合理增大码距,能提高发现错误的能力,但表示一定数量的合法码所使用的二进制位数要变多,增加了电子线路的复杂性和数据存储、数据传送的数量。
- k 位码有 2 k 2^k2 k个编码状态,全用于表示合法码,则任何一位出错 , 均会变成另一个合法码,不具有检错能力
- 从一个合法码变成另一个合法码,至少要改变几位码的值,称为最小码距 (码距 ),码距和编码方案将决定其检错纠能力
校验过程:
- 编码过程:对原始数据进行编码,产生一个校验位,把校验位附加到原始数据中
- 将包含原始数据以及校验信息的码字进行传送
- 对接收到的码字进行译码,检查收到的码字,发现 / 改正错误
海明校验码:用于并行数据传送中
奇偶校验码:用于并行数据传送中
实现原理:使码距由1增加到2。若编码中有1位二进制数出错了,出错的编码就成为非法编码,就可以知道出现了错误。在原有的编码之上再增加1位校验位,原编码 k kk 位,形成新的编码为 k + 1 k+1k+1 位。
增加的方法有2种:
- 奇校验:增加位的0或1,保证整个编码中1的个数为奇数
- 偶校验:增加位的0或1,保证整个编码中1的个数为偶数
- 特点:在奇偶校验码中,若两个码字中有奇数位不同,则它们的校验位就不同;若有偶数位不同,则虽校验位相同,但至少有两位数据位不同。因而任意两个码字之间至少有两位不同,所以码距 d = 2 d=2d=2。所以,只能发现奇数位出错,不能发现偶数位出错,而且不能确定发生错误的位置,不具纠错能力。
- 优点:开销小,常被用于存储器读写检查或按字节传输过程中的数据校验。因为一字节长的代码发生错误时,1位出错的概率较大,两位以上出错则很少,所以奇偶校验码用于校验一字节长的代码是有效的。
循环冗余校验码:用于串行数据传送中
CRC(Cyclical Redundancy Check)校验码一般是指 k kk 位信息之后拼接 r rr 位校验码
CRC码的编码方法:
CRC整个编码长度为 n = k + r n=k+rn=k+r 位,故CRC码又叫 ( n , k ) (n,k)(n,k) 码。
其编码方法如下:
发送信息时将等式左边生成的 n nn 位CRC码送给对方。当接收方接到 n nn 位编码后,同样除以 G ( x ) G(x)G(x),如果传输正确则余数为0,否则,可以根据余数的数值确定是哪位数据出错。
列出CRC码的查错表:
定点数的表示和运算
定点数的表示
- 定点数:在计算机中,小数点位置固定不变的数。定点表示即为约定小数点的位置固定在数的最左边或最右边。小数点不占用存储位
定点小数 (原码、反码、补码)
整数
整数形式:小数点隐含在数的最右边
1 位符号位,n − 1 n-1n−1 位数值位。
因此,同一个整数的移码与补码仅符号位相反。
定点数的运算
定点数的移位运算
算术移位:移位的对象是数值型数据,在移位后会发生数值大小的变化
- 对于二进制数,左移,绝对值扩大;右移,绝对值缩小
- 算术移位规则:左移与逻辑移位相同,右移带符号位移位
逻辑移位:逻辑左移、逻辑右移、循环左移和循环右移等。逻辑移位只是使数码位置发生变化,没有正、负性质,也没有数值大小问题。
算术移位和逻辑移位的区别:
- 算术移位:带符号数移位
- 逻辑移位:无符号数移位
补码定点数的加/减运算
定点数的乘法运算
原码一位乘法
两个原码数相乘,其乘积的符号为相乘两数的异或值,数值为两数绝对值之积
如果直接使用手工运算的计算方法的话,硬件电路会变得比较复杂(要实现四个数的相加)。
定点补码一位乘法
补码一位乘法:乘法直接用补码进行,以减少转换次数.
注意:上面的移位为算术移位
浮点数的表示和运算
浮点数的表示
浮点数规格化
为了保证数据精度,尾数通常用规格化形式表示:
- 当 R = 2 R=2R=2,且尾数值不为 0 00 时,其绝对值大于或等于 0.5 0.50.5
- 对非规格化浮点数,通过将尾数左移或右移,并修改阶码值使之满足规格化要求
增加尾数位数也可以提高精度,但数值范围减小 (阶码位数减少了)
浮点数的溢出判断
根据规格化后的阶码判断:
- 上溢——浮点数阶码大于机器最大阶码—中断
- 下溢——浮点数阶码小于机器最小阶码—按机器零处理
假如不考虑规格化:
若考虑规格化,则 最小正数:2 − 1 × 2 − ( 2 m − 1 ) 2^{-1}\times 2^{-(2^m-1)}2 −1 ×2 −(2 m−1) 最大负数:− 2 − 1 × 2 − ( 2 m − 1 ) -2^{-1}\times 2^{-(2^m-1)}−2 −1 ×2 −(2m−1)
IEEE754 标准
- 单精度浮点数(32位),阶码8位,尾数24位(内含1位符号位)
- 双精度浮点数(64位),阶码11位,尾数53位(内含1位符号位)
阶码使用的移码偏移量为什么不用 128 ? 因为若用128,则最大阶127对应的编码127+128=255,而255(全1)要用来表示一些特殊值
IEEE754 标准中的规范化浮点数:
阶码为非全0非全1的数是正常的规格化浮点数。即:阶码范围在 1 11~254 254254 (单精度)和 1 11~2046 20462046 (双精度)的数是一个正常的规格化数
根据IEEE754 的定义,可知其阶码的真值范围:
− 126 -126−126~+ 127 +127+127(单精度) − 1022 -1022−1022~+ 1023 +1023+1023(双精度)
全0阶码全0尾数:表示 + 0 / − 0 +0\ /-0+0 /−0
浮点数的加/减运算
- 两数首先均为规格化数,进行规格化浮点数的加减运算需经过5步完成:
- 对阶操作:低阶向高阶补齐,使阶码相等
- 阶码较小的数将阶码增大,尾数减小 (阶码每增大1,尾数就进行1位右移。尾数为原码时,尾数右移时,符号位不动,最高数值位补0;尾数为补码时,尾数右移时,符号也移位,最高位补符号位。)
- 尾数运算:阶码对齐后直接对尾数运算
- 结果规格化:对运算结果进行规格化处理。如尾数溢出则需右规(尾数向右移位直到它为规格化的数);如不是,规格化时应左规
- 舍入操作:在对阶和右规过程中,可能出现尾数末位丢失引起误差,需考虑舍入。丢失位进行0舍1入或恒置1处理。常用“0”舍“1”入法:当移掉的部分最高位为1时,在尾数的末尾加1,如果加1后又使得尾数溢出,则要再进行一次右规
- 判断溢出:判断阶码是否溢出,下溢则将运算结果置0(机器0),上溢则设置溢出标志
算术逻辑单元 ALU
串行进位加法器
特点:串行进位(又称行波进位)加法器,逻辑电路较简单,但最高位的加法运算,一定要等到所有低位的加法完成之后才能进行,低位的进位要逐步传递到高位,逐级产生进位,因此运算速度较慢.
并行进位加法器
引进两个函数
- 并行进位加法器的运算速度很快,形成最高进位输出的延迟时间很短,但是以增加硬件逻辑线路为代价
- 对于长字长的加法器,往往将加法器分成若干组,在组内采用并行进位,组间采用串行进位或并行进位
先行进位加法器
单级先行进位:将 n nn 位字长分为若干组,每组内采用并行进位方式,组与组之间则采用串行进位方式
ALU 电路
Arithmetic logical unit
利用集成电路技术可将若干位全加器、并行进位链、输入选择电路等部分集成在一块芯片上,称为多功能算术、逻辑运算部件 ALU
4位ALU部件 SN74181
用4片74181电路可组成16位ALU。如图所示,片内进位是快速的,但片间进位是逐片传递的,因此总的形成时间还比较长.
- 如果把16位ALU中的每4位作为一组,用类似位间快速进位的方法来实现16位ALU(4片ALU组成),那么就能得到16位快速ALU:
利用16位并行进位链集成电路SN74182,产生芯片连接时所需要的并行进位信号,构成片内、片间均并行进位的ALU。
SN74182可以向SN74181提供片间并行进位信号,其芯片本身输出的G、P还可以支持更高一级的并行进位链,从而可构成更长位数的ALU
例如,采用3片SN74182和8片SN74181可级连组成片内、片间均并行进位的32位ALU电路。5片SN74182和16片SN74181可级连组成片内、片间均并行进位的64位ALU电路(如下图所示)
----------------------------IT开发人员的加分项----------------------------------
内核是IT开发人员的加分项,一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
Linux 内核实现了很多重要的体系结构属性。在或高或低的层次上,内核被划分为多个子系统。Linux 也可以看作是一个整体,因为它会将所有这些基本服务都集成到内核中。这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。
随着时间的流逝,Linux 内核在内存和 CPU 使用方面具有较高的效率,并且非常稳定。但是对于 Linux 来说,最为有趣的是在这种大小和复杂性的前提下,依然具有良好的可移植性。Linux 编译后可在大量处理器和具有不同体系结构约束和需求的平台上运行。一个例子是 Linux 可以在一个具有内存管理单元(MMU)的处理器上运行,也可以在那些不提供MMU的处理器上运行。Linux 内核的uClinux移植提供了对非 MMU 的支持。
在IT行业 如:嵌入式开发,驱动开发,Android开发,c++开发,Java开发如果接触到底层方面 那么 懂得内核:会使自己的开发工作产生对应的效益。懂得内核:会让自己更加了解底层的原理与开发源码。内核是面试的加分项 内核是走向专家的必经之路 不管你是不是做内核开发,内核技术是储备技能,开阔视野,扩展技术面的不二选择。
要转向内核开发,嵌入式开发人员需要掌握以下知识:
- 1. C语言编程:C语言是内核开发的主要编程语言,需要熟练掌握其语法和编程技巧。
- 2. 操作系统原理:需要了解操作系统的基本原理,包括进程管理、内存管理、文件系统等。
- 3. Linux内核:需要深入了解Linux内核的架构、模块、驱动程序等。
- 4. 设备驱动开发:需要掌握设备驱动的开发流程和技术,包括字符设备、块设备、网络设备等。
- 5. 调试技能:需要掌握调试技能,包括使用调试工具、分析内核崩溃等。
- 6. 硬件知识:需要了解硬件的基本原理和操作,包括处理器、内存、外设等。
- 7. 开源社区:需要了解开源社区的文化和开发流程,以便更好地参与内核开发。
- 总之,转向内核开发需要广泛的知识储备和实践经验,需要不断学习和探索。
【文章福利】小编推荐自己的Linux内核技术交流群:【869634926】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!
资料直通车:最新Linux内核源码资料文档+视频资料
https://docs.qq.com/doc/DTmFTc29xUGdNSnZ2
内核学习地址:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈https://ke.qq.com/course/4032547?flowToken=1044435