6

Как программа, работающая на ЦП (в основном ОС), может получить доступ к другому оборудованию ПК? Такие как видеокарта, HDD и тд?

Из того, что я прочитал, в DOS это было сделано с помощью вызовов BIOS, в частности, инструкции INT. Но инструкция INT должна переходить только на определенное место в оперативной памяти. Итак, как может какая-то программа, хранящаяся в ОЗУ, получить доступ к другому компьютерному оборудованию, когда ЦП может получать доступ только к ОЗУ и получать прерывания?

Windows также использует инструкции INT, или есть новый способ взаимодействия с оборудованием?

4 ответа4

9

Как можно запрограммировать запуск на ЦП (в основном на ОС) на другом ПК? Такие как видеокарта, HDD и тд?

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

Для 32/64-битных защищенных режимов, используемых в MS Windows 95 и новее, или Linux на процессоре x86 (IA-32), программные прерывания (такие как код операции INT для x86) переходят в соответствующую таблицу векторов прерываний (или отправляют). таблица), которая может указывать центральному процессору, где в ОС процесс должен перейти к обработчику прерываний (или программе обработки прерываний, ISR) для обработки запроса.

В реальном режиме x86, как и в MS-DOS, они могут обрабатываться BIOS, который предоставляет подробные сведения о низкоуровневой реализации для этой конкретной системы / чипсета / материнской платы.

[H] Может ли какая-то программа, хранящаяся в ОЗУ, получить доступ к другому компьютеру, если ЦП может обрабатывать только ОЗУ и получать прерывания?

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

Существуют различные механизмы, в том числе

(Src: CS 473 - IO, Университет штата Нью-Мексико, Пфайффер, 2006)

Самым простым является ввод-вывод с отображением в память, где адрес памяти может быть сопоставлен с регистрами аппаратного устройства (например, последовательного UART) и ЦП, а также записывать и / или считывать определенные адреса памяти для прямого доступа к аппаратному обеспечению. Это быстро и просто, но уменьшает диапазон адресов памяти, который можно использовать в качестве ОЗУ.

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

В самой ОС их обычно называют драйверами устройств, так как они содержат конкретные сведения об аппаратных устройствах, которые они поддерживают.

И использует ли Windows инструкции int, или есть какой-то новый способ связи с HW?

Да и да, но я думаю, что объяснил это.

4

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

Самым простым для понимания являются порты ввода / вывода. Программное обеспечение использует инструкцию OUT для одновременной записи 8, 16 или 32 битов в порт ввода-вывода. Таким же образом, программное обеспечение использует инструкцию IN для чтения из порта ввода-вывода. Порты ввода / вывода находятся в отдельном 16-битном адресном пространстве, не связанном с адресным пространством, используемым основной памятью. Каждая часть оборудования, которая использует порты ввода / вывода, имеет диапазон адресов ввода / вывода; запись и чтение по каждому из этих адресов имеет различный эффект (и часто чтение и запись по одному и тому же адресу также имеют разные эффекты).

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

С другой стороны (остальная часть аппаратного обеспечения взаимодействует с программным обеспечением, работающим на ЦП), есть также несколько способов. Простейшим будет ожидание запроса программного обеспечения (либо через порт ввода-вывода, либо через ввод-вывод с отображением в памяти); используется один, это может быть очень неэффективно.

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

Последний способ прерывает. ЦП получает запрос на прерывание вместе с номером прерывания. Процессор прерывает (то есть имя), что он делал, и переключается на другую часть кода (эта часть зависит от номера прерывания). Обычно каждому оборудованию соответствует один номер прерывания, но номера прерываний часто используются несколькими источниками прерываний. Существуют также специальные виды прерываний, которые не имеют номера; например, НМИ.


Для практического примера возьмем простую сетевую карту. Эта сетевая карта имеет набор регистров, доступ к которым можно получить либо через порты ввода-вывода, либо через ввод-вывод с отображением в памяти. Он также может читать и записывать в основную память и имеет контакт прерывания.

Чтобы отправить пакет в сеть, драйвер сетевой карты сначала записывает полный пакет в память по адресу, выровненному по кратному 4 байтам. Затем он записывает в пару регистров на сетевой карте, сообщая адрес памяти, размер пакета и некоторую другую информацию. Затем сетевая карта считывает пакет из памяти, отправляет его в сеть и сигнализирует о прерывании. Контроллер прерываний (отдельная часть аппаратного обеспечения) отправляет запрос прерывания в ЦПУ и сообщает ему номер прерывания. В обработчике прерываний драйвер считывает регистр с карты, который сообщает, что прерывание было связано с отправленным пакетом, читает другой регистр, чтобы выяснить, какой пакет был отправлен, и знает, что теперь он может повторно использовать память, в которую он записал пакет ,

Для приема пакетов из сети драйвер сетевой карты выделяет блок памяти, который будет использоваться в качестве хранилища для пакетов, и записывает на карту несколько регистров, сообщая ему адрес памяти блока памяти, его размер и некоторую другую информацию. , Когда пакет получен из сети, сетевая карта записывает его в этот блок памяти вместе с размером пакета и некоторой другой информацией. Он обновляет некоторые регистры, которые сообщают и ему, и драйверу, сколько свободного места есть в этом блоке памяти, где начинается свободное пространство и где начинается используемое пространство (буфер циклический, поэтому после завершения он переворачивается к началу). Наконец, он сигнализирует о своем прерывании. Драйвер прочитает регистры и память, чтобы получить пакет (ы), и обновит регистры, чтобы сообщить карточке, что теперь пространство снова свободно.

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

1

То, что вы ищете, это " IRQ ", запросы прерываний от оборудования к процессору. Существует основная статья здесь.

0

Это было бы то, для чего драйверы оборудования. Кроме того, Windows теперь использует HAL (Уровень аппаратной абстракции) вместо DOS.

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