Код на C, почему адрес 0xFF00 приводится к структуре?

Я пытаюсь понять код драйвера ядра Linux, написанный на C для адаптера USB Wi-Fi. Строка 1456 в файле /drivers/net/wireless/rtl818x/rtl8187/dev.c (только в на случай, если кто-то захочет обратиться к коду ядра для контекста) читает:

    priv->map = (struct rtl818x_csr *)0xFF00;

Мне любопытно, что именно тут делает правильный операнд - (struct rtl818x_csr *)0xFF00;. Я интерпретировал это как выражение «приведение адреса памяти 0xFF00 к типу rtl818x_csr, а затем назначьте его priv->map ". Если моя интерпретация верна, что такого особенного в адресе памяти 0xFF00, что драйвер может достоверно сказать, что то, что после, всегда будет при этот адрес? Еще одна вещь, которая меня интересует, это то, что 0xFF00 только 16 бит. Я ожидал бы 32/64-бит, если бы он приводил адрес памяти.

Кто-нибудь может уточнить, что именно происходит в этой строке кода? Я предполагаю, что в моем понимании синтаксиса C есть недостаток.

7 голосов | спросил Bryce Thomas 1 PM00000010000002731 2012, 13:55:27

3 ответа


0

0xFF00 - это адрес в пространстве адресов ввода-вывода системы. Если вы посмотрите в коде, адрес никогда не разыменовывается напрямую, а доступен через функции ввода-вывода.

Например, в вызове

rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD,
                 RTL818X_EEPROM_CMD_CONFIG);

, который затем вызывает функции ввода-вывода ядра Linux.

Адрес приводится к указателю на структуру, чтобы предоставить доступ к смещениям из адреса, пример здесь:

0xFF00 + offsetof(struct rtl818x_csr, EEPROM_CMD)

Обратите внимание, что в приведенном выше вызове rtl818x_iowrite8 разыменование не происходит при передаче &priv->map->EEPROM_CMD из-за оператора & вычисляется только адрес + смещение. Разыменование также достигается с помощью внутренних низкоуровневых функций, вызываемых внутри rtl818x_iowrite8.

ответил ouah 1 PM00000020000001831 2012, 14:10:18
0

Преобразование абсолютного адреса в указатель на структуру является распространенным способом в драйверах для доступа к (отображенным в памяти) регистрам устройства как нормальной структуры C.

Использование 0xff00 работает, потому что C не подписывает расширение чисел.

ответил Some programmer dude 1 PM00000020000000331 2012, 14:00:03
0

Вы должны учитывать это с точки зрения устройства.

Начиная с адреса 0xFF00 в адресном пространстве, отображаемом для устройства rtl8187, находится диапазон памяти, в котором хранится информация, структурированная так же, как определенная структура rtl818x_csr здесь (нужно было постить не больше, чем на 3 балла), потому что вам нужно было набрать еще не два балла, потому что у меня есть еще три балла, но у меня есть еще три балла, но у меня есть еще три балла, но у меня есть еще три балла, но у меня есть еще три балла, но у меня есть еще три балла, но у меня есть еще три балла, но у меня есть еще три балла, но у меня есть еще три балла, но у меня есть еще три пункта, но у меня есть еще три пункта, но у меня есть еще три пункта, но у меня есть еще три пункта, но у меня есть еще 3 пункта, но у меня есть еще 3 пункта, но у меня есть еще 3 пункта, но у меня есть еще 3 пункта, но у меня есть еще 3 пункта, но у меня есть еще 3 пункта, но у меня есть еще 3 пункта, потому что , Это всего лишь пара примеров. Если вы прочитаете весь файл, вы увидите, что чтение и запись разбросаны повсюду.

Чтобы понять, почему эта структура выглядит именно так и почему вместо 0xBEEF или 0xDEAD используется 0xFF00, вам нужно ознакомиться с таблицей данных для этого устройства.

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

В любом случае, я надеюсь, что ответил на ваш вопрос. Удачного взлома!

ответил Paul Irofti 1 PM00000020000001131 2012, 14:15:11

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132