Vous êtes sur la page 1sur 30

MEMORY MANAGEMENT

Linux kernel training, session 8 Eugeniu Roca

LINUX ADDRESS SPACES. FIST GLANCE


3G/1G split

ARM MMU. For docs see http://infocenter.arm.com

LINUX ADDRESS SPACES. RASPBERRY PI.

CONFIG_PAGE_OFFSET

cat /proc/vc-mem

ADDRESS TYPES. CORRELATION WITH LDD


Raspberry PI: Addresses in ARM Linux are: issued as virtual addresses by the ARM core, then mapped into a physical address by the ARM MMU, then mapped into a bus address by the ARM mapping MMU, and finally used to select the appropriate peripheral or location in RAM. Address types in Linux, LDD3:
1. virtual addresses = addresses allocated for user-space programs; 2. physical addresses = addresses used between the processor and the systems memory; In case of RasPi, translation done by ARM MMU. 3. bus addresses = addresses used between peripheral buses and memory. Translation done by unit called IOMMU (in RasPi case: GPU MMU). 4. kernel logical addresses: normal address space of the kernel. One-to-one mapping to physical addresses (+offset). 5. kernel virtual addresses: Also belong to kernel space only. But, not having one-to-one mapping to physical. Cannot be represented by a void pointer.

MMU. NORMAL CASE VS RASPBERRY PI.


ARM classic

Raspberry PI

GPU (VC) MMU

BUS address

/INCLUDE/LINUX/MMZONE.H MEMORY ZONES. GENERIC CASE.

/INCLUDE/LINUX/MMZONE.H MEMORY ZONES. RASPBERRY PI CASE.

MEMORY ZONES. EXPLAINED.


ZONE DMA: - is memory in the lower (0-16 MB) physical memory range that certain ISA devices require; - At this point it exists for historical reasons => long time ago, there was hardware that could only do DMA into this area of physical memory; ZONE DMA32: - exists only in 64-bit Linux; - it is the low 4 GBytes of memory, more or less; - It exists because the transition to large memory 64-bit machines has created a class of hardware that can only do DMA to the low 4 GBytes of memory ZONE NORMAL (for 32-bit machines): - directly mapped by the kernel into the upper region of the linear address space; - all RAM from 16 MB to 896 MB for complex and somewhat historical reasons; ZONE NORMAL (for 64-bit machines): - all RAM from 4GB (or so) to the topmost limit; ZONE HIGHMEM - exists ONLY on 32bit machines; - all RAM above 896 MB; - not directly mapped by the kernel;

/INCLUDE/LINUX/MMZONE.H KSWAPD. MEMORY ZONE WATERMARKS.

DOCUMENTATION / ARM / MEMORY.TXT MEMORY LAYOUT ON ARM LINUX. 1.

DOCUMENTATION / ARM / MEMORY.TXT MEMORY LAYOUT ON ARM LINUX. 2.


VMALLOC_START VMALLOC_END

PAGE_OFFSET

high_memory

PKMAP_BSE

PAGE_OFFSET - 1

MODULES_VADDR

MODULES_END

TASK_SIZE - 1

Check Kernel Definitions in source code !

GOING DEEPER IN MEMORY MANAGEMENT. STATIC

INCLUDE / LINUX / MMZONE.H BUDDY ALLOCATOR.


- It is responsible for the management of the page allocations in the entire system; - It splits memory into pairs of 2n pages where n is in range from 0 to MAX_ORDER; - It stores information about the free blocks of pages in the array of lists as follows:

INCLUDE / LINUX / MMZONE.H BUDDY ALLOCATOR.


- Each list consists of free physically contiguous blocks of 2^i memory pages, where i is the list number; - Each of such blocks, except the block that consists of 1 page, can be split into two halves and used as 2 blocks of a half size. - So if no entries exist in the requested list, an entry from the next upper list is broken into two separate clusters and one is returned to the caller while the other one is added to the next lower list. - On the other hand, every two blocks of memory of the same size, which have common border (arranged in memory sequentially, from the standpoint of physical addresses), may be united into the single block of the bigger size.

