본문 바로가기

Kernel

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 더보기
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); 부팅이 일정이상 진행되면 호출할 수 없다. 더보기
[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.. 더보기
linux devicetree - interrupt 원본 : liunx Documentation/devicetree/bindings/arm/gic.txt linux document 의 설명이 애매해서 좀 더 풀어서 남긴다. ex)interrupt-controller@2c001000 {compatible = "arm,cortex-a15-gic";#interrupt-cells = ;interrupt-controller;reg = , , , ;interrupts = ;}; #이 있다고 주석이 아니다. 3 이라는 숫자는 interrupts = 에 3개의 값이 들어감을 의미한다. The 1st cell is the interrupt type; 0 for SPI interrupt.. 더보기
rootfs rootfs 란? linux kernel 을 build 할때 가장 최 상의에 위치할 filesystem 의 폴더 경로를 ramdisk로 만들고 미리 package 화 한 binary /bin/dev/etc/lib/proc/root... 더보기
Program 실행시간(performance time) 측정 방법, IO time 계산 방법 time command #time ./mobibench -p ....#0m2.15s real 0m0.40s user 0m0.31s system 결과는 다음과 같이 해석real : 실제 program 동작 시간user : user area program 동작 시간system : kernel area program 동작 시간 IO time = real - (user + system) 더보기
linux kernel 이 지원하는 system call list 보기 간혹 자신이 사용하는 linux kernel 이 어떤 system call 을 지원하는지 알고 싶을때 사용할 수 있는 방법이다.혹은 kernel code 의 특정 함수가 실제 빌드가 되어서 kernel binary 에 들어가 있는지도 알 수 있다. /proc # cat kallsyms > /data/local/tmp/kernal_symbal.log proc/kallsyms는 kernel 내부의 symbal table 을 모두 보여준다. 여기서 sys_ prefix 를 사용하는 함수들이 system call 이다. ...00000000 T sys_truncate00000000 T sys_ftruncate00000000 T sys_truncate6400000000 T sys_ftruncate640000000.. 더보기
linux kernel time resolution & hrtimer 원문 : http://makingdream.tistory.com/20 HZ 와 Jiffies시스템 타이머들은 프로그램 가능한 주파수 대역에서 프로세서에 끼어(interrupt, pop)든다. 주파수 즉, 초당 타이머 틱들의 수는 커널 변수인 HZ에 포함되어 있다. HZ값은 협상(trade-off)하여 선택된다. 핑거 타이머에서 결과값이 큰 HZ는 좀더 좋은 스케줄링 해결책이다. 그러나, HZ 값들이 커질수록 많은 부하가 발생하며 인터럽트 문맥교환 시간은 더 많은 사이클들이 소모되기 때문에 높은 파워 소비가 발생한다. HZ값은 아키텍처에 의존한다. x86 시스템들의 2.4 커널에서는, HZ 값이 기본적으로 100으로 설정된다. 2.6 커널에서는 1000으로 변경된다. 그러나, 2.6.13 커널에서는 250.. 더보기
mmap 을 이용한 process memory mapping 원문 : http://naito.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%A7%A4%ED%95%91memory-mapping 공부하면서 더 내용추가를 할 예정이다. 프로세스 메모리 매핑 대량의 데이터를 처리하는 하드웨어를 다루는 DD작성시 mmap은 필수적으로 구현해야.. app에서 dd로 hw를 제어할때 read,write,ioctl은 프로세스 메모리공간과 커널 메모리 공간사이의 메모리 전달과정이 수반되기 때문에 매우 비효율적이다. 고로 mmap을 이용해 직접 hw의 io주소 공간을 메모리 복사없이 직접적으로 사용할 수 있다. mmap함수는 메모리 주소를 이용해 파일에 접근하도록 하는 함수다. 그러나 디바이.. 더보기
linux 에서 page cache(페이지 캐쉬)란? disk I/O 의 효율을 위해 main memory 에 잡아놓은 cache buffer 의 명칭 아래와 같이 cache memory 의 상태를 알 수 있다. # free -m total used free shared buffers cachedMem: 6759 3121 3638 0 220 2008-/+ buffers/cache: 892 5867Swap: 4692 0 4692 원문 : http://wnstjqdl.tistory.com/46 시스템이 특별히 메모리 자원의 사용량이 없는데 캐쉬메모리가 많아 할당되어 여유메모리 할당이 적게 나올 경우 메모리를 초기화 하는 방법은 아래와 같다. To free pagecache(페이지캐쉬 초기화)echo 1 > /proc/sys/vm/drop_caches To fr.. 더보기
linux kernel 에서 사용 할 수 있는 file io functions 원칙적으로, linux kernel layer 에서는 file io 를 다루면 안된다. 여러 이유가 있겠지만, 일단 file descriptor list 를 각 task descriptor 에서 관리하고 있고, file을 linux kernel 단에서 접근하게 되면, 어느 process 에서 지금 kernel code 를 실행하는지 일일이 확인해야 하기 때문이다. 또한, 각 process 가 가진 access(read / write) 권한 문제도 발생하게 된다. 하지만, 이를 모두 감수하고라도, 꼭 써야만 하겠다면 다음 함수를 사용하면 된다. 여기에는 간단하게 동작하는 file operation 을 제공한다. open close size read write 더보기
사용가용한 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 .. 더보기
poll, sysfs sample code poll 사용 예제 man page 에는 poll_wait 가 대기를 시켜준다고 하는데..아무리 사용해 봐도 poll_wait 는 대기를 하지 않고 바로 return 처리된다. 이에 wait_event_interruptible 을 사용 하였다. 주문한 책이 오면 poll_wait 에 대해 좀 더 읽어 본 후 재업하도록 하겠다. DECLARE_WAIT_QUEUE_HEAD(wait_queue); unsigned int onegun_driver_poll(struct file *file, poll_table * wait){printk("%s()++\n", __func__);//poll_wait(file, &wait_queue, wait); /* normal case */if (wait_event_interrup.. 더보기
class 에 sysfs node 등록하여 사용하기 linux kernel 에서 kernel 단과 user 사이에 통신을 위한 방법중에 sysfs node 를 사용하는 방법이 있다.지원하는 함수는 아래 3가지 함수들이 있다. devclass_create_filedevice_create_file class_create_file 이중 devclass_create_file 은 삭제된 것으로 보인다.class_create_file 의 예제를 첨부한다. #include #include #include #include #include #include #include #include static dev_t first; // Global variable for the first device number static struct cdev c_dev; // Global v.. 더보기
demand paging page fault 가 발생하면 demand paging 이 일어나게 된다. 요구 페이징은 필요한 프로그램만 메모리에 적재하는 방법으로 가상 메모리 시스템에서 많이 사용된다. 요구 페이징을 사용하는 가상메모리에서는 페이지들이 실행 과정에서 실제로 필요해질 때 적재 된다.[출처] 가상 메모리 요구 페이징(Demand Paging)|작성자 SungWook Kang http://sqlmvp.kr/140191934297 더보기
리눅스커널의메모리관리 원문 : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1641 linux virtual memory 에 대한 너무 좋은 강좌 꼭 한번 읽어보시길 Step by Step 커널 프로그래밍 강좌③ 리눅스커널의메모리관리 지난 호에 우리는 커널 모듈 프로그래밍에 관한 기본적인 것들을 살펴보았다. 이번 호 에서는 지난 번 모듈 프로그래밍에 이어 커널에서 가장 흔히 사용하는 함수 중의 하나 인 kmalloc을 통해 커널에서 시스템의 메모리를 어떻게 관리하는지 알아보기로 한다. 글 _ 김민찬 KLDP 멤버, 전문 프로그래머 연재 순서 ① 커널 프로그래밍 환경 구축하기와 특징 ② 모듈 구현하기 ③ 리눅스 커널의 메모리 관리 ④ 커널.. 더보기
slab allocator 쉽게 설명하자면... task_struct 나 bio, bio_vec 같이 linux kenrel 에서 굉장히 빈번하게 사용되는 자료 구조들을 효율적으로 할당 / 해제 관리를 위한 메모리 관리 알고리즘이다. 특별한 함수가 있는것이 아니라..kcalloc, kmalloc 에서 호출해서 사용한다. SLAB Allocator - 1994년 Sun Microsystems의 Solaris 2.4 운영체제에 처음 적용된 이후 리눅스를 포함한 대부분의 UNIX 계통의 운영체제에서 사용하는 메모리 할당 정책. - 일정량의 내부 단편화 현상을 허용하는 trade off을 통해 외부 단편화 현상을 해결한 메모리 관리 기법임. - 10년이 넘도록 이러한 메모리 관리 기법을 대체할 만한 대안이 존재하지 않았음. - SLAB .. 더보기
linux kernel code 에서 system call 찾는 방법 system call 을 찾는 방법 SYSCALL_DEFINE 매크로를 통해 찾아야 한다 참고 : http://daehee87.tistory.com/253 더보기
커널 API - IOCTL 함수 작성시 자료형의 검사 원본 : http://forum.falinux.com/zbxe/index.php?document_srl=533526&mid=Kernel_API ioctl 함수를 만들때 다양한 검사를 수행할 수 있는 유용한 메크로 들이 있다.이를 소개한 글인데 내용이 너무 좋아서 링크해 본다.드라이버 작성시 file operation 에 사용되는 자료형의 형태 디바이스 드라이버를 작성하다 보면 주면 read, write, ioctl 을 통해 유저 어플리케이션과 데이타를 주고 받게 된다.이 때 데이타에 대한 유효성과 커널공간으로 사용자 영역으로부터의 데이타를 가져오는작업을 수행하게 되는데 이때 주의 해야할 점과 회피하는 방법이다. 물론 내가 드라이버를 짜고 어플리케이션을 짜면 어떤 자료형을 넘기는지 알기 때문에여러가지를 고.. 더보기
TLB (Translation Lookaside Buffer) 원문 : http://embedded21.egloos.com/viewer/757087 TLB (Translation Lookaside Buffer) 모든 virtual memory reference는 2개의 physical memory access가 필요함. 1. appropriate page table entry 2. the desired data straightforward virtual memory scheme이 memory access time을 2배로 만든다. (설명하자면, page table 에서 virtual address 에 매칭된 physical address 를 찾기위해 한번 물리메모리를 access 하고,얻어온 물리 메모리주소를 기반으로 실제 데이터를 얻어오기 위해서 한번더 acces.. 더보기
ffs, ffsl, ffsll, fls, flsl, flsll 함수 설명 NAME ffs, ffsl, ffsll, fls, flsl, flsll -- find first or last bit set in a bit string LIBRARY Standard C Library (libc, -lc) SYNOPSIS #include int ffs(int value); int ffsl(long value); int int ffsll(long long value); fls(int value); int flsl(long value); int flsll(long long value); DESCRIPTION The ffs(), ffsl() and ffsll() functions find the first bit set (beginning with the least significant bi.. 더보기
__builtin_return_address(0) 무엇일까? 연구주제 더보기
kernel log back ground 로 저장하기 cat proc/kmsg > /data/log.txt & 더보기
make mrproper 외 kernel build command Kconfig 나 defconfig 들을 수정한 이후알수없게 build error 가 계속 발생할때가 있다.이때, make mrproper 를 실행해 주면 정상적으로 build 가 된다. makefile, Kconfig, defconfig 등을 수정하고 난 이후에는꼭 make mrproper 를 실행해 주자. [ 커널 빌드 명령어의 의미 ] make mrproper- 기존에 설정되어 있던 모든 의존관계를 제거하는 역할. make menuconfig- 콘솔에서 메뉴 형식으로 커널 환경 설정 시작.- make config -> 질의 응답형식으로 물어봄. (오래걸림)- make xconfig -> GUI 환경에서 사용. make dep- 커널에 설정된 내용에 따라서 소스 코드의 파일을 확인, 필요한 링크를 생.. 더보기
local_irq_disable(), local_irq_save(flags) 분석 두 함수를 비교하고, local_irq_disable()대신 local_irq_save(flags)를 쓰는 이유를 알아보자. local_irq_disable#define local_irq_disable() \ do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0) #define raw_local_irq_disable() arch_local_irq_disable() static inline void arch_local_irq_disable(void) { unsigned long temp; asm volatile( " mrs %0, cpsr @ arch_local_irq_disable\n" // cpsr 을 읽어서 %0 에 저장 " orr %0, %.. 더보기
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.. 더보기
linux kernel - list 사용하기 1. struct list_head 를 갖는 struct 를 하나 선언한다.struct A_data {enum A_command cmd;u8 offset;u8 data;struct completion complete;bool use_completion;int *ret;struct list_head list;}; 2. list 를 선언한다. /* global value */LIST_HEAD(&A_data_list); or struct temp_struct {struct list_head B_data_list;} 3. data 를 저장한 struct 를 list 에 넣는다.struct A_data *A_cmd; A_cmd = kzalloc(sizeof(struct A_data), GFP_KERNEL);if .. 더보기
down() / down_interruptible() / down_trylock() 원문 : http://blog.daum.net/youhochul 이 글은 암흑마스크 님이 쓰신 글입니다.좋은 글이여서 자료 보존차 복사해 왔습니다. 제목과 같은 down() / down_interruptible() / down_trylock() 함수들은 세마포어를 얻는 함수들이다. 해당 함수들을 검색하여 여기까지 왔다면 아마도 세마포어(Semaphore)가 무엇인지? 또 어떠한 문제를 풀어나가기 위해 제공되는 함수들인지 모두 알고 있을 것이다. 아마도 이글을 보는 이유는 세가지 함수가 어떠한 차이점을 지니고 있는지에 대한 궁긍증을 풀기 위함이 아닐까 생각한다.위의 세 함수는 세마포어를 얻기위한 함수이다. 세마포어를 얻는다는 것은 임계영역(Critical Section)에 접근하기 위한 제어권을 부여 받는.. 더보기
linux kernel basic APIs linux kernel basic APIs 개발중 기본 api(수식이나, string control, bit 연산등)들을 찾아보기 좋은 사이트 이다. http://www.compsoc.man.ac.uk/~moz/kernelnewbies/documents/kdoc/kernel-api/linuxkernelapi.html 더보기