通过禁用“写保护位(CR0:16)”从内核到用户空间共享内存

时间:2017-01-10 01:42:00

标签: linux memory module kernel protection

如果我有自己的内核空间内存管理器,理论上可以通过使用read_cr0()禁用“写保护位(CR0:16)”来共享内核模块分配给用户空间应用程序的内存指针, write_cr0()因此允许对整个系统内存空间进行读/写访问?

(这适用于我们“信任”我们自己的流程的嵌入式设备)

1 个答案:

答案 0 :(得分: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");

不仅调用函数打印出segfaults,而且我的系统在加载模块后变得非常不稳定,因此不要在家里尝试