Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
n EBX – физический адрес базы сервиса;
n ECX – размер сегмента сервиса;
n EDX – точка входа в сервис BIOS32 (смещение относительно базы, возвращённой в регистре EBX).
Вот как выполняется данный вызов:
__save_flags(flags); __cli();
__asm__("lcall (%%edi); cld"
: "=a" (return_code),
"=b" (address), // физический адрес базы сервиса
"=c" (length), // размер сегмента сервиса
"=d" (entry) // точка входа в сервис BIOS32 (смещение относительно базы, возвращенной в EBX)
: "0" (service), // идентификатор запрашиваемого сервиса ($PCI)
"1" (0), // селектор функции, должен быть равен нулю
"D" (&bios32_indirect)); // адрес точки входа в BIOS32
__restore_flags(flags);
Конструкция типа
__save_flags(flags);
__cli();
/* This code runs with interrupts disabled */
__restore_flags(flags);
используется для защиты критичных участков кода от воздействия прерываний.
Проанализируем код возврата:
switch (return_code) {
Если код возврата равен 0, то сервиc PCI BIOS присутствует, и адрес точки входа в него можно определить, сложив значение адреса базы (address) и смещения относительно базы (entry):
case 0:
return address + entry; // искомый адрес точки входа в сервис BIOS32 (PCI BIOS)
Если код возврата равен 0x80, запрашиваемый сервис отсутствует:
case 0x80: /* Not present */
printk(KERN_WARNING "bios32_service(0x%08x): not present ", service);
return 0;
default: /* Shouldn't happen */