2017-01-10 7 views
0

私自身のカーネルスペースのメモリマネージャがある場合、カーネルモジュールによって割り当てられたメモリポインタをユーザーに共有することは理論上可能ですかread_cr0()とwrite_cr0()を使用して "ライトプロテクトビット(CR0:16)"をディセーブルし、システムメモリ空間全体へのリード/ライトアクセスを許可することによって、"Write Protect Bit(CR0:16)"を無効にしてカーネルからユーザー空間にメモリを共有

答えて

0

私はちょうど私の自身のコンピュータ上で実験したが、私自身の質問に答えるために(これは、私たち「信頼」私たち自身のプロセスは、組み込み機器のためです):NO、直接カーネルのメモリを共有することはできませんユーザスペースプロセス。

私はテンペスタのスタックのような領域ベースのメモリマネージャ(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"); 

とセグメンテーションフォールトをプリントアウト機能を呼び出すことが、私のシステムは非常に不安定になっただけでなく、モジュールをロードした後にを訪問しないでください。

関連する問題