OSDev
http://osdev.su/

Адрес аппаратного устройства
http://osdev.su/viewtopic.php?f=5&t=3641
Страница 1 из 1

Автор:  v.g.a. [ 20 фев 2019, 20:27 ]
Заголовок сообщения:  Адрес аппаратного устройства

Вопрос хоть и теоретический, но с другой стороны и практический. Т.к. 100% возникнет при практической реализации операционной системы.
Вопрос заключается в том, как реализовать обращение к аппаратному устройству.
Чтобы обратиться к устройству, ему необходимо присвоить адрес.
Часть устройств подключено к шине PCI, и для адреса достаточно 16 бит (32 для PCI Express).
Часть древних и не очень устройств описано в таблицах ACPI (не подключенных к PCI шине).
Для USB устройств нужно ещё 7 бит к адресу (максимально можно подключить 127) устройств. Итого 32+7=39 бит.
Само USB устройство может быть составным, там вроде около 255 интерфейсов (1 байт). Итого 39+8=48 бит.
В 48 битах можно закодировать 2^48=2,8147498 × 10^14 устройств.
Т.е. 48 бит для адреса слишком много.
Какие есть соображения на этот счёт?

P.S. Ну вот погуглил, есть обычные PCI платы, реализующие внутри себя 16 портов rs-232.
Может есть и платы на большее количество портов.
Т.е. обычному PCI устройству 32 бит не хватит.

Автор:  SII [ 21 фев 2019, 08:27 ]
Заголовок сообщения:  Re: Адрес аппаратного устройства

Не надо пытаться одним адресом покрыть все устройства. Физически устройства образуют древовидную структуру, корнем которой является процессор. Пока устройство прямо доступно процессору, обращения к нему с точки зрения программиста не отличаются от обращений к ячейкам памяти (ну или к портам ввода-вывода, но это, по сути, лишь требует уметь работать с двумя видами адресов -- памяти и портов). Соответственно, для таких устройств необходимо использовать адрес памяти -- а он сейчас 64-разрядный, даже если физически реализовано меньшее число разрядов. Все остальные устройства подключаются через специфические для конкретных интерфейсов контроллеры и адресуются уже по правилам этих интерфейсов. Поэтому нет никакого ни технического, ни логического смысла пытаться присвоить, скажем, USB-мыши принципиально такой же адрес, как и хост-контроллеру USB: процессор не может обращаться к USB-устройствам, он обращается только к хост-контроллеру. Попытка скрестить ежа с ужом приведёт лишь к путанице.

Автор:  v.g.a. [ 21 фев 2019, 17:13 ]
Заголовок сообщения:  Re: Адрес аппаратного устройства

Насчёт древовидной структуры согласен, так всё и есть.
Цитата:
Все остальные устройства подключаются через специфические для конкретных интерфейсов контроллеры и адресуются уже по правилам этих интерфейсов.

Т.е. считаете, что единообразной адресации устройств не требуется?
Цитата:
Поэтому нет никакого ни технического, ни логического смысла пытаться присвоить, скажем, USB-мыши принципиально такой же адрес, как и хост-контроллеру USB: процессор не может обращаться к USB-устройствам, он обращается только к хост-контроллеру. Попытка скрестить ежа с ужом приведёт лишь к путанице.

У каждого устройства должен быть свой уникальный адрес.

Автор:  v.g.a. [ 21 фев 2019, 17:24 ]
Заголовок сообщения:  Re: Адрес аппаратного устройства

Можно предложить и другую реализацию.
Адрес устройства это просто число, не связанное с физическим подключением устройства. Это число должно быть уникально.
Информацию об устройстве хранить например, в красно-чёрном дереве. Ключ - адрес устройства.
Добавление, удаление информации об устройстве тривиальные операции.

Автор:  SII [ 21 фев 2019, 18:26 ]
Заголовок сообщения:  Re: Адрес аппаратного устройства

Единообразная адресация реальных устройств бесполезна: обратиться-то к устройству единообразным образом невозможно из-за различия в способах подключения (это Вам не IBMовские мэйнфреймы, где сие как раз единообразно -- но там принципиально иная организация ввода-вывода). Соответственно, зачем устройству нужен собственный уникальный адрес, который на самом деле адресом не является?

