Skip to content

Instantly share code, notes, and snippets.

@eanmos
Last active September 2, 2021 16:19
Show Gist options
  • Save eanmos/1cd250272bf6a55ce21e6ea0458856dc to your computer and use it in GitHub Desktop.
Save eanmos/1cd250272bf6a55ce21e6ea0458856dc to your computer and use it in GitHub Desktop.

Ключевой элемент в общении между процессором и внешними устройствами — это техника memory mapped I/O (в некоторых архитектурах есть возможность общаться с устройствами через I/O порты. В x86, например. Можно общаться через GPIO или ещё что-нибудь, но в современных PC memory mapped I/O — основной способ общения). Ее суть заключается в том, что определенные области памяти (адресного пространства) не являются, собственно памятью, а используются для общения с определенным устройством, которое отображено (mapped) в эту область.

Например, в IBM PC-совместимых системах (x86), в адресное пространство отображается буфер видеопамяти VGA. Если вы в real mode процессора будете писать латинские буковки в область памяти, которая начинается с адреса 0xB8000, то эти буковки будут отображаться у вас на экране (т. н. VGA text mode).

Именно так и происходит все общение с внешним устройством — запись в определенные области памяти определенных байтов. Как конкретно общаться с устройством очевидно зависит от самого железа. Собственно процессору необходимо знать диапазон адресов устройства и что этому устройству писать.

Чтобы узнать все подключённые устройства в PC процессор обращается к шинам типа PCI или USB. Они дают процессору список всех подключённых к ним устройств и всю информацию о них, включая диапазон отображения. (Есть ситуации, когда в компьютере нет таких сложных шин и в таком случае процессор никак не может сам узнать, какие устройства подключены к компьютеру. Ему необходимо вручную передать список устройств и всю информацию о них. В Linux это делается с помощью Device Tree, где вручную записывается каждое устройство, адрес, регистры и так далее.

После того, как процессор получил список устройств он должен понять, как с этими устройствами работать. Сам он, естественно, понятия не имеет как это делать, поэтому программистам приходится писать специальные программы — драйверы, которые и занимаются тем, что управляют устройством (как раз через запись по memory mapped адресам, например). Процессор сопоставляет каждое устройство с драйвером, который этому устройству подходит и дальше всем общением занимается драйвер.

Примерно так все и происходит. Но все, что я написал выше — это капля в море. Конкретный детали общения, протоколы — специфичны для каждой платформы и для того, чтобы понять все уровни абстракции пары моих абзацев выше, конечно, не хватит. Я, собственно, и сам не знаю каждый уровень. А о некоторых вещах простым смертным не узнать вообще из-за NDA.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment