Большие-маленькие порядковые детали при чтении байтов (ячейка памяти) - PullRequest
0 голосов
/ 06 мая 2019

Предположим использовать это 32-битное число 66 DD FA EB.

Little Endian

0 x 100 ---> 66 (MSB)

0 х 99 ---> ДД

0 x 98 ---> FA

0 x 97 ---> EB (LSB)

Big Endian

0 x 100 ---> EB (LSB)

0 x 99 ---> FA

0 x 98 ---> DD

0 x 97 ---> 66 (MSB)

Я считаю, что понял правильный порядок, в котором хранятся байты.

Однако мой вопрос: какой байт читается первым при обращении к этому 4-байтовому слову?

это всегда байт с самым низким адресом, который нужно сначала прочитать, а затем расположить так, чтобы он был наиболее значимым или наименее значимым в зависимости от порядкового номера компьютера?

Я пытаюсь объяснить себя лучше. Возьмите приведенный выше пример LITTLE ENDIAN.

Правильный порядок, который я хочу получить - 66 DD FA EB

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

         EB 

      FA EB

   DD FA EB

66 DD FA EB

Результат - 66 DD FA EB, и это правильно.

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

66

66 DD

66 DD FA

66 DD FA EB

Результат всегда 66 DD FA EB, и это правильно.

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

Итак, мой последний вопрос,

Какой из двух режимов, которые я показывал ранее, используется компьютером с прямым порядком байтов для чтения 4-байтового слова в предлагаемом примере?

1 Ответ

0 голосов
/ 06 мая 2019

Одна вещь не имеет ничего общего с другой, как уже упоминалось несколько раз в комментариях.Шины основной памяти имеют ширину не менее 32 бит, но чаще 64, и все транзакции имеют такой размер.Ладно, это тоже неправда, и это более важно.Существует много шин, один / несколько на краю ядра процессора, затем вы проходите через mmus и кэш-память и переходите на шины уровня микросхемы, а затем выходите из шин микросхемы.На чипе вы шириной не менее 32 бит, но, скорее всего, 64 или в два раза больше.Когда вы уходите от чипа в системную память, обычно это происходит в зависимости от технологии.контроллеры и различные шины между кешем и внешним интерфейсом управляют количеством транзакций шины для каждого уровня.На сервере или настольном компьютере вполне вероятно, что у вас есть 64- или 72-битные интерфейсы (последний с ecc).Для телефона ddr4 - это 16-битная шина, поэтому ваша строка кэша разбита на множество 16-битных транзакций или 32 с момента его ddr (данные за любой такт полуцикла, а не только один бит за такт, то есть имя).Таким образом, вы можете считать это как 16 или 32. Ваш ноутбук может иметь 32/40-битную карту памяти, но я некоторое время не подсчитывал контакты.

По вашему вопросу, хотя, если вы вернетесь к машине обратного хода, это все равно зависит, 32-битная транзакция, вероятно, была бы обработана 32-битной шиной и 32-битной памятью, будь то 4 8-битные шины или 216 или 32. Но даже если они не совпадают, это зависит от разработчика системы, поскольку у нас не было много систем на чипе, тогда это был процессор, тогда как периферия и тому подобное были на других чипах.Поэтому разработчик контроллера памяти мог выбрать, какую байтовую транзакцию делать первой.И это было бы вообще произвольно.

То же самое относится и к байту.Там есть проблема, если каково ваше определение «большой против маленького».То, как вы открыли свой вопрос, не имеет никакого смысла для меня ... 0x11223344 32-битное значение 0x44 является наименее значимым байтом, и это всегда так, порядковый номер не имеет к этому никакого отношения.Теперь его адрес при рассмотрении в байтовой адресации может заканчиваться 2b00 или 2b11, то есть ваши байты.Но у нас есть процессоры с байтовым инвариантом be8 и процессоры с инвариантом слова be32, о чем вы обычно думаете, но arm переключился на байтовый инвариант, поэтому слова меняются местами, но байты находятся по одному и тому же адресу (в зависимости от размера транзакции).Сумасшедший, верно?затем, конечно, существует порядок битов, где 0x44 может быть битами 7..0, а некоторые процессоры рассматривают биты 0x44 24..31.

Суть в том, что нет точного ответа, это зависит только от разработчиков системного уровня, и это не означает, что одни только процессоры, вы можете взять 68 КБ, подключить его к 8-битной памяти и вытащить словоразмер транзакции в любом понравившемся вам порядке A [1: 0] = 2b11, 2b10, 2b01, 2b00 или 2b00, 2b01, 2b10 2b11, для вас не имеет значения и не влияет на сам процессор, поскольку вы передаете ему полное слово, как только высобрать байты.

Системы, которые были разработаны или в эпоху 8-битных шин, не обязательно имели 32-битные транзакции.возможно, 16, но вы, скорее всего, разместите две 8-битные части и будете управлять выходом и разрешением записи, а не добавлять состояния ожидания, особенно в ту эпоху.Таким образом, 8088 против 8086. Один создан для использования с 8-битной памятью, возможно, с одной деталью, а другой для систем с 16-битной шириной первоначально две части 8-битной ширины превращаются в 16-битные компоненты по мере увеличения спроса.

На этот вопрос нет однозначного ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...