5

Это было в моей голове сегодня.

Если в микросхемах ОЗУ содержатся биты, хранящиеся в конденсаторах, находящихся там, то как вы можете извлечь биты откуда-то и поместить их туда, где что-то уже есть?

Например, при загрузке я буду педантичен здесь, чтобы проиллюстрировать мою путаницу:

MOV AL, 07h

Это код, а не данные, поэтому он будет частью команды, загруженной в ОЗУ, но внутри ОЗУ ОЗУ есть биты. По этой логике, как можно переместить бит туда, где уже есть другой?

Потому что обычно процессор извлекает байты через шину из ОЗУ, независимо от того, является ли это кодом или данными, чтобы определить, что с ним делать.

Итак, мой вопрос, если он не был ясен:

Как это имеет смысл, что байты / биты перемещаются в ОЗУ, когда ОЗУ уже занимает биты, т.е. "2 ГБ DIMM без буферизации".

ОЗУ содержит биты, размещенные в конденсаторах. Так какой смысл в том, что BIOS/ встроенное ПО устанавливает регистр IP ЦП на следующую инструкцию, когда ОЗУ ВСЕГДА занимает биты перед загрузкой?

Извините, если не по теме.

6 ответов6

9

Если микросхемы ОЗУ содержат биты, хранящиеся в конденсаторах, стоящих там, ...

RAM (Random Access Memory) - это общий термин, но вы используете его особым образом.
Обычно компьютеры используют три основных типа оперативной памяти для основной памяти:

  • ферритовая (базовая) память: этот тип оперативной памяти использовался в компьютерах, пока полупроводниковая память не вступила во владение в 1970-х и 1980-х годах. Это было энергонезависимое воспоминание; Вы можете отключить питание компьютера и включить его на следующий день или неделю, и ваша программа останется в памяти.
  • статическая память: полупроводниковая память, которая является быстрой, но дорогой и менее плотной, чем DRAM. Эта память использует активную схему (то есть транзисторы) для сохранения состояния бита.
  • динамическая память: полупроводниковая память, которая чаще всего используется для основной памяти ПК. DRAM использует конденсатор и логику обновления для сохранения своих битовых значений.

... как вы можете вытащить биты откуда-то и положить их туда, где что-то уже есть?

Это сформулировано так, как если бы биты были физическими объектами, которые не могут быть смещены.
"Биты", которые перемещаются, являются просто значениями и не являются физическими объектами (если они фактически не ссылаются на что-то физическое, такое как регистр или ячейка памяти), даже если эти значения часто рассматриваются как элементы.

"Биты" в ОЗУ - это просто логические состояния или условия существования. Вы можете поднять руку или опустить руку: это два состояния.
Каждая ячейка в ОЗУ может изменить свое состояние (так же, как вы можете поднять или опустить руку).
Операция записи вызывает это изменение состояния. Предыдущее состояние ячейки памяти потеряно навсегда.

... когда оперативная память уже занимает биты, т.е. "2 ГБ DIMM без буферизации".

Это довольно неловкая формулировка.
RAM (физический элемент) не может "занимать" "биты" (которые являются логическими состояниями).
DRAM (и SRAM) будут иметь мусорные (случайные) значения при включении питания, пока не будет записано каждое местоположение.
В общем случае считывание памяти, в которую ранее не было записано (и, следовательно, имеет известное значение), является ошибкой программирования / логики.

ОЗУ имеет биты, сидящие в конденсаторах, ...

Старайтесь не рассматривать "биты" как физические объекты, когда атрибут, который вас действительно интересует, является просто их значением.

... так как это имеет смысл, что BIOS/ прошивка устанавливает IP-регистр процессора для следующей инструкции ...

Первый шаг в "загрузке" - это операция "перезагрузки", которая инициализирует счетчик программ (ПК), или вы, кажется, предпочитаете "регистр IP" (указатель инструкций?) известной стоимости.
Предполагается, что загрузочная программа существует по этому "адресу сброса".
Компьютеры, которые использовали ферритовую память, часто выделяют эту область памяти по "адресу сброса" для хранения программы начальной загрузки.
Современные компьютеры используют энергонезависимую память, такую как PROM, EPROM, EEPROM или флэш-память по "адресу сброса" для хранения программы начальной загрузки.

когда ОЗУ ВСЕГДА занимает биты перед загрузкой?

Вот эта неловкая фраза снова.
Компьютер обычно построен так, что "адрес сброса" указывает на программу начальной загрузки в энергонезависимой памяти.
Если память является энергозависимой, то некоторый механизм (независимый от схемы включения и сброса) должен был бы инициализировать эту RAM с помощью надлежащей программы начальной загрузки. Передняя панель компьютера (что никогда не входит в состав IBM-совместимого ПК) может использоваться для ручного ввода программы начальной загрузки в ОЗУ.

ДОПОЛНЕНИЕ

