Discussion:
[uClinux-dev] uClinux crashes when memory manager is initialised
Plüss Tobias TA.E.1001
2013-04-03 04:51:34 UTC
Permalink
Hi all,

I still try to run uClinux on an ARM7 device. I am now able to compile a XIP image for my kernel with appropriate addresses for my system. I have also one simple "bootloader", which initialises the hardware, sets up an ATAG list in the memory and jumps to the kernel.

My memory map looks as follows:

0x40000000 - 0x40010000 SRAM
0x80000000 - 0x80400000 FLASH
0xA0000000 - 0xA4000000 SDRAM

So I set up the ATAG list with the appropriate ATAG_CORE, ATAG_MEM and ATAG_NONE. The kernel recognises these tags and tries to setup some memory management things; however, I guess it calculates some wrong address or so and therefore cannot boot. The problem happens in the memmap_init_zone function in mm/page_alloc.c:

the function is called with the argument size = 0x640000 (whis is awkward but not completely wrong as it is 0xA40000 - 0x40000; these values are calculated by free_area_init_core() ). Okay, then the statement

page = pfn_to_page(pfn);

is reached, and this is the point where the kernel crashes: it always calculates some strange address of 0x9fff4500 for 'page', and this value is definitely wrong as it is outside of any memory, there is NO memory at this address, but the kernel tries to write there, and, as expected, my microcontroller performas a reset, since this is definitely an illegal address for write and/or read access. But I do not have any MMU or MPU, and I disabled options concerning MMU things.

Does anybody have an idea, what the problem could be with this?
Is it a problem, that I do not prepare a device tree blob before booting? I have not yet installed the dtb file; but I guess, I should place it in memory as well as the ATAG list and pass it to the kernel via some ATAG?

Please help. Many thanks in advance!

Loading...