c语言学习总结--存储(5)

1、cpu中的一个地址所对应的存储单元不能存很多东西,只能存一个字节,所以以前讲过的int 、float等多字节的数据类型保存在内存中要占用多个地址,这种情况下把起始地址当作这个数据的地址。

2、内存的读写过程:

  1 .  CPU内部将寄存器对接到数据总线上,使寄存器的每一位对接到一条数据线,等待接收数据。
  2 .  CPU将内存地址通过地址线发给内存,然后通过另外一条控制线发一个读请求。
  3 .  内存收到地址和读请求之后,将相应的存储单元对接到数据总线的另一端,这样,存储单元每一位的1 或0 状态通过一条数据线到达CPU寄存器中相应的位,就完成了数据传送。

3、操作设备的过程就是对这些设备寄存器做读写操作的过程,比如向串口发送寄存器里写数据,串口设备就会把数据发送出去,读串口接收寄存器的值,就可以读取串口设备接收到的数据。

4、还有一些设备是集成在处理器芯片中。从CPU核引出的地址和数据总线有一端经总线接口引出到芯片引脚上了,还有一端没有引出,而是接到芯片内部集成的设备上,这些设备都有各自的内存地址范围,也可以像访问内存一样访问,很多体系结构(比如ARM)采用这种方式操作设备,称为内存映射I/O (Memory-mapped I/O)。但是x86 比较特殊,x86 对于设备有独立的端口地址空间,CPU核需要引出额外的地址线来连接片内设备,访问设备寄存器时用特殊的in/ out 指令,而不是和访问内存用同样的指令,这种方式称为端口I/O (Port I/O)。

5、从CPU的角度来看,访问设备只有内存映射I/O 和端口I/O 两种,要么像内存一样访问,要么用一种专用的指令访问。其实访问设备是相当复杂的,由于计算机的设备五花八门,各种设备的性能要求都不一样,有的要求带宽大,有的要求响应快,有的要求热插拔,于是出现了各种适应不同要求的设备总线,比如PCI 、AGP、USB、1394、SATA等等,这些设备总线并不直接和CPU相连,CPU通过内存映射I/O 或端口I/O 访问相应的总线控制器,通过它再去访问挂在总线上的设备。所以上图中标有“ 设备” 的框,可能是实际的设备,也可能是设备总线的控制器。

6、在x86 平台上,硬盘是ATA 、SATA或SCSI总线上的设备,保存在硬盘上的程序是不能被CPU直接取指令执行的,操作系统在执行程序时会把它从硬盘拷到内存,这样CPU才可以取指令执行,这个过程称为加载(Load)。程序加载到内存之后,成为操作系统调度执行的一个任务,就称为进程(Process)。进程和程序不是一一对应的。一个程序可以多次加载到内存,成为同时运行的多个进程,例如可以同时开多个终端窗口,每个窗口都运行一个Shell进程,而它们对应的程序都是磁盘上的/bin/bash。

7、访问设备还有一点和访问内存不同。内存只是保存数据而不会产生新的数据,如果CPU不去读它,它也不需要主动提供数据给CPU,所以内存总是被动地等待被读或被写。而设备往往会自己产生数据,并且需要主动通知CPU来读这些数据,例如敲键盘产生一个输入字符,用户希望计算机马上响应自己的输入,这就要求键盘设备主动通知CPU来读这个字符并做相应处理,给用户响应。这是由中断(Interrupt )机制实现的,每个设备都有一条中断线,通过中断控制器连接到CPU当设备需要主动通知CPU时就引发一个中断信号,CPU正在执行的指令将被打断,程序计数器会设置成某个固定的地址(这个地址由体系结构定义),于是CPU从这个地址开始取指令(或者说跳转到这个地址),执行中断服务程序(ISR ,Interrupt Service Routine),完成中断处理之后再返回先前被打断的地方执行后续指令。比如某种体系结构规定发生中断时跳转到地址0x0000 0010 执行,那么就要事先把一段ISR 程序加载到这个地址,ISR 程序是由内核代码提供的,中断处理的步骤通常是先判断哪个设备引发了中断,然后调用该设备驱动程序提供的中断处理函数(Interrupt Handler )做进一步处理。

8、由于各种设备的用途各不相同,设备寄存器中每个位的定义和操作方法也各不相同,所以每种设备都需要专门的设备驱动程序(Device Driver ),一个操作系统为了支持广泛的设备就需要有大量的设备驱动程序,事实上,Linux内核源代码中绝大部分是设备驱动程序。设备驱动程序通常是操作系统内核里的一组函数,主要是通过对设备寄存器的读写实现对设备的初始化、读、写等操作,有些设备还要提供一个中断处理函数供ISR 调用。

9、对于32位的CPU,从CPU执行单元这边看地址线是32条(图中只是示意性地画了4 条地址线),可寻址空间是4GB,但是通常嵌入式处理器的地址引脚不会有这么多条地址线,因为
引脚是芯片上十分有限而宝贵的资源,而且也不太可能用到4GB这么大的物理内存。事实上,在启用MMU的情况下虚拟地址空间和物理地址空间是完全独立的,物理地址空间既可以小于也可以大于虚拟地址空间,例如有些32位的服务器可以配置大于4GB的物理内存。我们说32位的CPU,是指CPU寄存器是32位的,数据总线是32位的,虚拟地址空间是32位的,而物理地址空间则不一定是32位的。物理地址的范围是多少,取决于处理器引脚上有多少条地址线,也取决于这些地址线上实际连接了多大的内存芯片。

原文地址:https://www.cnblogs.com/hxu7373/p/3487123.html