Возможно, то, что может помочь мой первый учитель программирования в нашей голове:

  • Операция чтения (из памяти, регистра или переменной) является неразрушающей.
    Местоположение не изменит свое значение при чтении. Повторные чтения вернут то же значение.
    (Да, есть некоторые исключения: автоинкрементные ячейки памяти; отображаемые в памяти порты ввода-вывода; некоторые типы ОЗУ имеют деструктивное чтение и перезаписываются внутри после каждого чтения.)
  • Операция записи (памяти, регистра или переменной) является разрушительной.
    Новое значение заменит предыдущее значение. Вы не можете получить предыдущее значение, как только оно будет перезаписано.
2

Поймите, что "бит" - это не реальный физический объект, это "состояние" ячейки памяти. Заданная ячейка памяти может иметь значение 0 или 1, и это немного.

Когда данные "перемещаются" в память, это означает, что данные считываются с диска в виде электрических сигналов (вроде телеграфных сигналов), а затем данные используются для установки нового состояния отдельных ячеек памяти.

В очень упрощенной модели ("реальная жизнь", конечно, намного сложнее) представьте, что данные поступают с диска в виде серий нулей и единиц. Предположим, что это очень медленный диск, и с диска приходит один бит в секунду. Таким образом, ваша инструкция MOV может быть что-то вроде 1 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 , где каждый 1 представлен 1 вольт на проводе и каждый 0 представлен 0 вольт на проводе. И мы скажем, что каждый бит (1 или 0) отделяется от следующего на одну секунду.

Затем нам понадобится некоторая "логика" ("ворота" и "триггеры" в интегральных схемах), которая получает эти данные и помещает их в оперативную память.

Оперативная память организована в матрице XY. Предположим, у нас очень маленькая оперативная память размером всего 8x8 бит (всего 64 бита). Чтобы выбрать конкретную ячейку памяти, через массив проходит 16 проводов, 8 горизонтальных и 8 вертикальных. На стыке каждого провода расположена ячейка памяти (конденсатор в большинстве случаев). Кроме того, ко всем ячейкам подключены три других провода: DataIn, DataOut и Write.

Память выглядит примерно так:

   Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8
X1 b  b  b  b  b  b  b  b
X2 b  b  b  b  b  b  b  b
X3 b  b  b  b  b  b  b  b
X4 b  b  b  b  b  b  b  b
X5 b  b  b  b  b  b  b  b
X6 b  b  b  b  b  b  b  b
X7 b  b  b  b  b  b  b  b
X8 b  b  b  b  b  b  b  b

Где каждый "b" - это ячейка памяти, которая может содержать 1 или 0. (Проводники DataIn, DataOut и Write не показаны.)

Если я положу 1 вольт в самый верхний горизонтальный провод и самый левый вертикальный провод, то любое значение, хранящееся в ячейке (конденсаторе) на стыке этих двух проводов (1 или 0), будет "считано" и выйдет через провод DataOut. Если, с другой стороны, я поставлю 1 или 0 на проводе DataIn и наложу импульс на провод записи, старое содержимое выбранной ячейки будет забыто (напряжение, сохраненное в конденсаторе, будет изменено), и любое значение будет на проводе DataIn сохраняется в ячейке.

Поэтому, если я просто подключу этот провод от дисковода к проводу DataIn памяти, а затем начну переключать другие провода, я могу записать данные диска в оперативную память. Мне нужно иметь "логику", которая будет выбирать разные провода X и Y массива памяти раз в секунду. Если провода X и Y пронумерованы X1 ...X8 и Y1 ...Y8, они будут выбраны (т. Е. Приложены +1 вольт) в следующем порядке: X1 & Y1, X1 & Y2, X1 & Y3, ...X1 и Y8, X2 и Y1, X2 и Y2, ...X8 и Y8. И каждый раз, когда проводники менялись, провод записи был импульсным.

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

В любом случае, после прочтения вышеуказанных данных, они попадут в нашу оперативную память 8x8 следующим образом:

1 0 0 1 1 0 0 0 
0 0 0 0 0 1 1 1
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x

Как только вся программа будет прочитана, компьютер может начать "извлекать" инструкции из этого небольшого фрагмента памяти и выполнять их. (По сути, в случае последовательности загрузки микропрограмма BIOS выполняет инструкцию ветвления, используя адрес ОЗУ нашей извлеченной инструкции в качестве цели ветвления.) "Извлечение" включает в основном повторение вышеуказанной последовательности только без пульсации провода записи, поэтому данные ОЗУ поступают по проводу DataOut.

1

Операция записи в память изменит существующие биты в желаемое состояние. Нет такой вещи, как "неустановленные" биты, они всегда равны 0 или 1.

Как насчет включения питания? Обычно это случайное состояние, но, тем не менее, определенное состояние. Если с момента предыдущего отключения питания прошло не так много времени, вы можете восстановить действительные данные.

1

Ваш основной вопрос, по-видимому, таков: «Как можно переместить бит туда, где уже есть другой?"

Вы можете думать о нем как о переключателе, который находится либо в положении "0", либо в положении "1". Вы можете думать о памяти как о группе переключателей, каждый из которых находится либо в позиции "0", либо в позиции "1", таким образом, сохраняя биты информации. Чтобы немного переместиться туда, где уже есть другой, просто установите второй переключатель так, чтобы его положение совпадало с первым.