Цитата:
Адрес устройства это просто число, не связанное с физическим подключением устройства. Это число должно быть уникально.


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

Цитата:
Информацию об устройстве хранить например, в красно-чёрном дереве. Ключ - адрес устройства.


А зачем хранить таким образом? Если доступ к устройству необходим для, условно говоря, кода пользователя, то он оперирует не адресами устройств, а некими логическими именами (неважно, будут они в стиле Винды, Униха или ещё чего -- главное, что это будет некий "человеческий" формат), если же операции должен выполнять код самой системы, то ему логичней прямо использовать адреса управляющих блоков.

Автор:  v.g.a. [ 21 фев 2019, 19:04 ]
Заголовок сообщения:  Re: Адрес аппаратного устройства

Да, есть о чём подумать.
Пусть единообразный доступ ко всем устройствам может не требоваться. С этим я согласен.
Но единообразный доступ может потребоваться при обращении к устройствам одного класса.
Например, физический диск может быть и SATA диском, подключенным к AHCI контроллеру, и флешкой.
В операционной системе будет API для работы с дисками, которому подробности физического подключения устройства не требуются.

Автор:  v.g.a. [ 21 фев 2019, 19:08 ]
Заголовок сообщения:  Re: Адрес аппаратного устройства

Логические имена в виде строки - названия файлов (unix) удобны для пользователя. Компьютеры работают с числами.

Автор:  v.g.a. [ 21 фев 2019, 19:18 ]
Заголовок сообщения:  Re: Адрес аппаратного устройства

Уникальный адрес устройства нужен для работы системы сообщений. Сообщения представляют собой запросы к устройству (драйверу). Передача сообщений осуществляется асинхронно. Единая адресация упростит реализацию.

Автор:  pavia [ 21 фев 2019, 20:06 ]
Заголовок сообщения:  Re: Адрес аппаратного устройства

Для адресации используйте handle -некоторое число. Вернее указатель на код драйвера. Для однотипных устройств просто размножаете код драйвера.
Код драйвера - в терминах виндоуса Device Object.

Автор:  SII [ 21 фев 2019, 20:28 ]
Заголовок сообщения:  Re: Адрес аппаратного устройства

v.g.a. писал(а):
Но единообразный доступ может потребоваться при обращении к устройствам одного класса.
Например, физический диск может быть и SATA диском, подключенным к AHCI контроллеру, и флешкой.


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

Цитата:
В операционной системе будет API для работы с дисками, которому подробности физического подключения устройства не требуются.


Ну так разумней внутри системы оперировать адресами управляющих блоков: без них всё равно обойтись не удастся (как, скажем, узнать, на каком разделе находится данный том файловой системы, и на каком физическом диске находится этот раздел?).

Цитата:
Логические имена в виде строки - названия файлов (unix) удобны для пользователя. Компьютеры работают с числами.


Ага, только перед тем, как начать работать "с числами", нужно как-то сообщить системе, с чем программа собирается работать, и без логических имён или ещё чего-то в этом роде обойтись не удастся (хотя бы потому, что работа часто ведётся с файлами, а они именно именуются). Так что, выдавая запрос на открытие, придётся выдавать и текстовую строку, ну а что тот запрос вернёт -- уже дело системы. Как правило, возвращается некое абстрактное (с точки зрения программы, но не системы) число. Но это не может быть "адрес" устройства как таковой -- хотя б потому, что часто открываются файлы на устройствах, а не сами устройства, а также потому что в общем случае нужно различать обращения к одному и тому же устройству со стороны разных программ.

Цитата:
Уникальный адрес устройства нужен для работы системы сообщений. Сообщения представляют собой запросы к устройству (драйверу). Передача сообщений осуществляется асинхронно. Единая адресация упростит реализацию.


Зачем выдумывать фиктивные адреса устройств, если в любом случае имеются адреса блоков управления устройствами, с которыми работают соответствующие драйверы?

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/