INCLUDE / LINUX / MMZONE.H BUDDY ALLOCATOR.

INTERNAL FRAGMENTATION VS EXTERNAL


FRAGMENTATION

External fragm: Space wasted outside of allocated memory blocks. Small pieces of memory exist among the allocated blocks. However, a larger allocation request cannot be fulfilled, because the free pieces are not physically contiguous. Internal fragm: Space wasted inside of allocated memory blocks because of restriction on the allowed sizes of allocated blocks.

AVAILABLE KERNEL-SPACE MEMORY


ALLOCATION METHODS

MEMORY ALLOCATION API GET PAGES DIRECTLY. BYPASS SLAB.

MEMORY ALLOCATION API GET PAGES DIRECTLY. BYPASS SLAB.

MEMORY ALLOCATION API GET PAGES DIRECTLY. BYPASS SLAB.

MEMORY ALLOCATION API GET PAGES DIRECTLY. BYPASS SLAB.

MEMORY ALLOCATION API GET MEMORY THROUGH SLAB.

SLAB ALLOCATOR.
cat /proc/slabinfo output:
size-4194304 size-2097152 size-1048576 size-524288 size-262144 size-131072 size-65536 size-32768 size-16384 size-8192 size-4096 size-2048 size-1024 size-512 size-256 size-192 size-128 size-96 size-64 size-32 kmem_cache 0 0 4194304 1 1024 : tunables 1 1 0 : slabdata 0 0 0 0 0 2097152 1 512 : tunables 1 1 0 : slabdata 0 0 0 0 0 1048576 1 256 : tunables 1 1 0 : slabdata 0 0 0 0 0 524288 1 128 : tunables 1 1 0 : slabdata 0 0 0 0 0 262144 1 64 : tunables 1 1 0 : slabdata 0 0 0 0 0 131072 1 32 : tunables 8 4 0 : slabdata 0 0 0 0 0 65536 1 16 : tunables 8 4 0 : slabdata 0 0 0 8 8 32768 1 8 : tunables 8 4 0 : slabdata 8 8 0 1 1 16384 1 4 : tunables 8 4 0 : slabdata 1 1 0 8 8 8192 1 2 : tunables 8 4 0 : slabdata 8 8 0 25 25 4096 1 1 : tunables 24 12 0 : slabdata 25 25 0 24 24 2048 2 1 : tunables 24 12 0 : slabdata 12 12 0 84 84 1024 4 1 : tunables 54 27 0 : slabdata 21 21 0 376 376 512 8 1 : tunables 54 27 0 : slabdata 47 47 0 210 210 256 15 1 : tunables 120 60 0 : slabdata 14 14 0 141 160 192 20 1 : tunables 120 60 0 : slabdata 8 8 0 570 570 128 30 1 : tunables 120 60 0 : slabdata 19 19 0 996 1000 96 40 1 : tunables 120 60 0 : slabdata 25 25 0 882 1062 64 59 1 : tunables 120 60 0 : slabdata 18 18 0 3337 3390 32 113 1 : tunables 120 60 0 : slabdata 30 30 0 135 160 96 40 1 : tunables 120 60 0 : slabdata 4 4 0

SLAB ALLOCATOR.

SLAB ALLOCATOR.

KMALLOC ALLOCATOR.

KMALLOC ALLOCATOR.

KMALLOC ALLOCATOR.

VMALLOC ALLOCATOR.

/PROC INFORMATION
- /proc/iomem - /proc/meminfo = see /Documentation/filesystems/proc.txt - /proc/zoneinfo = see page_alloc.c - /proc/vmstat/ - /proc/buddyinfo = debug External fragmentation. Lots of order 0 pages mean lots of fragmentation, (kernel can't even find two adjacent aligned pages to merge into an 8kb order 1 chunk) - /proc/sys/vm/* = see Documentation/sysctl/vm.txt - /proc/pagetypeinfo = goal same as of buddyinfo (debug External fragmentation) - /proc/vmallocinfo = see /Documentation/filesystems/proc.txt (iotable_init, ioremap, vmalloc) - /proc/vc-mem/

Vous aimerez peut-être aussi