본문 바로가기

memory

linux kernel 의 memory mapping 함수 정리 vaddr* = __ioremap(paddr, size) : paddr 로 시작하는 size만큼의 address 를 PA에서 VA로 mapping 한다. mmu page table에 이 range가 등록된다. vaddr* = phys_to_virt(paddr) paddr* = virt_to_phys(vaddr) : 이미 mmu page table에 등록된 range에서 찾아서, paddr 과 vaddr을 변환해 준다. 등록안된 addr에 대해서는 fail 할 것이다. 더보기
__meminit section keyword 아래와 같이 _meminit section keyword 가 붙은 함수들을 볼 수 있다. 이러한 함수들은 linux kernel booting 초반에만 code영역에 위치하고, 이후 code영역이 overwrite된다. 즉, booting 초기에만 사용될 함수라고 보면 된다. extern int __meminit early_pfn_to_nid(unsigned long pfn); /* there is a per-arch backend function. */ extern int __meminit __early_pfn_to_nid(unsigned long pfn, struct mminit_pfnnid_cache *state); 부팅이 일정이상 진행되면 호출할 수 없다. 더보기
memory compaction (kcompactd) Kswapd & Kcompactd 노드마다 kswapd와 kcompactd가 동작하며 free 메모리가 일정량 이상 충분할 때에는 잠들어(sleep) 있다. https://www.kernel.org/doc/Documentation/sysctl/vm.txt compact_memory Available only when CONFIG_COMPACTION is set. When 1 is written to the file, all zones are compacted such that free memory is available in contiguous blocks where possible. This can be important for example in the allocation of huge pages a.. 더보기
[linux kernel] memory zone 원문 : http://rousalome.egloos.com/10002612 [리눅스커널] 메모리관리: 메모리 존(Zone) 종류와 개념 소개 리눅스 메모리 시스템에서 존(Zone)은 유사한 속성의 페이지들을 집합입니다. 커널에서 페이지들을 다음과 같은 존으로 나눠서 관리합니다.  ZONE_NORMAL  ZONE_HIGH_MEM  ZOME_MOVEABLE 다음 그림은 존과 페이지과의 관계도입니다. [그림 14.22] 존과 페이지와의 관계 위 그림에서 rousalome.egloos.com 리눅스 메모리 시스템에서 존(Zone)은 유사한 속성의 페이지들을 집합입니다. 커널에서 페이지들을 다음과 같은 존으로 나눠서 관리합니다.  ZONE_NORMAL  ZONE_HIGH_MEM  ZOME_MOVEABL.. 더보기
buddy allocator가 왜 buddy인가? 원문 : https://woodz.tistory.com/57 더보기
proc/meminfo 분석하기 와 pagecache size limitation(restrict) 하는 방법 1. meminfo 분석하기 전반적인 내용 : https://ssambback.tistory.com/entry/Linux-Memory%EC%9D%98-%EC%83%81%ED%83%9C%EB%A5%BC-%EB%B6%84%EC%84%9D%ED%95%98%EB%9D%BC Linux Memory의 상태를 분석하라 리눅스의 메모리 사용량의 경우 항상 물리적인 메모리 대비 Cache 와 Buffer의 사용량에 대해서 논쟁이도고는 한다. 물론 운영중에 갑자기 물리적인 메모리의 사용량이 늘어서 SWAP을 사용하는 경우라면 달라지겠.. ssambback.tistory.com 정보는 최고사용량과 최저사용량으로 표현되며, 먼저 최고사용량에 대해 살펴보면 다음과 같다. - MemoryTotal : 사용 가능한 최대 메모리(R.. 더보기
balloon driver balloon driver : Hypervisor 의 메모리 관리 기법중 하나 https://theithollow.com/2012/12/26/vmware-ballooning-explained/ 이 기법은 host 가 낮은 physical memory 상에서 동작할때만 유효한 기능이다. 만약 host 가 60 GB 의 physical memory 를 가지고 있고, VM 이 30GB만 alloc 한다면 이 기법은 생각할 필요가 없다. VM 에 할당한 메모리들은 active 하게 사용되지 않는다. VMware ballooning 은 기본적으로 host 에게 메모리를 돌려달라는 요구로 구성되어 있다. host 는 기본적으로 guest OS 들이 하는일을 모르고, guest OS 는 자신이 virtual 하다는 .. 더보기
Android low memory killer disable 하기 출처 : http://varun-anand.com/mem_mgmt.htmlDISABLING ANDROID MEMORY MANAGEMENT SYSTEMLow memory killer was added as a kernel extension to the Android. The main source code is located at "/drivers/staging/android/lowmemorykiller.c". One of the interesting things to observe is the directory "staging" where the source code resides. Google added some of the kernel extensions such as wakelocks, lowmemk.. 더보기
사용가용한 physical memory block 을 얻어오는 방법 /sys/devices/system/memory/ 의 메모리들 /sys/devices/system/memory# ls block_size_bytes memory14 memory32 memory4 memory47 memory54 memory61 memory8 hard_offline_page memory15 memory33 memory40 memory48 memory55 memory62 memory9 memory0 memory16 memory34 memory41 memory49 memory56 memory63 probe memory1 memory17 memory35 memory42 memory5 memory57 memory64 soft_offline_page memory10 memory18 memory36 .. 더보기
리눅스커널의메모리관리 원문 : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1641 linux virtual memory 에 대한 너무 좋은 강좌 꼭 한번 읽어보시길 Step by Step 커널 프로그래밍 강좌③ 리눅스커널의메모리관리 지난 호에 우리는 커널 모듈 프로그래밍에 관한 기본적인 것들을 살펴보았다. 이번 호 에서는 지난 번 모듈 프로그래밍에 이어 커널에서 가장 흔히 사용하는 함수 중의 하나 인 kmalloc을 통해 커널에서 시스템의 메모리를 어떻게 관리하는지 알아보기로 한다. 글 _ 김민찬 KLDP 멤버, 전문 프로그래머 연재 순서 ① 커널 프로그래밍 환경 구축하기와 특징 ② 모듈 구현하기 ③ 리눅스 커널의 메모리 관리 ④ 커널.. 더보기
linux process memory usage 원문 : http://blog.naver.com/PostView.nhn?blogId=yesing1&logNo=70120580840 linux kernel stack에 대한 오해출처 : http://blog.naver.com/lache96?Redirect=Log&logNo=140051813931 정리하면3G~4G영역에 프로세스마다 커널 스택이 존재한다.인터럽트 발생시 커널 스택에 현재 프로세서의 context를 push한다. 인터럽트 핸들러를 처리 후 scheduler에 의해 같은 프로세스가 실행되면push 되었던 프로세서 context를 pop하여 동작한다.(다른 프로세스가 먼저 선택되면 역시 kernel stack의 정보를 pop하여 사용한다.커널스택은 프로세스마다 같은 공간을 사용한다. 출처 : ht.. 더보기
kernel 초기화시 지켜야 할 Ram memory size align 단위 kernel 2.6.32 kernel 초기화시 각 영역별로 ram memory 를 잡게 됩니다. 이러한 메모리들은 bank 에 저장되어서 start_kernel 에서 bootmem_init 을 호출하여 초기화 하게 되지요. 조금 더 정확하게 적자면 다음과 같이 boot param 을 bootloader에서 kernel로 전달되게 되면 "meminfo=mem=80M mem=253M@0x40000000 mem=128M@0x50000000" parse_cmdline 에서 early_mem 함수를 호출하여서 해당 구문을 해석하고 arm_add_memory 를 호출합니다. arm_add_memory 는 bank 구조체에 해당 정보를 채우게 되지요. meminfo = ( nr_banks = 0x3, bank = (.. 더보기
linux virtual memory - Zone, Node, Section 의 개념 정의 : kernel 이 비슷한 속성을 가지는 page 를 관리하는 각 영역 사용 이유 1. 특정 메모리 주소에만 DMA 를 사용할 수 있는 HW 가 있다. 2. 가상 주소보다 더 많은 물리 주소를 사용할 수 있는 아키텍처가 있다. 종류 : ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM In Linux, the memory available from all banks is classified into "nodes". These nodes indicate how much memory each bank has. This classification is mainly useful for NUMA architectures, but it's also used for.. 더보기
Device Driver - memory mapping 원문 : http://vincenthanna.springnote.com/pages/2267520?print=1 Device Driver - memory mapping 가상 주소와 MMU 간단한 시스템은 물리 주소만으로도 동작할 수 있다. 그러나 다중프로세스를 지원하고 각 프로세스에 대해 메모리 공간을 보호해야 하는 운영체제는 물리 주소만으로 구현하기는 어렵다. MMU는 프로세서에 전달되는 주소를 다른 주소로 변환한다. 그래서 프로세서가 메모리에 접근하는 주소가 메모리에 직접 전달되는 것이 아니라 먼저 MMU에 전달되고, MMU는 변환 테이블을 참고해 이 주소를 실제 물리 주소로 변환해 전달한다. 이때 프로세서가 MMU에 가상 주소를 전달하면, MMU가 이 가상 주소를 해석하여 나온 물리 주소를 실제 메모.. 더보기
ps u에 나오는 RSS 사이즈는 VSZ 사이즈까지 증가한다. (할 수 있다)| 원문 : http://elenoa.tistory.com/181 좋은 내용이군요. 이론으로는 알고 있는 내용이지만 이렇게 실재로 눈으로 보는것은 참 의미있다고 생각합니다. 헌데 여기서 나오는 rss 는 smaps 에 나오는 rss, pss 와 같은 의미일까요? 결과를 다 써놓고 정리하자니 벌쭘하지만. VSZ와 RSS는 뭘까? man 페이지의 ps 항목에서 설명하는 두 파라미터의 설명은 다음과 같다. VSZ virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize). RSS resident set size, the .. 더보기
fallocate system call 원문 : http://lwn.net/Articles/239738/ fallocate 는 일련된 메모리 블럭을 예약할 수 있는 시스템 콜이다. 이 system call 은 파일시스템 단위에서 지원되어야 사용할 수 있으며 현재 Ext4와 XFS에서 지원하고 있다고 한다. 향후 다양한 플렛폼 및 파일시스템에 이식 되어 널리 사용될 것이라고 한다. 현재는 이러한 기능을 사용하기 위해서는 posix_fallocate 를 사용해야 하는데 이 syscall은 메모리 블럭을 잡은후 fregmantaion 을 막기위해 0으로 체워둔다고 한다. 이러한 낭비를 막기 위해서 fallocate syscall 에 대한 필요성이 대두되고 있다. root@onegun-ubuntu:~/2_hdisk/Project/Mobibench/s.. 더보기