Compare commits
3 Commits
main
...
68c5f8388b
| Author | SHA1 | Date | |
|---|---|---|---|
| 68c5f8388b | |||
| 0fff8ca9d1 | |||
| a2ac5eedcc |
@ -2,3 +2,12 @@
|
||||
|
||||
## Подпрограммы, программные прерывания и особые случаи
|
||||
|
||||
### АХТУНГ
|
||||
|
||||
**НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ НЕ ЗАГРУЖАТЬ КОД ИЗ ЭТОЙ ЛАБЫ**. Дело в том, что Linux считает прерывания его личной заботой и поэтому как правило сам отвечает за их обработку. Для того, чтобы сделать прикол из лабы с подменой таблицы векоторов прерываний необходимо написать модуль ядра.
|
||||
|
||||
Для тех, кто в танке, это означает следующее: **ЕСЛИ Я ОШИБСЯ ХОТЬ ГДЕ-ТО (А Я ВЕРОЯТНЕЕ ВСЕГО ГДЕ-ТО ОШИБСЯ), ВАШЕЙ СИСТЕМЕ МОЖЕТ ПРИЙТИ ПИЗДА. И ОЧЕНЬ БЫСТРО**
|
||||
|
||||
## Теперь для смелых
|
||||
|
||||
Милицын препод лояльный, поэтому было принято решение не грохать в лоб системную таблицу, а расширить ее своими прерываниями. Делается это в основном при помощи `request_irq`, в который передается куча инфы о прерывании
|
||||
|
||||
30
06-subroutines-interruptions/fuck-system.c
Normal file
30
06-subroutines-interruptions/fuck-system.c
Normal file
@ -0,0 +1,30 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
typedef struct {
|
||||
uint16_t size;
|
||||
uint64_t adress;
|
||||
} Fuck_IDT_register;
|
||||
|
||||
extern void store_idt(Fuck_IDT_register *storage);
|
||||
|
||||
static int __init fuck_system(void)
|
||||
{
|
||||
pr_info("start to fuck system");
|
||||
struct desc_ptr newidtr;
|
||||
gate_desc *oldint, *newint;
|
||||
Fuck_IDT_register idt_register;
|
||||
store_idt(&idt_register);
|
||||
pr_info("idt register stored");
|
||||
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");
|
||||
7
06-subroutines-interruptions/low-level-asm.asm
Normal file
7
06-subroutines-interruptions/low-level-asm.asm
Normal file
@ -0,0 +1,7 @@
|
||||
global store_idt
|
||||
|
||||
section .text
|
||||
|
||||
store_idt: ; rdi - указатель
|
||||
sidt [rdi]
|
||||
ret
|
||||
@ -1,7 +0,0 @@
|
||||
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
|
||||
@ -1,22 +0,0 @@
|
||||
!_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
|
||||
@ -1,43 +0,0 @@
|
||||
#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");
|
||||
@ -1,5 +0,0 @@
|
||||
global interrupt_wrapper
|
||||
|
||||
section .text
|
||||
interrupt_wrapper:
|
||||
|
||||
Reference in New Issue
Block a user