1. 下面是使能highmem 和添加 highmem memory region的一个补丁:
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 428e767..25c8499 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -69,6 +69,7 @@ config BCM5621X
select CSRC_R4K
select DMA_NONCOHERENT
select IRQ_CPU
+ select SYS_SUPPORTS_HIGHMEM
select SYS_HAS_CPU_MIPS32_R1
select SYS_SUPPORTS_32BIT_KERNEL
select SYS_SUPPORTS_BIG_ENDIAN
diff --git a/arch/mips/bcm5621x/prom.c b/arch/mips/bcm5621x/prom.c
index 6a716ff..bf17fc0 100644
--- a/arch/mips/bcm5621x/prom.c
+++ b/arch/mips/bcm5621x/prom.c
@@ -175,6 +175,12 @@ static __init void prom_meminit(void)
BOOT_MEM_RESERVED);
}
#endif
+
+ /*
+ * Due to the physical liner address space 128M~256M used for I/O space in BCM956218 core sheet.
+ * So we need to map the 128M~256M DDR space to HIGHMEM space to use. Xiaoqiang.Jia@WindRiver.com
+ */
+ add_memory_region(0x88000000UL,0x8000000,BOOT_MEM_RAM);
}
#ifdef CONFIG_BLK_DEV_INITRD
2. 这是一个test highmem的简单程序:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//#include "string.h"
#define SIZE_128M_RAM 128*1024*1024
int main(int argc ,char**argv[])
{
char *p256m = NULL;
//分配128M内存,并初始化
p256m= malloc(SIZE_128M_RAM);
memset(p256m, 0 , SIZE_128M_RAM);
// 让他一直在运行
while(1);
return 0;
}
3. 运行测试程序:
# cat /proc/meminfo
MemTotal: 223756 kB
MemFree: 190136 kB
Buffers: 112 kB
Cached: 2364 kB
SwapCached: 0 kB
Active: 984 kB
Inactive: 1656 kB
HighTotal: 131072 kB
HighFree: 100072 kB
LowTotal: 92684 kB
LowFree: 90064 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 4 kB
Writeback: 0 kB
AnonPages: 180 kB
Mapped: 784 kB
Slab: 1860 kB
SReclaimable: 152 kB
SUnreclaim: 1708 kB
PageTables: 60 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 111876 kB
Committed_AS: 876 kB
VmallocTotal: 1015800 kB
VmallocUsed: 444 kB
VmallocChunk: 1015356 kB
# chmod 777 /bin/test_128m_ram
# ./bin/test_128m_ram &
++++++++++test for highmem........start alloc 128M ram space +++++++++++++++++++++++++++++++++
++++++++++test for highmem.......memset 128M ram space to really used higmem++++++++++++++++++
# ++++++++++test for highmem......alloc successfully++++++++++++++++++++++++++++++++++++++++++++
# jobs
[1] + Running ./bin/test_128m_ram
# cat /proc/meminfo
MemTotal: 223756 kB
MemFree: 57816 kB
Buffers: 112 kB
Cached: 2380 kB
SwapCached: 0 kB
Active: 132124 kB
Inactive: 1656 kB
HighTotal: 131072 kB
HighFree: 448 kB
LowTotal: 92684 kB
LowFree: 57368 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 20 kB
Writeback: 0 kB
AnonPages: 131308 kB
Mapped: 796 kB
Slab: 2888 kB
SReclaimable: 156 kB
SUnreclaim: 2732 kB
PageTables: 208 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 111876 kB
Committed_AS: 132172 kB
VmallocTotal: 1015800 kB
VmallocUsed: 444 kB
VmallocChunk: 1015356 kB
# ps
PID USER VSZ STAT COMMAND
1 root 3196 S init
2 root 0 SW< [kthreadd]
3 root 0 SW< [ksoftirqd/0]
4 root 0 SW< [watchdog/0]
5 root 0 SW< [events/0]
6 root 0 SW< [khelper]
27 root 0 SW< [kblockd/0]
48 root 0 SW [pdflush]
50 root 0 SW< [kswapd0]
92 root 0 SW< [aio/0]
100 root 0 SW< [unionfs_siod/0]
101 root 0 SW< [nfsiod]
699 root 0 SW< [bond0]
710 root 0 SW< [mtdblockd]
744 root 0 SW< [rpciod/0]
748 root 0 SW [pdflush]
755 root 3372 R -/bin/sh
759 root 129m R ./bin/test_128m_ram
761 root 3372 R ps
# jobs
[1] + Running ./bin/test_128m_ram
# fg
./bin/test_128m_ram
^C
# jobs
# cat /proc/meminfo
MemTotal: 223756 kB
MemFree: 189956 kB
Buffers: 112 kB
Cached: 2380 kB
SwapCached: 0 kB
Active: 1112 kB
Inactive: 1540 kB
HighTotal: 131072 kB
HighFree: 99988 kB
LowTotal: 92684 kB
LowFree: 89968 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 36 kB
Writeback: 0 kB
AnonPages: 180 kB
Mapped: 788 kB
Slab: 1892 kB
SReclaimable: 172 kB
SUnreclaim: 1720 kB
PageTables: 60 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 111876 kB
Committed_AS: 876 kB
VmallocTotal: 1015800 kB
VmallocUsed: 444 kB
VmallocChunk: 1015356 kB
#