Шина данных и адресация памяти путаницы

Я узнал, что процессор 8086 имеет 16-битную шину данных, а процессор Pentium имеет 32-битную шину данных, что означает, что каждый адрес памяти содержит размер шины данных.

Например:

16bit = 2^16 = 65,536 
binary 0000 0000 0000 0000 ~ 1111 1111 1111 1111
hex    0000 0000 ~ FFFF FFFF
dec    000,000 ~ 65,535

65,536 / 1024 = 64 so can be 64kbyte of maximum memory address.
like 0x 0000,0000 ~ 0x FFFF,FFFF  


32bit = 2^32 = 4,294,967,296
binary 0000 0000 0000 0000 0000 0000 0000 0000 
~ 1111 1111 1111 1111 1111 1111 1111 1111
hex    0000 0000 0000 0000 ~ FFFF FFFF FFFF FFFF
dec    0,000,000,000 ~ 4,294,967,296

4,294,967,296 / 1024 / 1024 = 4 so can be 4mb of maximum memory address 
like 0x 0000,0000,0000,0000 ~ 0x FFFF,FFFF,FFFF,FFFF

Я прав? Я думаю так. Но в программировании на С:

int arr[2];
printf("%p %p \n", &arr[0],&arr[1]);
-----------------------------------
0x 7fff5c474b20,  0x 7fff5c474b24  (this is 64bit addressing)

Я знаю, что целое число составляет 4 байта. Размер &arr[1]-&arr[0] является 0x4 это означает, что каждый адрес содержит только 8-битную шину данных.

Если процессор может хранить более 8 бит, почему C содержит только 8 бит?

2 ответа

Решение

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

  • шина данных имеет ширину 16 бит, что означает, что она может передавать 2 байта за одну операцию
  • адрес, но имеет ширину 20 бит, это означает, что адреса памяти находятся в диапазоне 0 - 0xFFFFF или 1M

8086 использовал режим адресации на основе: адрес был представлен сегментом (16-битным регистром) и смещением, фактический адрес был segment * 16 + offset - кстати, адреса имели различное представление, например, 0x20010 можно было бы представить как 2000:0010 или 2001:0000, 1FFF:0020.

И... на 8086 не было 64-битного режима адресации!

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

Тот факт, что шина данных имеет ширину 16, 32 или 64 бита, просто позволяет одному доступу к памяти загружать соответственно 2, 4 или 8 байтов за одну операцию. Некоторые процессоры (например, ARM) требуют правильного выравнивания многобайтовых обращений к памяти: например, вы можете прочитать 16-битное слово только по четным адресам, а любая попытка прочитать 16-битную работу с нечетного адреса приведет к перехвату процессора,

И помните, что ничто (кроме простоты) не заставляет разработчика процессора иметь шину данных и шину адреса одинакового размера.

На x86 каждый отдельный адрес обращается к байту 8 бит.

Ширина шины данных означает, что процессор может получать столько битов параллельно. А на самом деле процессоры Pentium имеют 64-битную шину данных (процессоры с перегрузкой, которые можно установить на 486 материнских платах, тем не менее имеют 32-битную шину), поэтому они могут извлекать 8 последовательных 8-битных байтов одновременно.

Скажем, если процессор выдает чтение памяти, например, для адреса 0x00001230, он может одновременно извлекать байты с адресами от 0x00001230 до 0x00001237 (8 байтов) во внутренний кэш.

Другие вопросы по тегам