我正在研究从内存中读取单个位(RAM,硬盘)。我的理解是,一个读不到一个字节。 但是我读了一些人告诉它可以用汇编来完成。 我想带宽使用率尽可能低并且要检索的数据不是连续的,所以我无法读取一个字节并将其转换为8位。
答案 0 :(得分:4)
我认为CPU的读取速度不会低于RAM的缓存行数(最近英特尔芯片上的64字节)。从磁盘,最小值通常为4 kiB。
一次读取一个位既不可能也不必要,因为数据总线要宽得多。
答案 1 :(得分:1)
您不能从我知道的任何PC或硬盘读取少于一个字节。即使你可以,也会非常低效。
有些机器执行的内存映射端口io可以读取/写入少于一个字节的端口,但是当它至少获得一个字节时它仍会显示出来。
使用按位运算符选择特定位,如下所示:
char someByte = 0x3D; // In binary, 111101
bool flag = someByte & 1; // Get the first bit, 1
flag = someByte & 2; // Get the second bit, 0
// And so on. The number after the & operator is a power of 2 if you want to isolate one bit.
// You can also pick off several bits like so:
int value = someByte & 3; // Assume the lower 2 bits are interesting for some reason
答案 2 :(得分:0)
过去是386/486天,其中内存有点宽,1兆比特1比特,但你会有8个或多个芯片,一个用于总线上的每个比特通道,以及你只能读取公交车的宽度。今天的记忆是一个字节宽,你只能读取32或64或那些的倍数。即使您读取一个字节,大多数设计都会填充整个字节。它增加了不必要的复杂性/成本,将总线一直隔离到存储器,当读取接近处理器的边缘时,字节读取将大部分系统视为32或64位读取(有时是物理引脚,有时是芯片内部的核心边缘是当单个字节通道被分离出来而其他位被丢弃时。启用缓存会从内存中更改最小的可分割读取大小,您将看到一个突发或读取块。
可以设计一个8位宽的存储器系统,一次读取8位,但为什么会这样?除非它是一个8位处理器,你可能无法利用8位乘2 gig内存。无论如何,dram非常慢,类似于133 mhz(即使你的1600mhz内存只是短暂的爆发,因为你从缓慢的部分读取,内存在10年内没有变得更快)。
硬盘类似但不同,我认为扇区是最小的可分割单元,你必须读取或写入这些单元。所以当读取你在处理器上有一个内存周期时,没有什么不同于内存,并且在你执行读取之前取决于控制器,或者因此,扇区被读取磁盘,进入缓冲区,而不像读取高速缓存行,然后你的内存周期到磁盘控制器中的缓冲区会导致读取总线宽度并且处理器将其分开,或者如果总线增加了隔离字节通道的复杂性,那么你会隔离一个字节,但没有人隔离位通道。 (我说没有人这个词,有人会以异常的方式回来......)
大部分内容都有详细记载,不难找到。对于手臂平台,可以自由下载amba和/或axi规格。桥接器,pcie控制器,磁盘控制器文件的数量均可用于PC和其他平台。它仍然归结为一个地址和数据总线或一个goouta和一个gointa数据总线和一些指示访问类型的控制信号。一些总线具有字节通道使能,这通常用于写入而不是读取。如果我想在现代64位系统中只向一个dram写一个字节,我必须告诉所有人几乎所有我想写的东西。要在必须一次访问64位的内存模块上写入一个字节,至少64位读取发生在缓存或内存控制器的临时位置,那么要写入的字节会修改内部的特定字节。 64位字,然后最终64位数量被写回到存储器模块本身。您可以使用地址位和一些控制信号的组合来完成此操作,或者您可以将8字节通道启用,并且可以忽略较低地址位。硬盘,同样的交易,必须读取扇区,修改一个字节,然后最终一次写入整个扇区。使用flash和eeprom,你只能写零(从程序员的角度来看),你擦除到1(从程序员的角度来看,逻辑中实际上是零,有一个反转)并且写入必须是一个扇区时间,扇区可以是64字节,128字节,通常是256字节。