Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Модули ядра 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