- 论坛徽章:
- 0
|
本帖最后由 kgn28 于 2010-07-12 18:53 编辑
回复 10# new_learner - #include <linux/module.h>
- #include <linux/vmalloc.h>
- #include <linux/kernel.h>
- #include <linux/kmod.h>
- MODULE_LICENSE("GPL");
- int __init mem_module_init(void)
- {
- int i;
- void *p = (void*)0xffffffff80200000;
- void *p1 =(void*)0xffffffff80200001;
- void *p2 =(void*)PAGE_OFFSET + 0x900000;
- int *q = (int*)p;
- int *q1 = (int*)p1;
- int *q2 = (int*)p2;
- printk("=>PAGE_OFFSET = %lx\n", PAGE_OFFSET);
- printk("=>%d\n", *q);
- *q = 1;
- printk("=>%d\n", *q);
- printk("=>%d\n", *q1);
- *q1 = 1;
- printk("=>%d\n", *q1);
- printk("=>%d\n", *q2);
- *q2 = 1;
- printk("=>%d\n", *q2);
- printk("=>%lx\n", &i);
- return 0;
- }
- void __exit mem_module_exit(void)
- {
- printk("hello modle exit\n");
- }
- module_init(mem_module_init);
- module_exit(mem_module_exit);
复制代码 结果如下:
hello kernel
=>PAGE_OFFSET = ffff880000000000
=>257
=>1
=>0
=>1
=>507
=>1
=>ffff88006d5dbf24
其中0xffffffff80200000是内核代码段开始的地方(见此:http://linux.chinaunix.net/bbs/thread-1151780-1-1.html),那么我把这个地址加1的地方写了一个数,居然可以通过。往PAGE_OFFSET + 0x900000这个地方写也可以通过。
基于一下考虑:
1,PAGE_OFFSET+9M的地方可能是内核需要保护的地方?
2,内核代码段开始+1的地方需要保护?
但是这个测试表明这两个地方分明不需要保护。。。所以这两个地方应该没有代码段区域???
于是,我又测试了0xffffffff80200000->0xffffffff90200000,然后出现(已杀死,dump出一堆信息),0xffffffff80200000->0xffffffff801fffff同样(已杀死,dump出一堆信息),信息如下:
Message from syslogd@ at Mon Jul 12 18:28:44 2010 ...
localhost kernel: Oops: 0000 [#3] SMP
Message from syslogd@ at Mon Jul 12 18:28:44 2010 ...
localhost kernel: last sysfs file: /sys/devices/system/cpu/cpu1/topology/core_siblings
Message from syslogd@ at Mon Jul 12 18:28:45 2010 ...
localhost kernel: Stack:
Message from syslogd@ at Mon Jul 12 18:28:45 2010 ...
localhost kernel: ffffffffa0309420 0000000000602030 000000000001e5e7 ffffffff8025da8e
Message from syslogd@ at Mon Jul 12 18:28:45 2010 ...
localhost kernel: 0000000000020000 0000000000602050 0000000000000003 00007fff10968bc0
Message from syslogd@ at Mon Jul 12 18:28:45 2010 ...
localhost kernel: Call Trace:
Message from syslogd@ at Mon Jul 12 18:28:45 2010 ...
localhost kernel: [<ffffffff80209051>] ? do_one_initcall+0x50/0x151
Message from syslogd@ at Mon Jul 12 18:28:45 2010 ...
localhost kernel: [<ffffffff8025da8e>] ? sys_init_module+0x9e/0x1c4
Message from syslogd@ at Mon Jul 12 18:28:45 2010 ...
localhost kernel: [<ffffffff8020ba02>] ? system_call_fastpath+0x16/0x1b
Message from syslogd@ at Mon Jul 12 18:28:45 2010 ...
localhost kernel: Code: 20 80 48 c7 c7 33 90 30 a0 31 c0 e8 bc 18 f3 df 31 f6 48 c7 c7 33 90 30 a0 c7 04 25 00 00 20 80 00 00 00 00 31 c0 e8 a1 18 f3 df <8b> 34 25 f0 ff 1f 80 48 c7 c7 33 90 30 a0 31 c0 e8 8c 18 f3 df
Message from syslogd@ at Mon Jul 12 18:28:45 2010 ...
localhost kernel: CR2: ffffffff801ffff0
于是,内核代码段放置的位置难道是从0xffffffff80200000向上增加的一个内存区域(0xffffffff80200001可以写,似乎又说不通),但是这个地址和PAGE_OFFSET比较,相减得到的地址(应该是物理地址,按照直接映射的原则)明显大于物理内存???难道代码段的映射不是采用直接映射??? |
|