1 Commits

7 changed files with 77 additions and 86 deletions

View File

@ -2,12 +2,3 @@
## Подпрограммы, программные прерывания и особые случаи ## Подпрограммы, программные прерывания и особые случаи
### АХТУНГ
**НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ НЕ ЗАГРУЖАТЬ КОД ИЗ ЭТОЙ ЛАБЫ**. Дело в том, что Linux считает прерывания его личной заботой и поэтому как правило сам отвечает за их обработку. Для того, чтобы сделать прикол из лабы с подменой таблицы векоторов прерываний необходимо написать модуль ядра.
Для тех, кто в танке, это означает следующее: **ЕСЛИ Я ОШИБСЯ ХОТЬ ГДЕ-ТО (А Я ВЕРОЯТНЕЕ ВСЕГО ГДЕ-ТО ОШИБСЯ), ВАШЕЙ СИСТЕМЕ МОЖЕТ ПРИЙТИ ПИЗДА. И ОЧЕНЬ БЫСТРО**
## Теперь для смелых
Милицын препод лояльный, поэтому было принято решение не грохать в лоб системную таблицу, а расширить ее своими прерываниями. Делается это в основном при помощи `request_irq`, в который передается куча инфы о прерывании

View File

@ -1,69 +0,0 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <asm/desc.h>
// Смотрим у производителя процессора номер прерывания
// деления на ноль (я сижу на x86-64, а этот номер зависит от архитектуры процессора)
#define ZERODIV_NR 0x00
extern void store_idt(struct desc_ptr *storage);
static void example_handler(void)
{
pr_warn("entered the handler");
return;
}
static int __init fuck_system(void)
{
pr_info("start to fuck system");
struct desc_ptr newidtreg;
struct desc_ptr oldidtreg;
gate_desc *oldidt, *newidt;
pr_info("nessesary variables created");
// Выделяем память под 256 прерываний
unsigned long new_page = __get_free_page(GFP_KERNEL);
if (!new_page)
{
return -ENOMEM;
}
pr_info("new page allocated");
store_idt(&oldidtreg);
pr_info("IDT register stored");
newidtreg.address = new_page;
newidtreg.size = oldidtreg.size;
newidt = (gate_desc *)newidtreg.address;
memcpy(newidt, oldidt, newidtreg.size);
pr_info("IDT register saved in backup");
pack_gate(
(newidt + ZERODIV_NR),
GATE_INTERRUPT,
(unsigned long) example_handler,
0,
0,
__KERNEL_CS
);
pr_info("packed new gate");
load_idt(&newidtreg);
pr_info("loaded new interrupts");
int x = 1 / 0; // триггерим прерывание деления на ноль
pr_info("return from interrupt");
load_idt(&oldidtreg);
free_page(new_page);
pr_info("Unloaded everything");
return 0;
}
static void __exit unfuck_system(void)
{
pr_info("start to unfuck system");
}
module_init(fuck_system);
module_exit(unfuck_system);
MODULE_LICENSE("GPL");

View File

@ -1,8 +0,0 @@
global store_idt
section .text
store_idt: ; rdi - указатель
sidt [rdi]
ret
int3

7
09-keyboard/Makefile Normal file
View File

@ -0,0 +1,7 @@
obj-m += task1.o
modules:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

22
09-keyboard/tags Normal file
View File

@ -0,0 +1,22 @@
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/
!_TAG_OUTPUT_FILESEP slash /slash or backslash/
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/
!_TAG_PROC_CWD /home/electronixtm/code/CA/09-keyboard/ //
!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL https://ctags.io/ /official site/
!_TAG_PROGRAM_VERSION 5.9.0 //
IDT_rebuild task1.c /^static int __init IDT_rebuild(void)$/;" f typeref:typename:int __init file:
IDT_restore task1.c /^static void __exit IDT_restore(void)$/;" f typeref:typename:void __exit file:
INCLUDE_VERMAGIC task1.mod.c /^#define INCLUDE_VERMAGIC$/;" d file:
____versions task1.mod.c /^static const struct modversion_info ____versions[]$/;" v typeref:typename:const struct modversion_info[]__used __section ("__versions") file:
clean Makefile /^clean: $/;" t
global test.asm /^global interrupt_wrapper$/;" l
interrupt_wrapper test.asm /^interrupt_wrapper:$/;" l
kern_page task1.c /^static u64 kern_page; \/\/ u64 - macro meaning unsigned 64 bits$/;" v typeref:typename:u64 file:
modules Makefile /^modules:$/;" t
Лабораторная работа 9 README.md /^# Лабораторная работа 9$/;" c
Обмен ЭВМ с клавиатурой README.md /^## Обмен ЭВМ с клавиатурой$/;" s chapter:Лабораторная работа 9

43
09-keyboard/task1.c Normal file
View File

@ -0,0 +1,43 @@
#include<linux/module.h>
#include<linux/printk.h>
#include<linux/mm.h>
#include<asm/desc.h>
#include<linux/kernel.h>
#include<asm/traps.h>
static u64 kern_page; // u64 - macro meaning unsigned 64 bits
static gate
static struct desc_ptr default_idtr; // to save existing idtr
static int __init IDT_rebuild(void)
{
struct desc_ptr idtr; // here we're going to store our new interupts table
pr_info("---IDT-REBUILD INITIATED---");
store_idt(&default_idtr); // getting current idtr and store it
pr_info("obtained idtr");
pr_info("allocating new memory page");
kern_page = __get_free_page(GFP_KERNEL);
if (!kern_page)
{
return -ENOMEM;
}
idtr.address = kern_page; // going to store
idtr.size = default_idtr.size;
return 0;
}
static void __exit IDT_restore(void)
{
struct desc_ptr idtr;
store_idt(&idtr);
if (idtr.address != default_idtr.address || idtr.size != default_idtr.size)
{
load_idt(&default_idtr);
free_page(kern_page);
}
}
module_init(IDT_rebuild);
module_exit(IDT_restore);
MODULE_LICENSE("GPL");

5
09-keyboard/test.asm Normal file
View File

@ -0,0 +1,5 @@
global interrupt_wrapper
section .text
interrupt_wrapper: