Низкий уровень доступа ввода / вывода с использованием outb и inb

Я с трудом пытаюсь понять, как работают прерывания.

код ниже инициализирует программируемый контроллер прерываний

  #define PIC0_CTRL 0x20    /* Master PIC control register address. */
  #define PIC0_DATA 0x21    /* Master PIC data register address. */

  /* Mask all interrupts*/
  outb (PIC0_DATA, 0xff);

  /* Initialize master. */
  outb (PIC0_CTRL, 0x11); /* ICW1: single mode, edge triggered, expect ICW4. */
  outb (PIC0_DATA, 0x20); /* ICW2: line IR0...7 -> irq 0x20...0x27. */
  outb (PIC0_DATA, 0x04); /* ICW3: slave PIC on line IR2. */
  outb (PIC0_DATA, 0x01); /* ICW4: 8086 mode, normal EOI, non-buffered. */

  /* Unmask all interrupts. */
  outb (PIC0_DATA, 0x00);

Может кто-нибудь объяснить мне, как это работает:

- роль outb (я не понял, что такое человек Linux)

адреса и их значение

другой несвязанный вопрос, я читал, что outb и inb предназначены для ввода-вывода с отображением портов, можем ли мы использовать отображение ввода-вывода с отображением памяти для осуществления ввода-вывода?

Благодарю.

3 ответа

Решение

outb() записывает байт, указанный его вторым аргументом, в порт ввода-вывода, указанный его первым аргументом. В этом контексте "порт" является средством связи ЦПУ с другим чипом.

Представленный вами код C относится к программируемому контроллеру прерываний 8259A (PIC).

Вы можете прочитать о PIC здесь и здесь.

Если этого недостаточно для понимания команд и битовых масок, вы всегда можете обратиться к таблице данных чипа.

Специфичный код устройства лучше всего читать вместе с соответствующей таблицей данных. Например, таблица данных "Программируемый контроллер прерываний 8259A" (http://pdos.csail.mit.edu/6.828/2005/readings/hardware/8259A.pdf) четко (но кратко) объясняет почти все.

Тем не менее, эта таблица данных только объясняет, как чип может использоваться (в любой системе), и не объясняет, как чип используется в конкретной системе (например, в "совместимых с ПК" системах 80x86). Для этого вам нужно полагаться на "подразумеваемые стандарты де-факто" (поскольку многие функции микросхем PIC не используются в "совместимых с ПК" системах 80x86 и могут не поддерживаться на современных / интегрированных чипсетах).

Обычно (по историческим причинам) IRQ чипа PIC отображаются на прерывания странным / плохим способом. Например, IRQ 0 отображается на прерывание 8 и конфликтует с исключением двойной ошибки ЦП. Специальный код, который вы опубликовали, перераспределяет микросхемы PIC таким образом, что IRQ0 отображается на прерывание 0x20 (и IRQ1 на прерывание 0x21, ..., IRQ 15 отображается на IRQ 0x2F). Это то, что ОС обычно делает, чтобы избежать конфликтов (например, чтобы каждое прерывание использовалось для IRQ или исключения, а не обоих).

Чтобы понять "outb()", посмотрите инструкцию "OUT" в руководствах Intel. Как будто есть 2 адресных пространства - одно для обычных физических адресов и совершенно отдельное для портов ввода-вывода, где обычные инструкции (косвенно) обращаются к нормальной физической памяти; и инструкции порта IO (IN, OUT, INSB/W/D, OUTSB/W/D) обращаются к отдельному "адресному пространству IO".

Традиционный 8088/86 имел / имеет сигнал управления памятью, который по сути является другим адресным битом, связанным непосредственно с инструкцией. Управляющий сигнал, разделяющий доступы на ввод / вывод и память, создавая два отдельных адресных пространства. В отличие от CS, DS и т. Д., Создающих отдельные области памяти внутри чипа (до попадания во внешнюю область памяти). Другие семейства процессоров используют так называемый ввод-вывод с отображением в памяти.

В наши дни контроллеры / системы памяти разделены внутри и снаружи микросхемы различными способами, иногда, например, со многими управляющими сигналами, которые указывают команды на данные, заполнение строк кэша, запись на запись и запись назад и т. Д. Для экономии на внешних схемах отображение памяти происходит внутри чипа, и, например, выделенные интерфейсы rom, отделенные от ram и т. д., находятся на грани, гораздо более сложные и отдельные, чем пространство ввода-вывода по сравнению с пространством памяти старого 8088/86.

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

Если вы действительно хотите понять это, вам нужно найти таблицы данных для устройства, которое содержит контроллер прерываний, которые, вероятно, будут объединены с кучей другой логики на большом чипе поддержки. Другие таблицы могут также потребоваться.

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