2017-01-10 1 views
0

Если у меня есть собственный диспетчер памяти пространства ядра, теоретически возможно, чтобы пользователь мог совместно использовать указатель памяти, выделенный модулем ядра пользователю (CR0: 16) «используя read_cr0() и write_cr0(), что позволяет читать/записывать доступ ко всему пространству системной памяти?Совместное использование памяти из ядра в пользовательское пространство путем отключения «Write Protect Bit (CR0: 16)»

(Это для встраиваемых устройств, где мы «доверие» наши собственные процессы)

ответ

0

Я просто экспериментировал на собственном компьютере, но, чтобы ответить на мой собственный вопрос: Нет, это не представляется возможным разделить память ядра непосредственно процесс пользовательского пространства.

Я попытался написать свой собственный модуль ядра на основе стеки как регион на основе менеджера TEMPESTA в памяти (pool.c):

[...] 

static int __init 
tfw_pool_init(void) 
{ 
    printk(KERN_ALERT "HIJACK INIT\n"); 
    write_cr0 (read_cr0() & (~ 0x10000)); 

    pg_cache = alloc_percpu(unsigned long [TFW_POOL_PGCACHE_SZ]); 
    if (pg_cache == NULL) 
     return -ENOMEM; 

    printk(KERN_NOTICE "__tfw_pool_new = %p\n", __tfw_pool_new); 
    printk(KERN_NOTICE "tfw_pool_alloc = %p\n", tfw_pool_alloc); 
    printk(KERN_NOTICE "tfw_pool_realloc = %p\n", tfw_pool_realloc); 
    printk(KERN_NOTICE "tfw_pool_free = %p\n", tfw_pool_free); 
    printk(KERN_NOTICE "tfw_pool_destroy = %p\n", tfw_pool_destroy); 

    return 0; 
} 

static void __exit 
tfw_pool_exit(void) 
{ 
    free_percpu(pg_cache); 

    write_cr0 (read_cr0() | 0x10000); 
    printk(KERN_ALERT "MODULE EXIT\n"); 
} 

module_init(tfw_pool_init); 
module_exit(tfw_pool_exit); 
MODULE_LICENSE("GPL"); 

И не только вызов функции распечатанной ошибок сегментации, но моя система стала крайне нестабильной после загрузки модуля так НЕ ПОПРОБУЙТЕ ЭТО НА ДОМАХ.

Смежные вопросы