feat: настроено окружение и написано пару строчек кода
This commit is contained in:
43
09-keyboard/task1.c
Normal file
43
09-keyboard/task1.c
Normal 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");
|
||||
Reference in New Issue
Block a user