2012-02-11 3 views
1

Я ищу чтение отдельных бит из памяти (RAM, harddisk). Я понял, что нельзя читать меньше байта. Однако я прочитал, что кто-то говорит, что это можно сделать с помощью сборки. Я использую использование полосы пропускания как можно ниже, а получаемые данные не являются последовательными, поэтому я не могу прочитать байт и преобразовать его в 8 бит.Чтение бит из памяти

+0

Что вы подразумеваете под «данные не последовательны»? –

+0

Я выбираю биты из разных мест по всей памяти и не могу читать строки бит. – RobotRock

+0

Итак, вы имеете в виду, что * доступ к * не является последовательным. –

ответ

4

Я не думаю, что процессор будет читать меньше, чем размер строки кэша из ОЗУ (64 байта на последних чипах Intel). С диска минимум составляет обычно 4 кБ.

Чтение одного бита за раз не является ни возможным, ни необходимым, поскольку шина данных намного шире.

+0

Путь лучший ответ :-) – cnicutar

1

Вы не можете прочитать меньше байт с любого компьютера или жесткого диска, о котором я знаю. Даже если бы вы могли, это было бы крайне неэффективно.

Некоторые машины имеют порт памяти, сопоставленный с памятью, который может считывать/записывать меньше байта в порт, но он по-прежнему отображается, когда вы получаете его как минимум байт.

Используйте битовые операторы обрывать определенные биты, как в:

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 
0

Раньше, скажем, 386/486 дней, когда память была немного в ширину, 1 МОм на 1 бит, но вы будет иметь 8 или несколько кратных фишек, по одному для каждой битовой полосы на шине, и вы могли бы читать только по ширине шины. сегодня память является байтом в ширину, и вы можете читать только в единицах 32 или 64 или несколько из них. Даже когда вы читаете байт, большинство проектов заполняют весь байт. он добавляет излишне усложнение/стоимость, чтобы изолировать шину до упора в память, чтение байта смотрит на большую часть системы как на 32 или 64 бит, так как она приближается к краю процессора (иногда физические контакты, иногда край сердечника внутри чипа), когда отдельная байтовая полоса отделена, а остальные биты отбрасываются. После того, как кеш изменит наименьший делимый размер чтения из памяти, вы увидите всплеск или блок чтения.

можно создать систему памяти шириной 8 бит и читать 8 бит за раз, но зачем вам? если он не является 8-битным процессором, который, вероятно, вы не можете использовать в памяти 8 бит на 2 гигабайта. В любом случае, драфт довольно медленный, что-то вроде 133 МГц (даже ваша память с разрешением 1600 МГц занимает короткий промежуток времени, когда вы читаете медленные партии, память не ускорилась за последние 10 лет).

Жесткие диски похожи, но разные, я думаю, что секторы являются наименьшим делимым элементом, вы должны читать или писать в этих единицах. поэтому при чтении у вас есть цикл памяти на процессоре, не что иное, что происходит в памяти, и в зависимости от контроллера либо перед чтением, либо в результате сектор считывает диск в буфер, в отличие от прочитайте строку кэша, затем ваш цикл памяти в буфер в контроллере диска либо вызывает чтение ширины шины, либо процессор делит его, либо если шина добавляет сложности для выделения байтовых полос, тогда вы изолируете байт, но никто не изолирует битовые полосы. (Я говорю слово никому, а кто-то вернется с исключением ...)

Большая часть этого документа хорошо документирована, а не сложно найти. Для игровых платформ ищите спецификации amba и/или axi, свободно загружаемые. количество мостов, контроллеров pcie, документов контроллера диска доступно для ПК и других платформ. он по-прежнему сводится к адресной и информационной шине или одной шине данных oneouta и одной шины и некоторым управляющим сигналам, которые указывают тип доступа. некоторые шины имеют байтовую полосу, что обычно означает, что запись не читается. Если я хочу писать только байт в драм в современной 64-битной системе, я должен сказать всем почти всю дорогу до драма, что я хочу написать.Чтобы записать байт на модуль памяти, к которому необходимо получить доступ по 64 бита за раз, как минимум, 64-битное считывание происходит во временное место либо в кеше, либо в контроллере памяти, а затем записываемый байт модифицирует конкретный байт в пределах 64-битное слово, то это 64-разрядное количество, в конце концов, записывается обратно в модуль памяти. Вы можете сделать это, используя комбинацию адресных битов и нескольких управляющих сигналов, или вы можете просто поместить 8 байт-полосу, а нижние адресные биты можно игнорировать. Жесткий диск, то же самое дело, должен читать сектор, изменять один байт, а затем писать весь сектор за раз. со вспышкой и eeprom, вы можете писать только нули (с точки зрения программистов), вы стираете их (с точки зрения программистов, на самом деле это нуль в логике, есть инверсия), а запись должна быть сектором при время, секторы могут быть 64 байта, 128 байтов, 256 байтов.