Windows CE: совместное использование памяти между OAL и драйвером ядра

#windows-ce #xilinx

#windows-ce #xilinx

Вопрос:

Есть ли способ разделить память между OAL и драйвером ядра? Между OAL и ядром существует глобальная структура NKGlobal, которая может использоваться для совместного использования памяти. Я хотел бы использовать аналогичный подход для совместного использования памяти. Я использую Windows Embedded Compact 2013 на плате Xilinx.

До сих пор на уровне OAL я выполнял VirtToPhys для выделенной памяти, чтобы получить физический адрес. В драйвере ядра я попробовал VirtualAllocCopyEx, но я не знаю, что передать в pAddr.

   LPVOID VirtualAllocCopyEx (
       HANDLE hSrcProc,
       HANDLE hDstProc,
       LPVOID pAddr,
       DWORD cbSize,
       DWORD dwProtect
  );
  

Ответ №1:

Если драйвер работает в режиме ядра, он использует то же адресное пространство, что и OAL, поэтому вы можете передавать указатели напрямую. Вы можете выделить свой буфер в драйвере или в OAL и поделиться значением, используя IOCTL, реализованный в OEMIoControl в вашем OAL (если ваш BSP использует общий уровень качества производства, вы можете проверить, как реализованы другие IOCTL, обычно вам нужно добавить запись в таблицу структур и реализовать функциюдля управления вашим конкретным IOCTL). Оба компонента могут обращаться к памяти с помощью этого указателя.

Комментарии:

1. Если в драйвере режима ядра я делаю g_pNKGlobal = (PNKGlobal) 0x8287a087 (адрес, напечатанный из OAL). А затем RETAILMSG(1, (L»Версия: x r n», g_pNKGlobal-> dwVersion). Я получаю системную ошибку при запуске пользовательского кода в ядре.

2. Если вам нужно поделиться информацией такого рода, лучшим вариантом будет внедрение пользовательского IOCTL ядра. Но вы должны иметь доступ к этой ячейке памяти, потому что 0x80000000 является начальным адресом памяти ядра. Вы уверены, что ваш драйвер работает в режиме ядра?

3. Я на 100% уверен, что он работает в режиме ядра. Я могу получить доступ к регистрам GPIO. Я подозреваю, что каким-то образом память защищена и не может быть доступна из драйвера ядра. Вот почему OAL и ядро взаимодействуют друг с другом с помощью NKGlobal и OEMGlobal структуры.

4. NKGlobal и OEMGlobal использовались в CE 5.0, они были сохранены для облегчения перехода с CE 5.0 на CE 6.0, где ядро является DLL, а не статической библиотекой, связанной с исполняемым файлом ядра.

5. Защита памяти AFAIK в Windows CE осуществляется между процессами, и драйвер режима ядра выполняется в процессе ядра, при вызове функций ядра переключение контекста отсутствует, поэтому переназначение MMU не выполняется. Глядя на ваш адрес, я замечаю, что это четное число, вы уверены в этом? Указатель на ARM должен быть выровнен на 32 бита (если вы не используете ключевое слово unaligned для их определения), а также на x86 структура в памяти обычно упакована на 32 бита.