Memory 从记忆中读一点

Memory 从记忆中读一点,memory,assembly,bit,Memory,Assembly,Bit,我正在研究从内存(RAM、硬盘)中读取单个位。我的理解是,一个人读不到一个字节。 然而,我读到有人告诉我可以用汇编完成。 我不希望带宽使用率尽可能低,而且要检索的数据不是连续的,因此我无法读取一个字节并将其转换为8位。我认为CPU从RAM读取的数据不会小于缓存线的大小(在最近的英特尔芯片上为64字节)。从磁盘上看,最小值通常为4kib 一次读取一个位既不可能也不必要,因为数据总线比这宽得多。我认为CPU从RAM读取的数据不会小于缓存线的大小(在最近的英特尔芯片上为64字节)。从磁盘上看,最小值通

我正在研究从内存(RAM、硬盘)中读取单个位。我的理解是,一个人读不到一个字节。 然而,我读到有人告诉我可以用汇编完成。
我不希望带宽使用率尽可能低,而且要检索的数据不是连续的,因此我无法读取一个字节并将其转换为8位。

我认为CPU从RAM读取的数据不会小于缓存线的大小(在最近的英特尔芯片上为64字节)。从磁盘上看,最小值通常为4kib


一次读取一个位既不可能也不必要,因为数据总线比这宽得多。

我认为CPU从RAM读取的数据不会小于缓存线的大小(在最近的英特尔芯片上为64字节)。从磁盘上看,最小值通常为4kib


一次读取一个位既不可能也不必要,因为数据总线比这宽得多。

据我所知,从任何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

据我所知,你不能从任何电脑或硬盘上读取少于一个字节的数据。即使你可以,它也会非常低效

有些机器的内存映射端口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

过去,比如说386/486天,内存有点宽,1兆乘以1比特,但是你会有8个或多个芯片,总线上每个比特通道一个,你只能读取总线的宽度。今天,内存是一个字节宽的,你只能以32或64或其倍数读取。即使读取一个字节,大多数设计也会填充整个字节。它增加了不必要的复杂性/成本,为了将总线一直隔离到内存,字节读取在系统的大多数情况下看起来是32位或64位读取,因为它接近处理器的边缘(有时是物理引脚,有时是芯片内核心的边缘)当单个字节通道被分离出来,其他位被丢弃时。打开缓存会更改内存中最小的可分割读取大小,您将看到一个突发或读取块

设计一个8位宽、一次读取8位的内存系统是可能的,但为什么呢?除非它是一个8位处理器,你可能无法利用8bit×2G的内存。不管怎么说,dram的速度相当慢,大约133MHz(即使是1600mhz的内存,当您从慢部件读取时,也只是短暂的突发,内存在10年多的时间里并没有变得更快)

硬盘是相似但不同的,我认为扇区是最小的可分割单元,你必须读或写这些单元。因此,在读取时,处理器上有一个内存周期,这与进入内存没有什么不同,取决于执行读取之前的控制器,或因此,磁盘的扇区被读取到缓冲区中,与缓存线读取不同,然后,磁盘控制器中缓冲区的内存周期要么导致总线宽度读取,处理器将其分割;要么如果总线增加了隔离字节通道的复杂性,则隔离一个字节,但没有人隔离位通道。(我说没有人会回来,有人会回来,只有例外…)


其中大部分都有很好的记录,不难找到。对于arm平台,可免费下载amba和/或axi规范。网桥、pcie控制器、磁盘控制器文档的数量都可用于PC和其他平台。它仍然可以归结为一个地址和数据总线或一个goesouta和一个goesinta数据总线以及一些指示访问类型的控制信号。某些总线具有字节通道启用,这通常用于写入而不是读取。在现代的64位系统中,如果我只想向dram写入一个字节,我必须告诉所有人我要写入的内容。要在一次必须访问64位的内存模块上写入一个字节,至少会在缓存或内存控制器的临时位置发生64位读取,然后要写入的字节修改64位字中的特定字节,然后该64位量最终会写回内存模块本身。您可以使用地址位和一些控制信号的组合来实现这一点,也可以只启用8字节的通道,而忽略较低的地址位。硬盘,同样的处理,必须读取一个扇区,修改一个字节,然后最终一次写入整个扇区。使用闪存和eeprom,您只能写入零(从程序员的角度),擦除为一(从程序员的角度,实际上是逻辑中的零,有一个反转),每次写入必须是一个扇区,扇区通常可以是64字节、128字节、256字节。

过去是,比如386/486天,内存有点宽,1兆乘以1比特,但是你会有8个或更多的芯片,总线上每个比特通道一个,你只能读取总线的宽度。今天,内存是一个字节宽的,你只能以32或64或其倍数读取。即使读取一个字节,大多数设计也会填充整个字节。它增加了不必要的复杂性/成本,为了将总线一直隔离到内存,字节读取在系统的大多数情况下看起来是32位或64位读取,因为它接近处理器的边缘(有时是物理引脚,有时是芯片内核心的边缘)当单个字节通道被分离出来,其他位被丢弃时。打开缓存会更改内存中最小的可分割读取大小,您将看到一个突发或读取块

有可能