Библиотека сайта rus-linux.net
Цилюрик О.И. Модули ядра Linux | ||
Назад | Обслуживание периферийных устройств | Вперед |
Отображение памяти
Показанные ранее адреса из адресных регионов устройства PCI, возвращаемые вызовами PCI API:
unsigned long pci_resource_start( struct pci_dev *dev, int bar ); unsigned long pci_resource_end( struct pci_dev *dev, int bar );
- это адреса шины, которые (в зависимости от архитектуры) необходимо преобразовать в виртуальные адреса, которыми оперирует код адресных пространств и ядра и пользователя:
#include <asm/io.h> unsigned long virt_to_bus( volatile void *address ); void *bus_to_virt( unsigned long address ); unsigned long virt_to_phys( volatile void *address ); void *phys_to_virt( unsigned long address );
Примечание: для x86 архитектуры физический адрес (phys) и адрес шины (bus) — это одно и то же, но это не означает, что это так же происходит и для других архитектур.
Большинство PCI устройств отображают свои управляющие регистры на адреса памяти и высокопроизводительные приложения предпочитают иметь прямой доступ к регистрам, вместо того, чтобы постоянно вызывать ioctl() для выполнения этой работы. Отображение устройства означает связывание диапазона адресов пользовательского пространства с памятью устройства. Всякий раз, когда программа читает или записывает в заданном диапазоне адресов, она на самом деле обращается к устройству. Существенным ограничением отображения памяти (mmap) является то, что ядро может управлять виртуальными адресами только на уровне таблиц страниц, таким образом, отображённая область должна быть кратной размеру страницы RAM (PAGE_SIZE) и должна находиться в физической памяти начиная с адреса, который кратен PAGE_SIZE. Если рассмотреть адрес памяти (виртуальный или физический) он делится на номер страницы и смещение внутри этой страницы, например, если используются страницы по 4096 байт, 12 младших значащих бит являются смещением, а остальные, старшие биты, указывают номер страницы. Если отказаться от смещения и сдвинуть оставшуюся часть адреса вправо, результат называют номером страничного блока (page frame number, PFN). Сдвиг битов для конвертации между номером страничного блока и адресами является довольно распространённой операцией, существующий макрос PAGE_SHIFT сообщает на сколько битов должно быть выполнено смещение адреса для выполнения преобразования в PFN.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Подключение к линии прерывания | DMA |