Anna,

> Hi Larry,
> 
> Thanks for your response.
> 
>> Subject: Re: [uClinux-dev] ucLinux and XIP memory savings
>> 
>> Anna,
>> 
>> It is a national holiday in the US, so I am out of the office until
>> Monday when I will be able to send you more details.
>> 
>> I tried to use a Lantronix EDS2100 for an RS-232 data-logging
>> application with remote access.  That box has an M68K ColdFire
>> processor, 8MB RAM, 8 MB flash.  I used XIP and any other technique I
>> could find to increase RAM.  The biggest headache was the Linux 2.6
>> power-of-2 buddy system memory allocator.  I guess in the 2.4 kernel,
>> there was a boxcar memory allocator.  That would have been better for
>> such a small memory system.  I had to resort to fixing GCC to try to
>> catch stack overflow problems in standard apps (NTP, for time -- no
>> RTC).  But, I ran out of time to get the system to run reliably -- it
>> kept locking up because of memory allocation failures due to the power-
>> of-2 memory allocation scheme.
> 
> Is this really still true? I had read somewhere that it is possible to 
> replace the standard kernel memory allocator under ucLinux with one that is 
> better suited to embedded systems, e.g. a block-based memory pool type 
> allocator. I cannot find the reference anymore now though.

I believe these are references to the choice of SLAB/SLOB/SLUB for the kernel 
memory allocator.  The trouble I ran into are with the user memory allocator.  
It is my impression that the kernel memory allocator calls the user memory 
allocator for big chunks, then uses its own SLAB/SLOB/SLUB allocation strategy 
to hand out to kernel clients.

> Also, I found in the kernel documentation that in the no-MMU configuration 
> you can disable power-of-2 round-ups by setting sysctl `vm.nr_trim_pages' to 
> 0. This would allow finer-grained memory allocation and help limit 
> fragmentation. 

I've not heard of this.  In 
https://www.kernel.org/doc/Documentation/sysctl/vm.txt it says
> ==============================================================
> 
> nr_trim_pages
> 
> This is available only on NOMMU kernels.
> 
> This value adjusts the excess page trimming behaviour of power-of-2 aligned
> NOMMU mmap allocations.
> 
> A value of 0 disables trimming of allocations entirely, while a value of 1
> trims excess pages aggressively. Any value >= 1 acts as the watermark where
> trimming of allocations is initiated.
> 
> The default value is 1.
> 
> See Documentation/nommu-mmap.txt for more information.
> 
> ==============================================================

In https://www.kernel.org/doc/Documentation/nommu-mmap.txt it says
> =================================
> ADJUSTING PAGE TRIMMING BEHAVIOUR
> =================================
> 
> NOMMU mmap automatically rounds up to the nearest power-of-2 number of pages
> when performing an allocation.  This can have adverse effects on memory
> fragmentation, and as such, is left configurable.  The default behaviour is to
> aggressively trim allocations and discard any excess pages back in to the page
> allocator.  In order to retain finer-grained control over fragmentation, this
> behaviour can either be disabled completely, or bumped up to a higher page
> watermark where trimming begins.
> 
> Page trimming behaviour is configurable via the sysctl `vm.nr_trim_pages'.

I think

   1) is not a different user memory allocator -- memory is still always 
allocated in powers-of-2;
   2) the "excessive"trimming would result in small fragments for the life of 
the larger allocation;
   3) if none of those smaller fragments happen to get allocated in the mean 
time, when the larger
allocation is released, they will all get agglomerated into the original block;
   4) if one of those smaller fragments happens to get allocated in the mean 
time, and is held for a
long time, that has the negative effect that can be overcome using 
vm.nr_trim_pages.

Still, it might be worth experimenting with on a memory constrained system.  I 
ran out of time to
continue butting my head against the limitations of a noMMU system, I had to 
put that effort aside.

In addition to the problems with large enough chunks of free user memory 
disappearing over time,
I also had stack overflow problems with applications like NTP.  An MMU Linux 
automatically extends
the user stack when it overflows (to a limit).  Even though GCC says it 
supports stack limit checking
for M68K processors, it causes an Internal Compiler Error for M68000 
processors, such as ColdFire.
(See GCC 28896 at Bug http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28896.)  I 
added support to
GCC for M68000 processors, and fixed the other bugs I found for stack limit 
checking.  (Patches and
build instructions are also at 
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28896.)

> I haven't used any of these myself, so any guidance on the suitability of 
> those configuration options would be great.
> 
> Thanks,
> Anna

Larry Baker
US Geological Survey
650-329-5608
ba...@usgs.gov

_______________________________________________
uClinux-dev mailing list
uClinux-dev@uclinux.org
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by uclinux-dev@uclinux.org
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev

Reply via email to