в каком состоянии phys_base не равен 0? - PullRequest
2 голосов
/ 11 октября 2011

ссылка на phys_base указана в исходном коде ядра __ phys_addr () arch / x86 / mm / physaddr.c и сбой также использовать его в качестве машинно-зависимого параметра например. --machdep phys_base = 0x200000

unsigned long __phys_addr(unsigned long x)
{
    if (x >= __START_KERNEL_map) {
        x -= __START_KERNEL_map;
        VIRTUAL_BUG_ON(x >= KERNEL_IMAGE_SIZE);
        x += phys_base;
    } else {
        VIRTUAL_BUG_ON(x < PAGE_OFFSET);
        x -= PAGE_OFFSET;
        VIRTUAL_BUG_ON(!phys_addr_valid(x));
    }
    return x;
}
EXPORT_SYMBOL(__phys_addr);

Вы можете помочь объяснить, в каком состоянии это не 0, как оно определяется / почему и почему.

ОБНОВЛЕНИЕ: дебют "phys_base" можно найти здесь

1 Ответ

1 голос
/ 11 октября 2011

Это не обязательно 0, потому что в некоторых архитектурах ЦП физический адрес используется для доступа к вещам, которые не являются памятью. Процессор может узнать, какой интерфейс или шину использовать, разделив карту памяти.

Я не знаю архитектуру x86, но на ARM, например, у вас могут быть такие вещи:

  • от 0x00000000 до 0x0fffffff, внешняя вспышка доступна.
  • от 0x10000000 до 0x1000ffff, доступ к регистру отображения внутренней памяти
  • от 0x80000000 до 0x9fffffff, sdram или ddr.

В этом случае phys_base будет 0x80000000. Так что это определяется процессором или чипсетом на x86. См. this для примера. карта памяти.

...