Чтение немного из памяти - PullRequest
1 голос
/ 11 февраля 2012

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

Ответы [ 3 ]

4 голосов
/ 11 февраля 2012

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

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

1 голос
/ 11 февраля 2012

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

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

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

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 голосов
/ 11 февраля 2012

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

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

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

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

...