tags:

views:

1639

answers:

3

I am trying to understand my embedded linux application's memory use. The /proc/pid/maps utility/file seems to be a good resource for seeing the details. Unfortunately I don't understand all the columns and entries.

Is there good resource/documentation for the proc//maps utility/file?

What does the anonymous inode 0 entries mean? These seem to be some of the larger memory segments.

+1  A: 

memory mapping is not only used to map files into memory but is also a tool to request RAM from kernel. These are those inode 0 entries - your stack, heap, bss segments and more

Xeor
+2  A: 

proc(5)

mmap(2)

"Understanding the Linux Kernel" 9.3. Memory Regions; 16.2. Memory Mapping

"Understanding the Linux Virtual Memory Manager" 4.4 Memory Regions

wRAR
+7  A: 

Each row in /proc/pid/maps describes a region of contiguous virtual memory in a process or thread. Each row has the following fields:

  • address - This is the starting and ending address of the region in the task's address space
  • permissions - This describes how pages in the region can be accessed. There are four different permissions: read, write, execute, and shared. If read/write/execute are disabled, a '-' will appear instead of the 'r'/'w'/'x'. If a region is not shared, it is private, so a 'p' will appear instead of an 's'. If the task attempts to access memory in a way that is not permitted, a segmentation fault is generated. Permissions can be changed using the mprotect system call.
  • offset - If the region was mapped from a file (using mmap), this is the offset in the file where the mapping begins. If the memory was not mapped from a file, it's just 0.
  • device - If the region was mapped from a file, this is the major and minor device number (in hex) where the file lives.
  • inode - If the region was mapped from a file, this is the file number.
  • pathname - If the region was mapped from a file, this is the name of the file. This field is blank for anonymous mapped regions. There are also special regions with names like [heap], [stack], or [vdso]. [vdso] stands for virtual dynamic shared object. It's used by system calls to switch to kernel mode. Here's a good article about it.

You might notice a lot of anonymous regions. These are usually created by mmap but are not attached to any file. They are used for a lot of miscellaneous things like shared memory or buffers not allocated on the heap. For instance, I think the pthread library uses anonymous mapped regions as stacks for new threads.

Jay Conrod
Yes the pthreads are allocating 8Mb blocks for a stack with a smaller section for stack overflow detection(i think). So each pthread created, by default, allocates an inode 0 memory region of 8Mb and a inode 0 region of 4Kb.
simon