Низкий уровень доступа ввода / вывода с использованием outb и inb - PullRequest
5 голосов
/ 22 января 2012

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

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

  #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 man)

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

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

спасибо.

Ответы [ 3 ]

6 голосов
/ 22 января 2012

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

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

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

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

1 голос
/ 22 января 2012

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

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

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

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

1 голос
/ 22 января 2012

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

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

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

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

...