0

Я вижу, что ты совсем запутался. :-)

Во-первых, код - это данные, это просто данные, которые имеют особое значение для процессора [1].

Во-вторых, "биты" - это уровни заряда, движущиеся, как водопроводная вода, по проводам логики. Обратите внимание, что уровень заряда (напряжение) не является действительным электроном, движущимся вокруг: хотя электроны действительно двигаются, они движутся довольно медленно по сравнению с изменением напряжения.

ОЗУ означает память с произвольным доступом, а D в DRAM означает "динамический", потому что без обновления он не длится долго. Современные чипы имеют внутреннюю логику обновления, которая считывает все биты и записывает их обратно, что приводит к перезарядке магазина. Почти все ОЗУ хранят биты как два уровня заряда, например, потенциал 0 вольт для логической 0 и потенциал 1,5 вольт для логической 1. Возможно, хотя и не совсем, иметь многозначные биты, поэтому 0 .. 0,1 вольт для 0, 0,9 .. 1,1 вольт на 1, 1,9 .. 2,1 вольт для 2 и 2,9 .. 3,1 вольта на 3, для ячейки, хранящей 2 бита (двоичные цифры) данных.

Фактические напряжения, используемые в логике (память или иное), не важны, но, конечно, каждый конец компонентов, соединяющих провода, должен согласовывать их. Если вы посмотрите на электронные таблицы данных, вы найдете утверждение о напряжениях, которые чип интерпретирует как каждый логический уровень. Обычная логика TTL при напряжении 5 вольт (номинальное) была между 0 и 0,5 В - это логическая 0, а от 3,5 до 5,1 В - логическая 1.

Когда место в памяти записывается, электроника устанавливается таким образом, чтобы все, что там было, было перезаписано - будь то 0 или 1. Иногда эта логика работает "неправильным" образом: "естественным" значением является логика 1, а значение, которое должно быть принудительно установлено, равно 0. В любом случае, это все в микросхеме DRAM: все остальное считает, что память - это место, которое можно записывать и переписывать столько и так часто, как это необходимо. Если вам интересно, что случилось со "старыми" данными, заряд отправляется на землю, и это является одной из причин того, что чипы потребляют энергию.

Когда процессор извлекает код из памяти, он отправляется через последовательность этапов: они служат для ускорения работы процессора. Многие современные процессоры также микропрограммированы: внутренняя логика запускает несколько "инструкций" от одной входящей, и эти внутренние инструкции находятся на более низком уровне. Чтобы понять все это правильно, вам нужно понять внутренности процессора, и x86 - не то место, с которого нужно начинать! Что-то проще было бы Rockwell 6502 (Acorn BBC / C = 64 и др.). Более того, люди написали эмуляторы, чтобы вы могли очень легко играть во все виды игр.

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

BIOS на ПК - это код, который процессор x86 запускает при загрузке. Когда-то это также использовалось во время исполнения ОС. При загрузке задача состоит в том, чтобы перевести все оборудование в хорошее (а не только стабильное) состояние, настроить таблицу с описанием оборудования, которое ОС будет использовать позже, найти загрузочный диск и, в случае успеха, загрузить первый сектор с диска в RAM и прыгайте в нее, ожидая, что этот сектор будет содержать загрузочный код.

Реальные ПК сложнее, чем это, и EFI тоже усложняет ситуацию, поэтому я настоятельно рекомендую начать с 8-битных микросхем, поскольку они проще как внутри, так и уже.

НТН

[1] Некоторые процессоры отличают микросхемы памяти, используемые для кода, от чипов, используемых для данных, который называется "Гарвардская" архитектура памяти. Тем не менее, "код это данные" все еще верно даже тогда.

0

"Бит" памяти - это просто схема, которая остается равной единице, если вы устанавливаете ее на единицу, и остается равной нулю, если вы устанавливаете ее на ноль.

Биты не "занимают память", это значения, хранящиеся в цепях памяти.

Существует несколько различных конструкций памяти, но это не очень важно для вашего вопроса. По сути, ОЗУ реализовано в виде схемы, которая сохраняет себя "включенной", если она включена, и сохраняет себя "выключенной", если она выключена. Конденсаторы используются в "динамической" памяти, но не во всех типах памяти.

Загрузка программы в память просто заставляет аппарат "записывать" значения в память. Запись в этом контексте означает, установить соответствующие биты в 0 или 1 соответственно. После изменения значения ячейки памяти оно остается на этом значении, пока оно не будет изменено.

Микросхемы памяти предоставляют способ дать им адрес и способ сообщить им, читаете ли вы или пишете.

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

  • При записи ЦП должен направлять провода шины данных соответственно на высокий или низкий уровень, чтобы передавать значение в микросхему памяти. Микросхема памяти обновит биты памяти по предоставленному адресу, чтобы они были идентичны "записываемому" значению, заставляя их удерживаться, если записано 1, и удерживать себя, если записывается 0.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .