2013-10-26 4 views
0

В настоящее время я экспериментирую с KVM и пытаюсь запустить работу ввода/вывода US (userpace). В настоящее время работает вывод (т. Е. out dx, eax), и код США может видеть записанное значение, но вход (in eax, dx), похоже, не работает - виртуальная машина не получает значение, написанное кодом США.KVM Userpace Port I/O

if (run->io.port == 0xface && run->io.direction == KVM_EXIT_IO_IN) 
{ 
    printf("Port 0xface read\n"); 
    *(volatile uint32_t *)((uintptr_t)run + run->io.data_offset) = 0xdeadbeefu; 
    continue; 
} 

run является указателем на struct kvm_run, который был mmap ред ранее и имеет достаточно места (т.е. run->io.data_offset является допустимым смещение от указателя). Оператор continue в конечном итоге вызывает перезагрузку виртуальной машины, и код продолжает работать нормально. Однако, когда я пытаюсь получить регистр VM rax (который должен быть 0xdeadbeef), я получаю нуль. Из того, что я читал в документах (kvm/Documentation/api.txt), я должен это делать. Я что-то упускаю?

В случае, когда я предшествую оператору continue с run->io.count = run->io.count;, ввод/вывод запускается снова (хотя count не изменяется). Это ожидаемое поведение? Или я запускаю неопределенное поведение?

ответ

0

Проблема заключается с фактическим mmap вызова:

run = mmap(NULL, mapSize, PROT_READ | PROT_WRITE, MAP_PRIVATE, vcpuID, 0); 

Параметр flags должен быть MAP_SHARED вместо MAP_PRIVATE:

run = mmap(NULL, mapSize, PROT_READ | PROT_WRITE, MAP_SHARED, vcpuID, 0); 
                ^^^^^^^^^^ 

Виртуальная машина будет увидеть обновленные значения при KVM_RUN выдается перезапустите его.

 Смежные вопросы

  • Нет связанных вопросов^_^