Почему мы можем напрямую получить доступ только к области 640k-1MB в физических адресах PCI?

http://www.mjmwired.net/kernel/Documentation/IO-mapping.txt

153  - remapping and writing:
154     /*
155      * remap framebuffer PCI memory area at 0xFC000000,
156      * size 1MB, so that we can access it: We can directly
157      * access only the 640k-1MB area, so anything else
158      * has to be remapped.
159      */
160     void __iomem *baseptr = ioremap(0xFC000000, 1024*1024);
161 
162     /* write a 'A' to the offset 10 of the area */
163     writeb('A',baseptr+10);
164 
165     /* unmap when we unload the driver */
166     iounmap(baseptr);
167 

Можно ли объяснить, почему это так We can directly access only the 640k-1MB area?

2 ответа

Решение

Краткий ответ: потому что Линус решил сделать это таким образом.

Длинный ответ: На самом деле, это неправильно, что вы должны иметь доступ к этой области без водителя, подписавшего ее. Но не бери в голову это.

В старые времена, когда-то в 1990-х, PCI не существовало, а видеокарты, сетевые карты и т. Д. Использовали что-то, называемое шиной ISA. У него не было причудливых функций, которые позволяли бы вам запрашивать информацию с карты или настраивать что-то на карту в зависимости от того, где, по ее мнению, должны находиться аппаратные адреса. Вся память ISA находится между A0000 (640K) и FFFFF (1MB-1). Итак, в первые дни Linux именно здесь жили графика и подобные вещи, и ядро ​​не могло точно знать, где эти вещи. В любом случае, у нас нет такого рода аппаратного обеспечения в наши дни, благодаря развитию более совершенного оборудования. Скатертью дорога!

По соображениям совместимости это пространство памяти по-прежнему используется во время загрузки, поскольку до тех пор, пока вы не загрузите драйверы и не настроите оборудование PCI, оно будет работать в "устаревшем режиме", так что вы все равно сможете запускать действительно старую DOS и другое старое программное обеспечение на машине без это ведет себя странно.

Однако после того, как ваша графическая карта, например, настроена, на ней будет настроен BAR (диапазон адресов шины), чтобы сообщить миру, где она находится в адресном пространстве шины (физический адрес). ioremap отобразит физический адрес на виртуальный адрес, который вы можете использовать в ядре - baseptr в этом примере. [Я мог бы подробнее рассказать о ioremap, так как недавно работал над кодом, полученным из этого].

Как говорится в другом ответе, вам нужно спросить устройство, что это за BAR (который является частью пространства конфигурации PCI), а затем сопоставить его память с виртуальным адресом. Вы можете увидеть, где вещи используют lspci -v|grep Memory (конечно, используя только lspci -v даст вам гораздо больше информации, в том числе о том, какое устройство имеет какую память). Эти адреса являются физическими адресами.

Насколько я могу судить, комментарий, который вы просматриваете, неверен и должен быть от 0x000A0000 до 0x000BFFFF (или от 640 КиБ до 768 КиБ).

Это соответствует устаревшим областям памяти VGA-дисплеев в системах ПК 80x86 (где вам необходимо получить доступ к потенциально большому объему видеопамяти через одно из двух небольших окон по 64 КиБ и переключение банков), которое было заменено методами "линейного буфера кадров" это позволило вам получить доступ ко всей памяти видео дисплея напрямую.

Помимо неправильного комментария, я бы также предположил, что код ошибочен и что параметр 0xFC000000 ("адрес шины памяти") - это просто случайное число, которое кто-то составил.

По сути, я говорю, что этот пример является примером использования IO mapping; и не предназначен для использования для определения того, какие (физические, виртуальные или шинные) адреса действительны при любой конкретной архитектуре для любого устройства при любых обстоятельствах.

Другие вопросы по тегам