- 论坛徽章:
- 0
|
又做了一个实验
# cat /proc/meminfo
MemTotal: 1544432 kB
MemFree: 1475704 kB
Buffers: 8604 kB
Cached: 31096 kB
SwapCached: 0 kB
Active: 30860 kB
Inactive: 19308 kB
HighTotal: 786368 kB
HighFree: 741500 kB
LowTotal: 758064 kB
LowFree: 734204 kB
SwapTotal: 522104 kB
SwapFree: 522104 kB
Dirty: 2524 kB
Writeback: 0 kB
AnonPages: 10512 kB
Mapped: 3184 kB
Slab: 7696 kB
SReclaimable: 2272 kB
SUnreclaim: 5424 kB
PageTables: 192 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 1294320 kB
Committed_AS: 16540 kB
VmallocTotal: 1294328 kB // 在启动时 kernel 里 vmalloc=1280M
VmallocUsed: 4216 kB
VmallocChunk: 1289704 kB
# free
total used free shared buffers cached
Mem: 1544432 68660 1475772 0 8604 31096
-/+ buffers/cache: 28960 1515472
Swap: 522104 0 522104
# insmod module.ko
# free
total used free shared buffers cached
Mem: 1544432 1118084 426348 0 8688 31096
-/+ buffers/cache: 1078300 466132
Swap: 522104 0 522104
# rmmod module
# free
total used free shared buffers cached
Mem: 1544432 69596 1474836 0 8772 31096
-/+ buffers/cache: 29728 1514704
Swap: 522104 0 522104
#
代码如下
- #include <linux/module.h>
- #include <linux/vmalloc.h>
- MODULE_AUTHOR("platinum");
- MODULE_DESCRIPTION("This is a module sample.");
- MODULE_LICENSE("GPL");
- #define MB (1024*1024)
- __u8 *data;
- int
- init_module (void)
- {
- data = vmalloc(1024 * MB);
- if (!data)
- return -ENOMEM;
- memset(data, 0xff, 1024 * MB);
- printk("module loaded.\n");
- return 0;
- }
- void
- cleanup_module(void)
- {
- vfree(data);
- printk("module unloaded.\n");
- }
复制代码
由此可见,在内核里分配并使用了 1G 内存空间,虽然实现了,但不知道用于生产环境是否可行
在386机器上,如果物理内存超过1G的话,default的vmalloc区间只有128M左右。同过vmalloc=XX参数的话,是减少了kernel线性映射空间为代价的。
在x86_64的机子上就没有这个问题,vmalloc的区间可以很大。
不知道这种代价到底有多大,对内存管理不熟悉,eexplorer 兄可否给我们讲一下
|
|