Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
printk(KERN_WARNING "bios32_service(0x%08x): returned 0x%x -- BIOS bug! ",
service, return_code);
return 0;
}
}
А теперь рассмотрим порядок обращения к сервису PCI BIOS в защищенном режиме, выполнив проверку присутствия PCI BIOS в системе:
int check_pcibios(void)
{
u32 signature, eax, ebx, ecx;
u8 status, major_ver, minor_ver, hw_mech;
u32 flags,
u32 pcibios_entry;
pcibios_entry – это точка входа в сервис, назначение остальных переменных рассмотрим ниже. Ищем точку входа в сервис PCI путём вызова функции bios32_service(). Параметр функции – идентификатор сервиса, сигнатура $PCI. Все адреса отсчитываются относительно нижней границы адресного пространства ядра (PAGE_OFFSET = 0xC0000000).
if ((pcibios_entry = bios32_service(PCI_SERVICE))) {
pci_indirect.address = pcibios_entry + PAGE_OFFSET
Выполняем обращение к функции проверки присутствия PCI BIOS в системе – 0xB101. Для этого выполняем дальний вызов через точку входа pcibios_entry, предварительно заполнив регистры процессора следующей информацией:
n EAX – запрашиваемая функция сервиса, в данном случае 0xB101;
n EDI – адрес точки входа в сервис.
В результате выполнения вызова в регистрах процессора будет находиться следующая информация:
n EDX – сигнатура запрашиваемого сервиса (PCI в нашем случае);
n AH – признак присутствия сервиса (0 – PCI BIOS присутствует, если в EDX правильная сигнатура, любое другое значение – PCI BIOS отсутствует);
n AL – поддерживаемый аппаратный механизм конфигурирования (см. «Configuration Mechanism #1»);
n BH – номер версии интерфейса;
n BL – подномер версии интерфейса;
n CL – номер последней шины PCI в системе.
Итак, выполняем вызов:
__save_flags(flags); __cli();
__asm__(
"lcall (%%edi); cld "
"jc 1f "
"xor %%ah, %%ah "
"1:"
: "=d" (signature), // в EDX возвращается сигнатура "PCI"
"=a" (eax), // в AH - признак присутствия, в AL - аппаратный механизм