Для чего находятся В и инструкции в x86, используемом?

У меня есть encoutered они к инструкциям В и при чтении "Понимания книги" Ядра Linux. Я искал справочник.

5.1.9 Инструкции ввода-вывода

Эти инструкции перемещают данные между портами I/O процессора и регистром или памятью.

IN    Read from a port
OUT   Write to a port
INS/INSB  Input string from port/Input byte string from port 
INS/INSW  Input string from port/Input word string from port 
INS/INSD  Input string from port/Input doubleword string from port
OUTS/OUTSB    Output string to port/Output byte string to port 
OUTS/OUTSW    Output string to port/Output word string to port 
OUTS/OUTSD    Output string to port/Output doubleword string to port

Я не получил немного вещей:

  1. "порты I/O процессора". Каковы они? Почему мы хотели бы считать и записать "строки" в и от этих портов?
  2. Я никогда encoutered сценарий, где я должен использовать эти инструкции. Когда мне были бы нужны они?
  3. Дайте некоторые практические примеры.
55
задан claws 9 July 2010 в 19:35
поделиться

5 ответов

Вы знаете, как работает адресация памяти? Есть адресная шина, шина данных и несколько линий управления. ЦП помещает адрес байта (или начального байта) памяти в адресную шину, затем повышает сигнал READ, и некоторый чип RAM, надеюсь, возвращает содержимое памяти по этому адресу, повышая или понижая отдельные строки (соответствующие битам в байтах) на шине данных. Это работает как для RAM, так и для ROM.

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

Для некоторых моделей ЦП, включая серию xxx86, которая используется в большинстве «современных» ПК, устройства ввода-вывода совместно используют адресное пространство с памятью. И RAM / ROM, и устройства ввода-вывода подключены к одним и тем же линиям адреса, данных и управления. Например, адрес последовательного порта для COM1 начинается с (шестнадцатеричное) 03F8. Но почти наверняка по тому же адресу есть память.

Вот действительно простая диаграмма:

[https://qph.ec.quoracdn.net/main-qimg-e510d81162f562d8f671d5900da84d68-c?convert_to_webp=true]

Очевидно, что ЦП должен взаимодействовать либо с памятью, либо с устройством ввода-вывода, но не с обоими сразу. Чтобы различать их, одна из линий управления, называемая «M / # IO», определяет, хочет ли ЦП взаимодействовать с памятью (линия = высокий уровень) или устройством ввода-вывода (линия = низкий уровень).

Инструкция IN читает с устройства ввода-вывода, OUT записывает. Когда вы используете инструкции IN или OUT, M / # IO не утверждается (удерживается на низком уровне), поэтому память не отвечает, а микросхема ввода-вывода отвечает. Для инструкций, ориентированных на память, устанавливается M / # IO, поэтому ЦП взаимодействует с ОЗУ, а устройства ввода-вывода остаются вне связи.

При определенных условиях устройства ввода-вывода могут управлять линиями данных, и ОЗУ может читать их одновременно. Наоборот. Это называется DMA.

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

В современных операционных системах, таких как Windows или Linux, доступ к портам ввода-вывода скрыт от «обычных» пользовательских программ, и существуют уровни программного обеспечения, привилегированных инструкций и драйверов для работы с оборудованием. Итак, в этом веке большинство программистов не работают с этими инструкциями.

88
ответ дан 26 November 2019 в 17:45
поделиться

Начните примерно так:

http://www.cpu-world.com/info/Pinouts/8088.html

Вы изучаете инструкции для очень старой технологии чип / архитектура. Когда-то все, кроме ядра процессора, было не на чипе. Видите адресные строки и строки данных, и есть ли строка чтения RD, строка записи WR и строка IO / M?

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

Помните, что у вас была склеивающая логика 74LSxx, множество проводов и множество микросхем для подключения памяти к процессору. И память была именно этой памятью, большими дорогими микросхемами. Если у вас было периферийное устройство, которое должно было делать что-то полезное, у вас также были регистры управления, память могла быть пиксельными данными, но где-то вам нужно было установить пределы тактовой частоты горизонтальной и вертикальной развертки, это могут быть отдельные защелки 74LSxx, а НЕ память, имеющая я Отображение ввода-вывода / вывода сохранено на обеих логических схемах и имеет большой смысл с точки зрения программиста, он также позволяет избежать изменения ваших сегментных регистров, чтобы направить ваше окно памяти 64 КБ и т. Д. Адресное пространство памяти было священным ресурсом, особенно когда вы хотел ограничить декодирование вашего адреса несколькими битами, потому что каждые несколько бит стоят вам большого количества микросхем и проводов.

Подобно тому, как ввод-вывод с прямым порядком байтов и с прямым порядком байтов, ввод-вывод с отображением ввода-вывода был религиозной войной.И некоторые из ответов, которые вы получите на свой вопрос, будут отражать твердые мнения, которые все еще существуют сегодня у людей, которые пережили этот вопрос. Реальность такова, что каждый чип, представленный сегодня на рынке, имеет несколько шин для различных вещей, вы не можете повесить свои часы реального времени на шину памяти ddr с помощью декодера адреса. В некоторых до сих пор даже есть полностью отдельные шины команд и данных. В некотором смысле Intel выиграла войну за концепцию отдельных адресных пространств для разных классов вещей, хотя термин «порт ввода-вывода» является злом и плохим, и его не следует произносить еще, скажем, 20–30 лет. Вам нужны люди моего возраста, которые прожили это, чтобы выйти на пенсию или уйти до того, как война действительно закончится. Даже термин «ввод-вывод с отображением в память» ушел в прошлое.

Это действительно все, что когда-либо было, бит декодирования одного адреса на внешней стороне чипа Intel, который управлялся с помощью специальных инструкций. Используйте один набор инструкций, в котором бит был задействован, используйте один набор инструкций, когда бит был выключен. Хотите увидеть что-то интересное, посмотрите на набор инструкций для процессоров xmos xcore, у них есть много вещей, которые являются инструкциями вместо регистров с отображением памяти, это выводит эту вещь ввода-вывода с отображением ввода-вывода на совершенно новый уровень.

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

Поскольку адресного пространства было мало, это не было редкостью, и до сих пор наблюдается наличие памяти, скрытой за двумя регистрами, адресным регистром и регистром данных, эта память доступна только через эти два регистра, она не отображается в память. поэтому вы записываете смещение в эту скрытую память в адресном регистре и читаете или записываете регистр данных для доступа к содержимому памяти. Теперь, поскольку у Intel была инструкция rep, и вы могли комбинировать ее с insb / w outb / w, аппаратный декодер (если бы с вами работали приятные / дружелюбные аппаратные люди) автоматически увеличивал адрес всякий раз, когда вы выполняли цикл ввода-вывода. Таким образом, вы можете записать начальный адрес в адресный регистр и выполнить rep outw, и без сжигания тактовых циклов выборки и декодирования в процессоре и на шине памяти вы можете довольно быстро перемещать данные в периферийное устройство или из него. Такие вещи теперь считаются недостатком дизайна благодаря современным суперскалярным процессорам с выборкой, основанной на предсказании ветвлений, ваше оборудование может в любое время выполнять операции чтения, которые не имеют ничего общего с выполнением кода, поэтому вам НИКОГДА не следует автоматически увеличивать адрес или очистить биты в регистре состояния или изменить что-либо в результате чтения по адресу. (Примечание редактора: на самом деле вы просто должны убедиться, что ваши регистры ввода-вывода с побочными эффектами для чтения находятся в некэшируемых областях / страницах памяти. Спекулятивная предварительная выборка некэшируемой памяти не разрешена в x86 ISA. И никогда не может произойти для I / O доступ к пробелу.Но в / out очень медленные и частично сериализуются, а адресного пространства физической памяти больше нет, поэтому память устройства обычно просто отображается в память для эффективного доступа с полноразмерным PCIe. транзакций.)

Механизмы защиты, встроенные в 386 и по настоящее время, на самом деле очень упрощают доступ к вводу-выводу из пользовательского пространства. В зависимости от того, чем вы зарабатываете себе на жизнь, что производит ваша компания и т. Д. Вы определенно можете использовать семейство инструкций in и out из пользовательского пространства (прикладные программы в Windows, Linux и т. Д.) Или из пространства ядра / драйвера, это ваш выбор. Вы также можете делать забавные вещи, например использовать преимущества виртуальной машины и использовать инструкции ввода-вывода для общения с драйверами, но это, вероятно, разозлит людей как в мире Windows, так и в мире Linux, этот драйвер / приложение не уйдет далеко. Другие плакаты верны в том, что вам, вероятно, никогда не понадобится использовать эти инструкции, если вы не пишете драйверы, и вы, вероятно, никогда не собираетесь писать драйверы для устройств, использующих ввод-вывод с отображением ввода-вывода, потому что вы знаете ... драйверы для этих устаревших устройств уже написаны. Современные разработки определенно имеют ввод-вывод, но все они отображаются в памяти (с точки зрения программистов) и используют инструкции памяти, а не инструкции ввода-вывода. Другая сторона, если это DOS, определенно не мертва, в зависимости от того, где вы можете строить машины для голосования, бензоколонки, кассовые аппараты или длинный список оборудования на основе DOS.Фактически, если вы работаете где-то, где собираются ПК, периферийные устройства или материнские платы на базе ПК, инструменты на основе DOS по-прежнему широко используются для тестирования и распространения обновлений BIOS и других подобных вещей. Я все еще сталкиваюсь с ситуациями, когда мне нужно взять код из текущей тестовой программы dos, чтобы написать драйвер для Linux. Точно так же, как не все, кто может бросить или поймать футбольный матч в НФЛ, в процентном отношении очень немногие работают с программным обеспечением, которое включает в себя такие вещи. Так что все же можно с уверенностью сказать, что эти инструкции, которые вы нашли, скорее всего, не будут для вас чем-то большим, чем урок истории.

24
ответ дан 26 November 2019 в 17:45
поделиться

На аппаратном уровне большинство микропроцессоров практически не имеют встроенных возможностей ввода-вывода. Некоторые процессоры имеют один или несколько выводов, которые могут быть включены и выключены с помощью специальных инструкций, и/или один или несколько выводов, которые могут быть проверены с помощью специальных инструкций ветвления, но такие возможности встречаются редко. Вместо этого ввод/вывод обычно осуществляется путем подключения системы таким образом, что обращение к диапазону адресов памяти вызывает определенный эффект, или путем включения инструкций "in" и "out", которые ведут себя как операции загрузки/хранения в памяти, за исключением того, что на выходе выдается специальный сигнал: "Это операция ввода/вывода, а не операция с памятью". Во времена 16-битных процессоров наличие специализированных инструкций "вход/выход" имело некоторые реальные преимущества. Сегодня такие преимущества в значительной степени утратили свою актуальность, поскольку можно просто выделить большой кусок адресного пространства для ввода/вывода и все равно оставить много места для памяти.

Поскольку программа может создать значительный хаос в системе, неправильно выполняя инструкции ввода/вывода (например, такие инструкции могут выполнять произвольные обращения к диску), все современные операционные системы запрещают использование таких инструкций в коде пользовательского уровня. Некоторые системы могут допускать виртуализацию таких инструкций; например, если пользовательский код пытается писать в порты ввода-вывода 0x3D4 и 0x3D5, операционная система может интерпретировать это как попытку установить некоторые регистры управления видеоконтролем для перемещения мигающего курсора. Каждый раз, когда пользовательская программа выполняла инструкцию OUT, операционная система брала на себя управление, видела, что пытается сделать пользовательская программа, и действовала соответствующим образом.

В подавляющем большинстве случаев, даже если операционная система преобразует инструкцию IN или OUT во что-то подходящее, более эффективным было бы запросить соответствующее действие непосредственно у операционной системы.

5
ответ дан 26 November 2019 в 17:45
поделиться

Если вы не пишете операционную систему, то вы никогда не будете использовать эти инструкции.

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

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

2
ответ дан 26 November 2019 в 17:45
поделиться

ЦП подключен к некоторым внешним контроллерам через порты io. на старых компьютерах x86 я работаю с флоппи-дисководом, используя порты ввода-вывода. если вы знаете, какие команды принимают контроллер устройства, вы можете запрограммировать его через его порты.

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

есть более подробная информация о портах ввода-вывода http://webster.cs.ucr.edu/AoA/DOS/ch03/CH03-6.html#HEADING6-1

1
ответ дан 26 November 2019 в 17:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: