如下是linux正常系统启动时的log:
[ 0.000000] Memory: 256MB 256MB = 512MB total
[ 0.000000] Memory: 391676k/391676k available, 132612k reserved, 0K highmem
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
[ 0.000000] DMA : 0xff000000 - 0xffe00000 ( 14 MB)
[ 0.000000] vmalloc : 0xf0800000 - 0xfc000000 ( 184 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xf0000000 ( 768 MB)
[ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB)
[ 0.000000] .init : 0xc0008000 - 0xc002e000 ( 152 kB)
[ 0.000000] .text : 0xc002e000 - 0xc05be000 (5696 kB)
[ 0.000000] .data : 0xc05be000 - 0xc0606500 ( 290 kB)
内核空间占用从0xC0000000到0xFFFFFFFF的1GB线性地址空间,内核线性地址空间由所有进程共享,但只有运行在内核态的进程才能访问,用户进程可以通过系统调用切换到内核态访问内核空间,进程运行在内核态时所产生的地址都属于内核空间。
物理内存只有不连续的512MB,但是在这里却占用了768MB,导致vmalloc只有184MB。
存在的问题和疑问:
试着修改两段内存地址连续,把DMC0的起始地址由0x20000000改成0x30000000,内核中也作相应的修改,但是引导linux时后会出现oops错误,应该是访问了空指针,但是为什么会出现空指针呢,是否是内存映射的不对?
[ 0.000000] Memory: 512MB = 512MB total
[ 0.000000] Memory: 391924k/4k available, 0k reserved, 0K highmem
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
[ 0.000000] DMA : 0xff000000 - 0xffe00000 ( 14 MB)
[ 0.000000] vmalloc : 0xe0800000 - 0xfc000000 ( 440 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xe0000000 ( 512 MB) //大小已经改成512MB了
[ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB)
[ 0.000000] .init : 0xc0008000 - 0xc002d000 ( 148 kB)
[ 0.000000] .text : 0xc002d000 - 0xc0579000 (5424 kB)
[ 0.000000] .data : 0xc057a000 - 0xc05c0ec0 ( 284 kB)
......
[ 1.864637] Freeing init memory: 148K [ 1.868580] BUG: sleeping function called from invalid context at arch/arm/mm/fault.c:295 [ 1.876362] in_atomic(): 0, irqs_disabled(): 128, pid: 1, name: init [ 1.882685] Backtrace: [ 1.885136] [<c0031fb4>] (dump_backtrace+0x0/0x110) from [<c03d57f8>] (dump_stack+0x18/0x1c) [ 1.893519] r7:00100104 r6:00000000 r5:cf803d10 r4:cf800000 [ 1.899159] [<c03d57e0>] (dump_stack+0x0/0x1c) from [<c004a504>] (__might_sleep+0x120/0x140) [ 1.907563] [<c004a3e4>] (__might_sleep+0x0/0x140) from [<c0034970>] (do_page_fault+0xac/0x1fc) [ 1.916228] [<c00348c4>] (do_page_fault+0x0/0x1fc) from [<c002d2ec>] (do_DataAbort+0x3c/0xa0) [ 1.924720] [<c002d2b0>] (do_DataAbort+0x0/0xa0) from [<c002da6c>] (__dabt_svc+0x4c/0x60) [ 1.932862] Exception stack(0xcf803d10 to 0xcf803d58) [ 1.937890] 3d00: 00100100 00200200 00100100 00200200 [ 1.946037] 3d20: cfc002c0 c0a37598 00000000 c0a37580 c057ea58 c057ecd4 60000113 cf803dcc [ 1.954182] 3d40: 00000018 cf803d58 c0094b30 c0094c98 60000193 ffffffff [ 1.960764] r7:c0a37580 r6:00000000 r5:cf803d44 r4:ffffffff [ 1.966412] [<c0094a7c>] (get_page_from_freelist+0x0/0x4b0) from [<c0095034>] (__alloc_pages_nodemask+0x108/0x580) [ 1.976722] [<c0094f2c>] (__alloc_pages_nodemask+0x0/0x580) from [<c00a3958>] (handle_mm_fault+0x21c/0xc20) [ 1.986420] [<c00a373c>] (handle_mm_fault+0x0/0xc20) from [<c00349d0>] (do_page_fault+0x10c/0x1fc) [ 1.995345] [<c00348c4>] (do_page_fault+0x0/0x1fc) from [<c002d2ec>] (do_DataAbort+0x3c/0xa0) [ 2.003838] [<c002d2b0>] (do_DataAbort+0x0/0xa0) from [<c002df64>] (ret_from_exception+0x0/0x10) [ 2.012585] Exception stack(0xcf803fb0 to 0xcf803ff8) [ 2.017614] 3fa0: 00000000 bed56000 00020000 00001000 [ 2.025762] 3fc0: 0002101c 00000001 bed56000 bed75f2c bed75ec8 bed56000 00000000 00000000 [ 2.033906] 3fe0: 00021024 bed75eb0 bed75ed8 00016b78 a0000010 ffffffff [ 2.040488] r7:bed75f2c r6:bed56000 r5:00000001 r4:ffffffff [ 2.046126] Unable to handle kernel paging request at virtual address 00100104 [ 2.053314] pgd = cfacc000 [ 2.056000] [00100104] *pgd=3fad8031, *pte=00000000, *ppte=00000000 [ 2.062241] Internal error: Oops: 817 [#1] PREEMPT [ 2.067005] last sysfs file: [ 2.069952] Modules linked in: [ 2.072988] CPU: 0 Not tainted (2.6.35.7-g2e80cfd-dirty #50) [ 2.078967] PC is at get_page_from_freelist+0x21c/0x4b0 [ 2.084166] LR is at get_page_from_freelist+0xb4/0x4b0 [ 2.089279] pc : [<c0094c98>] lr : [<c0094b30>] psr: 60000193 [ 2.089285] sp : cf803d58 ip : 00000018 fp : cf803dcc [ 2.100716] r10: 60000113 r9 : c057ecd4 r8 : c057ea58 [ 2.105915] r7 : c0a37580 r6 : 00000000 r5 : c0a37598 r4 : cfc002c0 [ 2.112415] r3 : 00200200 r2 : 00100100 r1 : 00200200 r0 : 00100100 [ 2.118915] Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment user [ 2.126107] Control: 10c5387d Table: 3facc019 DAC: 00000015 [ 2.131825]