본문 바로가기

Programming

mmap (user space)의 MAP_ANONYMOUS 에 대해서... mmap은 보통 file이나 kernel이 alloc한 memory를 user space에서 remap해서 VA로 접근하기 위해 사용하지만, MAP_ANONYMOUS 로 사용할 경우는, addr=0, fd=-1로 설정하게 된다. 어떤 case에서 이러한 mapping을 사용하는지 보자. 우선, MAP_ANONYMOUS로 할당한다고 해도, user application 상에서 이 memory를 read write 하는데는 아무런 문제가 없다는 것을 미리 알아두자. http://jake.dothome.co.kr/user-virtual-maps-mmap2/ 어떠한 파일하고도 연결되지 않고 0으로 초기화된 영역. fd는 무시되지만 어떤 경우에는 -1이 요구된다. offset는 0으로 한다. MAP_SHARED와.. 더보기
module_driver() 호출 시기 insmod / rmmod 시 __register 함수와 __unregister 함수를 자동으로 호출해 준다. bus에 특정한 mecro를 만들기 위해서 사용해야 하며, 단독으로 사용하면 안된다. Parameters struct device * devDevice to perform the check on module_driver(__driver, __register, __unregister, …) Helper macro for drivers that don’t do anything special in module init/exit. This eliminates a lot of boilerplate. Each module may only use this macro once, and calling it re.. 더보기
TTBR0_EL1, TTBR1_EL1, TTBR0_EL2, VTTBR_EL2, TTBR1_EL2 헷갈리는 TTBR register들의 역할을 정리해 보았다. 참조 : https://developer.arm.com/docs/100942/latest/hypervisor-software TTBR0_EL1 : EL1에서 동작. 하위 mem (0x00000000_00000000 ~ 0x0000FFFF_FFFFFFFF) user space 는 translation 되고, kernel 은 identical mapping (VA PA) TTBR1_EL1 : EL1에서 동작. 상위 mem (0xFFFF0000_00000000 ~ 0xFFFFFFFF_FFFFFFFF) user space 는 translation 되고, kernel 은 identical mapping (VA PA) TTBR0_EL2 : EL2에서 동작.. 더보기
systemd log를 dmesg와 console에 enable 하는 방법 참고 : https://www.freedesktop.org/software/systemd/man/journald.conf.html "/etc/systemd/journald.conf" 파일에 Forwardtokmsg, ForwardToConsole 를 yes로 변경. --> ForwardToSyslog=yes ForwardToKMsg=yes ForwardToConsole=yes 더보기
analyseplugin - log 분석을 위한 notepad++ 의 유용한 plugin analyseplugin 플러그인은, log와 같은 text 문서에서 내가 입력한 string들을 포함하고 있는 모든 line을 특정 color로 extrect해서 순서대로 정렬해 준다. 따라서, 의미있는 로그 문구(panic, error, abort 등)들을 미리 입력해서 xml 형태로 저장해 두면, 매우 빠르게 log file에서 해당 문구가 있는지 확인할 수 있다. 한동안 notepad++에서 잘 사용하던 analyseplugin이 notepad++ update이후 더이상 plugin list에서 보이지 않아 매우 아쉬워하고 있었는데, 여전히 sourceforge에 project가 살아있고 최근(2020.06)까지 update가 된것을 발견하였다. https://sourceforge.net/proj.. 더보기
primitive 해석 - IT 용어 IT 설명중에 primitives 가 나오는 경우가 꽤 있다. 이는 해당 기능을 구현하기 위한 근간 기술을 지칭할 때 사용한다. 예를 들면 아래와 같이 기술되었다면, 동기화를 위해서 베리어 구현과 신뢰할만한 signalling 기능을 사용했다는 의미가 된다. Synchronization primitives - barrier implementation - reliable signalling (in progress) 더보기
Microsoft Print to PDF 출력 시 가로/세로 전환하기 이미지나 문서를 PDF로 저장하기 위해서, windows에서 기본으로 제공하는 Microsoft Print to PDF는 매우 유용한 tool이다. 하지만, 원치 않게 용지 방향이 누워있는 경험을 하게 된다. 이경우 옵션 -> 프린터 속성으로 들어가면, 용지 방향 변경이 가능하다. 이제 원하는 용지 방향으로 pdf file을 생성할 수 있다. 더보기
NMI (nun-maskable interrupt) arm및 arm64에는 NMI를 지원하지 않음. GICv3 + kernel 5.x 에서 pseude-NMI를 구현하였음. 자세한 내용 -> http://jake.dothome.co.kr/ic/ 더보기
PlantUML PC 설치버전 - PlantUML QEditor https://sourceforge.net/projects/plantumlqeditor/ 드디어 plantUML의 PC설치 버전을 찾았다. web버전과 같이 text로 입력하면, 바로 UI로 update해서 보여주고, java plantUML처럼 매번 build할 필요가 없다. 최초 실행시 설정에서 다음 executable file들의 경로를 맞추어 주어야 합니다. - java - plantuml.jar - Graphviz : www2.graphviz.org/Packages/stable/windows/10/cmake/Release/x64/ Index of /Packages/stable/windows/10/cmake/Release/x64 www2.graphviz.org 저의 경우에는 GRAPHVIZ 관련 .. 더보기
Embedded system의 약어(abbreviation) 정리 IP : Intellectual Property PE : Processing Element 주로 AP(application processor)내의 core 연산 모듈을 뜻한다. 더보기
ARM core의 feature enable 여부 확인 방법 ID_AA64MMFR0_EL1, ID_AA64MMFR1_EL1 과 ID_AA64MMFR2_EL1 register값을 확인하면, 어떤 feature 들이 현재 ARM core에서 support 되는지 여부를 알 수 있다. developer.arm.com/docs/ddi0595/b/aarch64-system-registers/id_aa64mmfr2_el1 developer.arm.com/docs/ddi0595/b/aarch64-system-registers/id_aa64mmfr1_el1 예를들어 현재 사용중인 ARMv8.4-NV 기능 지원 여부를 알고 싶은데, register 값이 ID_AA64MMFR2_EL1: 0x1011 이다. 위 링크한 문서에 따르면 ARMv8.4-NV기능은 아래 bit의 값을 읽고 .. 더보기
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 할 것이다. 더보기
taskset : user process 를 특정 cpu에서 동작하도록 하기 원문 : http://coffeenix.net/board_view.php?bd_code=1702 ■ Taskset 이란? TaskSet은 프로세스가 사용할 CPU(CPU affinity) 를 보여주거나 지정해준다. ■ 사용 방법 taskset [options] [mask | list ] [pid | command [arg]...] mask는 Process가 사용할 CPU 값을 나타내며 16진수로 표현이 된다. 0x00000001 는 0번 프로세스(CPU)의 사용을 나타내며 0x00000003 는 0번과 1번 프로세스(CPU)의 사용을 나타내며 0xFFFFFFFF 는 모든 프로세스(CPU)의 사용을 나타냅니다.(0 ~ 31번..) 물론, mask를 프로세서(CPU)의 숫자로 표현할 수도 있다. mask를 .. 더보기
ARM core architecture version 확인하기 우리가 흔히 ARMv8.0, ARMv8.1 이러한 식으로 ARM architecture version을 이야기 하는데, system 상에서 이를 확인하는 방법에 대해 알아보자. MPIDR_EL1 register의 값을 통해 알 수 있는데, linux kernel 에서는 이 정보를 procfs로 읽을 수 있다. cat /proc/cpuinfo processor : 이 core의 physical number이다. system에 8개의 pCore가 있다면 0~7까지 정보가 출력된다. BogoMIPS : 생략 Features : .... 이 core에 적용된 feature들을 나열한다. CPU implementer : 생략 CPU architecutre : ARM core의 main version number .. 더보기
__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.. 더보기
Class diagram 의 Relationship 표현 (화살표) dependency Association Aggregation Composition Inheritance 더보기
Docker, Container, Kubernetes, Hypervisor(Virtual Machine) 결론 : 내가 생각하는 Docker 와 Virtual Machine(Hypervisor)의 장단점 Docker - Type2 Hypervisor - Type1 Hypervisor commit 을 사용해서 작업하던 container를 image로 만들기 더보기
[systemd-analyze] systemd debugging & analyze method http://manpages.ubuntu.com/manpages/bionic/man1/systemd-analyze.1.html Ubuntu Manpage: systemd-analyze - Analyze and debug system manager Powered by the Ubuntu Manpage Repository, file bugs in Launchpad © 2019 Canonical Ltd. Ubuntu and Canonical are registered trademarks of Canonical Ltd. manpages.ubuntu.com 어떤 daemon 이 systemd 의 초기화를 느리게 하고 있다면, 아래 command로 확인이 가능하다. systemd-analyze blame 더보기
Design Pattern - Chain of Responsibility (COR) 사용 예 : 버튼에서 F1을 누르면 help request가 계속해서 상위 UI 객체로 전달되다가, help method를 가지고 있는 최초의 UI가 처리하고, 더이상 전달하지 않음. 더보기
Design pattern - mediator 목적 : N : N 의 관계를 단순화 시킬때 사용 더보기
[arm] EL2 에서 EL1의 virtual address 보기 EL2 mode 에서 동작하는 code 에서 vbar_el1 값을 읽으면 아래와 같이 보인다. VBAR_EL1 FFFFFF8008082000 VBAR_EL2 00000000800BC800 vbar_el2 의 address 값을 d.l 로 보면, 아래와 같이 exception vector table을 볼 수 있으나, vbar_el1의 값을 따라가 보면 아무것도 볼 수 없다. 0x800BC800 _arm64_vectors_base: .global arm_vectors_minimal arm_vectors_minimal: // SPSel == 0 _arm64_fault // Synchronous EL2 _arm64_fault // IRQ EL2 _arm64_fault // FIQ EL2 _arm64_fault .. 더보기
[armv8] ESL_EL2 분석 - stage2 data abort 아래는 stage2 mmu에서 data abort가 발생했을때 확인된 ESR_EL2 를 분석한 내용이다. ESR (Hexadecimal format, 'q' or 'Q' : Terminate): 0x93830006 2 2 2 1 1 8 4 0 6 2 8 4 0 ----------------------------------------- 1001 0011 1000 0011 0000 0000 0000 0110 ----------------------------------------- ============================================================== Exception from a Data Abort from a lower exception level ========.. 더보기
linux kernel - boot args 중 boot_cpus 두개의 cpu 만 입력하면, 두개로만 부팅함. bootargs: boot_cpus=0,1 console=ram initcall_debug=0 loglevel=9 root=/dev/sda1 firmware_class.path=/lib/firmware rootwait rootfstype=ext4 init=/sbin/init reserve-sam=0xffffff81fa080000 reserve-gdc=0xffffff81fa460000 Baremetal solution DT Address (0x8a000000) with Exception Level (2) Samsung Embedded Linux for Exyno Auto 2.6.1 euto-v9 ttySAC0 euto-v9 login: root root@eut.. 더보기
arm asm - ubfs, lsl, orr, cbz, cbnz, stxr, ldxr ubfs x0, x1, #0, #8 해석 : x1 에서 0 부터 8개의 bit 를 취해서 x0 에 복사 즉, 0~7 까지의 bit 가 x0 에 복사됨 lsl w0, w1, w2 -> w0 = w1 w1=w2|w0 CBZ Rn, label CBNZ Rn, label Rn 이 0이면, label 로 jump CMP Rn, #0 BEQ label Rn 이 0이 아니면, label 로 jump CMP Rn, #0 BNE label LDXR reg, [addr] -> load from memory and exclusive monitor set E flag. STXR w0, reg, [addr] -> If excluseve monito.. 더보기
cache - clean, Invalidate, Flush Clean : Cache의 dirty data를 memory에 write. (Cache line은 dirty에서 clean으로 변경 & data는 Cache line에 존재) Invalidate : Cache line의 valid flag를 0으로 change. (Cache line을 버림) Flush : Clean + Invalidate. [출처] Clean, Invalidate, Flush of Cache|작성자 고고빨간양말 더보기
trace32 - set conditional breakpoint using arm register value UI 창에서는 입력이 어려우나 아래와 같이 command 로 입력하면 된다. Break.Set function_name /Program /CONDition Register(X0)==699 더보기