diff --git a/09-keyboard/Makefile b/09-keyboard/Makefile new file mode 100644 index 0000000..0263f5c --- /dev/null +++ b/09-keyboard/Makefile @@ -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 diff --git a/09-keyboard/tags b/09-keyboard/tags new file mode 100644 index 0000000..f02a43b --- /dev/null +++ b/09-keyboard/tags @@ -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 diff --git a/09-keyboard/task1.c b/09-keyboard/task1.c new file mode 100644 index 0000000..212b74d --- /dev/null +++ b/09-keyboard/task1.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include +#include +#include + + +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"); diff --git a/09-keyboard/test.asm b/09-keyboard/test.asm new file mode 100644 index 0000000..702d959 --- /dev/null +++ b/09-keyboard/test.asm @@ -0,0 +1,5 @@ +global interrupt_wrapper + +section .text +interrupt_wrapper: +