Запись в кешируемый физический адрес в ядре Linux без использования ioremap или mmap - PullRequest
0 голосов
/ 08 февраля 2012

Я изменяю планировщик ядра Linux для печати pid следующего процесса в известном месте физической памяти.mmap используется для программ в пространстве пользователя, в то время как я прочитал, что ioremap помечает страницу как не кешируемую, что замедляет выполнение программы.Я хотел бы быстрый способ записи в известную физическую память.Phys_to_virt - это вариант, который я считаю возможным.Любая идея для другой техники.

PS: я запускаю это ядро ​​Linux поверх qemu.физический адрес будет использоваться qemu для чтения информации, отправленной гостевым ядром.запись в известный io-порт невозможна, поскольку код устройства, поддерживающий это io-устройство, будет вызываться каждый раз, когда имеется доступ к устройству.

РЕДАКТИРОВАТЬ: я хочу, чтобы местоположение физического адреса pidбыть в безопасности.Как я могу убедиться, что физический адрес, который использует ядро, не назначается никакому процессу.Насколько мне известно, ioremap помечает страницу как кешируемую и, следовательно, не очень пригодится.

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Самый простой способ сделать это - сделать kmalloc(), чтобы получить немного памяти в ядре. Затем вы можете получить физический адрес возвращаемого указателя, передав его virt_to_phys(). Это полный взлом, но для вашего случая отладки / трассировки в qemu он должен работать нормально.

РЕДАКТИРОВАТЬ : Я неправильно понял вопрос. Если вы хотите использовать конкретный физический адрес, вы можете сделать несколько вещей. Возможно, самое чистое, что нужно сделать, - это изменить карту e820, которую передает qemu, чтобы пометить страницу RAM как зарезервированную, и тогда ядро ​​не будет ее использовать. (т. е. так же, как в таблицах ACPI).

Если вы не хотите изменять qemu, вы также можете изменить ранний запуск ядра (около arch/x86/kernel/setup.c, вероятно), чтобы сделать reserve_bootmem() на конкретной физической странице, которую вы хотите защитить от использования.

Чтобы фактически использовать указанный физический адрес, вы можете просто использовать ioremap_cache() так же, как драйверы ACPI обращаются к своим таблицам.

0 голосов
/ 08 февраля 2012

Кажется, я неправильно понял когерентность кэша между ВМ и частью хоста, вот обновленный ответ. То, что вы хотите, это "виртуальный адрес в ВМ" <-> "виртуальный или физический адрес в пространстве адресов QEMU". Затем вы можете либо kmalloc его, но это может варьироваться от экземпляра к экземпляру, или просто объявите глобальную переменную в ядре.

Тогда virt_to_phys даст вам доступ к физическому адресу в пространстве VM, и я полагаю, вы можете перевести его в пространство адресов QEMU. Что вы подразумеваете под "физическим адресом, который использует ядро, не назначенный никакому процессу?" Вы боитесь, что страница, содержащая вашу переменную, может быть заменена? kmalloced память не может быть заменена

Оригинальный (и неправильный) ответ

Если адрес, на который вы хотите написать, находится на его собственной странице, я не вижу, как ioremap этой страницы будет замедлять выполнение кода на другой странице.

Вам все равно нужна очистка кеша, и без SSE я не вижу, как можно обойти кеш, если включены MMU и кеш. Я вижу только эти два варианта:

  • ioremap и объявить определенную страницу без кэширования

  • используйте «нормальный» адрес и вручную выполняйте очистку кэша каждый раз, когда вы пишете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...