通过禁用 "Write Protect Bit (CR0:16)" 从内核共享内存给用户 space
Sharing memory from kernel to user space by disabling the "Write Protect Bit (CR0:16)"
如果我有自己的内核 space 内存管理器,理论上是否可以通过禁用 "Write Protect Bit (CR0:16)" 来共享内核模块分配给用户 space 应用程序的内存指针使用 read_cr0() 和 write_cr0() 从而允许 read/write 访问整个系统内存 space?
(这适用于我们 "trust" 我们自己的进程的嵌入式设备)
我只是在自己的计算机上进行了实验,但为了回答我自己的问题:不,不可能直接与用户 space 进程共享内核内存。
我确实尝试基于 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");
不仅调用函数打印出段错误,而且我的系统在加载模块后变得非常不稳定,所以不要在家里尝试这个。
如果我有自己的内核 space 内存管理器,理论上是否可以通过禁用 "Write Protect Bit (CR0:16)" 来共享内核模块分配给用户 space 应用程序的内存指针使用 read_cr0() 和 write_cr0() 从而允许 read/write 访问整个系统内存 space?
(这适用于我们 "trust" 我们自己的进程的嵌入式设备)
我只是在自己的计算机上进行了实验,但为了回答我自己的问题:不,不可能直接与用户 space 进程共享内核内存。
我确实尝试基于 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");
不仅调用函数打印出段错误,而且我的系统在加载模块后变得非常不稳定,所以不要在家里尝试这个。