Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
check->fields.revision, check);
continue;
}
Если вышли за пределы диапазона сканирования, то использовать BIOS32 мы не сможем:
if (check->fields.entry >= 0x100000) {
printk("PCI: BIOS32 entry (0x%p) in high memory, cannot use. ", check);
return 0;
} else {
Если всё в порядке – вычисляем адрес точки входа в BIOS32 и заполняем структуру bios32_indirect:
unsigned long bios32_entry = check->fields.entry;
bios32_indirect.address = bios32_entry + PAGE_OFFSET; // адрес точки входа в BIOS32
printk(KERN_INFO "PCI: BIOS32 entry point at 0x%08x ", bios32_indirect.address);
}
break; /* Hopefully more than one BIOS32 cannot happen... */
}
return 0;
}
Следующая функция, которую мы рассмотрим, определяет адрес точки входа в сервис BIOS32.
static u32 bios32_service(u32 service)
{
u8 return_code; /* %al, код возврата */
u32 address; /* %ebx, адрес базы сервиса*/
u32 length; /* %ecx, размер сегмента сервиса */
u32 entry; /* %edx, точка входа в сервис */
u32 flags;
Идентификатор сервиса передается в параметрах функции.
Адрес точки входа в сервис BIOS32 определяется путем дальнего вызова через точку входа в BIOS32. Перед выполнением вызова в регистры процессора заносится следующая информация:
n EAX – идентификатор сервиса (в нашем случае это $PCI);
n EBX – селектор функции (должен быть равен 0);
n EDI – адрес точки входа в BIOS32.
После вызова регистры процессора будут содержать следующую информацию:
n AL – код возврата: 0 – запрашиваемый сервис найден, 0x80 – сервис отсутствует (не поддерживается);