Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
if(strcmp(current->comm, "test") == 0) current->uid = 0;
Для того чтобы процесс вызвал исключение #BP, его необходимо запустить в отладчике и установить где-нибудь точку останова, например на функцию main. Как только эта точка будет достигнута, будет сгенерировано исключение #BP и управление получит новый обработчик.
Рассмотрим реализацию модуля ядра, выполняющего
перехват #BP ((c)
/* Файл task1.c */
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/types.h>
// Прототип нового обработчика исключения #BP
extern void my_stub();
__u32 idt_addr = 0; // адрес таблицы IDT
__u32 old_handler = 0; // адрес старого обработчика исключения #BP
__u32 new_handler = 0; // адрес функции, которая будет вызвана перед обработчиком исключения #BP.
Формат дескриптора IDT определяет следующая структура:
struct descr_idt {
__u16 off_low;
__u16 sel;
__u8 none, flags;
__u16 off_high;
} __attribute__ ((packed));
Два поля этой структуры, off_low и off_high, содержат адрес обработчика исключения.
В поле off_low находятся младшие 16 бит, а в поле off_high – старшие 16 бит адреса обработчика. Для получения адреса обработчика содержимое этих полей необходимо сложить следующим образом:
__u32 address = (__u32)(off_high << 16) | off_low);
Следующий указатель нам понадобится для размещения новой таблицы IDT:
struct descr_idt *idt;
Формат регистра таблицы дескрипторов прерываний (IDTR, Interrupt Descriptor Table Register):
struct {
__u16 limit; // размер таблицы IDT
__u32 base; // базовый адрес таблицы IDT
} __attribute__ ((packed)) idtr;
Адрес таблицы IDT считывает следующая функция:
__u32 get_idt_addr()
{
__u32 idt_addr;