본문 바로가기

Programming/Linux_Kernel

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.. 더보기
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 더보기
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.. 더보기
linux shell 의 sysfs에서 device-tree 뽑아내는 방법 dtc 라는 tool 을 사용하면 된다. dtc -I fs -O dts -o output.dts /proc/device-tree 더보기
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.. 더보기
Linux storage stack diagram https://www.thomas-krenn.com/de/wikiDE/images/2/2d/Linux-storage-stack-diagram_v4.0.pdf 더보기
dtb(device tree blob) file parser(command) on linux fdtdump dtb_file.dtb > /tmp/test.txt 더보기
rootfs rootfs 란? linux kernel 을 build 할때 가장 최 상의에 위치할 filesystem 의 폴더 경로를 ramdisk로 만들고 미리 package 화 한 binary /bin/dev/etc/lib/proc/root... 더보기
filesystem 잡다한 내용 filesystem 의 파일 삭제 순서1. unlink 호출2. ext4 -> mata data 삭제 (~10초)3. ext4 -> raw data 삭제(TRIM) (~20초) : 삼성외에는 이것을 하지 않는다.4. batched discard : 구글이 만든 기능으로 하루에 한번정도 mata data 만 삭제되고 raw data 가 남아있는 데이터를 찾아서 삭제해줌. 즉, 3번이 수행되지 않은 부분에 수행해줌. securediscard 는 실제로는 잘 쓰지 않고 FTL 에서도 잘 보장되지 않는다. ext4 metadata 종류- bitmap- inode- directory entry : 파일 raw 데이터의 일종이나 내부적으로 해당 디렉토리에 어떤 파일(inode)들이 있는지 기재되어 있다. files.. 더보기
batched discard - ext4 https://lwn.net/Articles/383933/ -> 위 article 에 대한 요약trim 은 나쁜 성능을 가지고 있고, 그것의 대안은 매 ioctl 마다 freed block 을 discard 하지 않는 것이다. 그것을 위해 batched discard 를 만들었다.성능을 위해 minimum free extent length 를 설정했고, ioctl 은 작은 extents 까지 처리하지 않을 것이다.이 방식은 성능을 위해서 freed block 을 track 하는 bitmap 을 저장하고, 한꺼번에 trim 하는 것이다.이것을 구현하기 위해 나는 새로운 bitmap, bb_bitmap_deleted, 을 ext4_group_info 안에 추가 했다.하나의 문제가 있다. bb_bitmap_d.. 더보기
Direct IO 를 위한 aligned buffer 얻기 출처 : http://altistory.net/333 view plaincopy to clipboardprint?/* default.c */ #define _GNU_SOURCE // O_DIRECT #define IOUNIT 128*1024 #include #include #include #include int main() { char *nBuf; // not aligned buffer char *aBuf; // aligned buffer int fd; // file descriptor // 1MB buffer (not aligned yet) nBuf = (char*) malloc(IOUNIT+getpagesize()); // aligned buffer 'aBuf' aBuf = (char*)((unsig.. 더보기
use fallocate in Android system Android 4.4 기준으로 /system/lib/libc.so에는 fallocate funcation 을 지원하지 않는다. 여타 다른 gcc build 환경을 사용했을때는 모르지만,(arm-2009q1 build 환경을 사용한 app 은 fallocate 함수를 사용하는데 문제가 없었다.)Android 자체 build system 을 사용할때는 fallocate 함수를 사용할 수 없다. 이 문제를 해결하기 위해/proc/kallsyms 를 확인한 결과kernel 은 sys_fallocate 를 지원하는 것으로 보인다. 따라서 아래와 같이 direct 로 system call 을 호출하였다. #define FALLOC_FL_KEEP_SIZE 0x01return syscall(__NR_fallocate,.. 더보기
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.. 더보기
vmalloc 대신에 kalloc 을 주로 사용하는 이유는? 많은 이유가 있지만, 주 이유는 성능 때문이라고 한다.아래 글을 참고해보자. 원문 : http://stackoverflow.com/questions/116343/what-is-the-difference-between-vmalloc-and-kmalloc Linux Kernel Development by Robert Love (Chapter 12, page 244 in 3rd edition) answers this very clearly.Yes, physically contiguous memory is not required in many of the cases. Main reason for kmalloc being used more than vmalloc in kernel is performance. Th.. 더보기
vmalloc 할당의 최대 크기는? 알다시피 kmalloc 의 경우 할당 메모리 크기에 제한이 있다.- kernel 2.4 이하 : 32*PAGE_SIZE(4KB) - kernel 2.4 이상 : 128*PAGE_SIZE(4KB) vmalloc 일경우는 어떨까? 기본적으로 vmalloc 도 kmalloc 을 내부적으로 사용하기 때문에 ZONE_NORMAL 영역에서 할당받는다.따라서 32 bit 의 original config 의 경우에 대략 880MB 정도가 최대 할당 크기 이다. 아래 글을 읽어보자. 원문 : http://egloos.zum.com/embedded21/v/530514 Linux에서 kernel 영역에서의 동적 memory allocation인 kmalloc과 vmalloc에 대해서 알아보도록 하자. Kernel은 phys.. 더보기
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.. 더보기
sleep and delay in linux kernel 무엇보다 kernel document 를 추천한다.https://www.kernel.org/doc/Documentation/timers/timers-howto.txt 아래 한글 번역본이 있다.http://blog.dasomoli.org/498 출처 : http://poplinux.tistory.com/122 가장 기본이 되는 지연 함수는 schedule_timeout() 입니다. 관계를 살펴보면 ssleep() ----------------------------------------- msleep() ----------------------------------------- schedule_timeout_interruptible(), schedule_timeout_uninterruptible ------.. 더보기
uevent 사용하기 1. netlink 사용- raw socket : IP 스택 바로위에서 L4 (TCP/UDP) 헤더 지원 없이 프로토콜을 보내거나 받는것으로 거의 network layer 에서 상위 레이어의 패킷을 컨트롤 하기 위함- netlink socket : kernel 과 kernel 혹은 user space 통신에 사용됨. 데이터를 보내는데는 사용되지 않음- uevent 를 listen 하기 위해서는 protocol 인자에 NETLINK_KOBJECT_UEVENT 사용 #include sockfd = socket(int socket_family, int socket_type, int protocol); int Ne.. 더보기
virtual address to physical address (64bit linux) linux 64bit 에서 page address 변환에 대해서 한눈에 보기 쉽게 그려보았습니다. 사용할때는 꼭 출처를 명시해 주기 바랍니다. pde64_table = (pde64_t *)__va(BASE_TO_PAGE_ADDR(pdpe64_table->pd_base_addr) + (PDE64_INDEX(fault_addr)*sizeof(pde64_t))); if(!pde64_table->present) { uintptr_t tmp_pte64_table; tmp_pte64_table = (uintptr_t)petmem_smart_alloc_pages(map, (uintptr_t)NULL, (pte64_t *)NULL); memset((void *)__va(tmp_pte64_table), 0, PAGE_S.. 더보기
File System의 개요 원문 : http://cafe.naver.com/ghson/164 파일시스템을 이해하는데 기초 자료로서 너무나 설명이 잘 되어 있다.자료 보존 차원에서 옮겨 왔다. 파일시스템은 '6.device file의 개요'에서 설명한 바와 같이 섹터로 나누어진 물리적인 디스크를 운영체제가 사용하기 좋게 블럭단위로 나누어 각 블럭에 주소를 부여함으로써 운영체제가 디스크를 관리할 수 있게끔 디스크에 지도를 그리는 작업이라 할 수 있다. 1. 파일시스템의 구조 파일시스템은 루트디스크를 시작으로 디렉토리 트리나 계층구조로 이루어지며, 각 파일시스템은 물리적으로 같은 디스크에 존재할 수도 있고 다른 디스크에 따로 존재할 수 있다. 또한 각 파일시스템안에는 크게 User Data와 Meta Data로 구분되는 구조로 관리되며.. 더보기
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 더보기
linux user semaphore linux 의 user area 에서 사용하는 semaphore 에 대한 글 원문 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/system_programing/IPC/semaphores원문2 : http://www.hanbit.co.kr/network/view.html?bi_id=1399 목차 1 세마포어란 무엇인가1.1 세마포어의 작동원리2 System V 세마포어2.1 세마포어의 사용2.2 세마포어의 관리2.3 semget 을 이용해서 세마포어를 만들자.2.4 세마포어를 이용해서 접근제어 하기2.5 세마포어 조작2.6 예제3 POSIX 세마포어3.1 세마포어 만들기3.2 세마포어 얻기 (기다리기)3.3 세마포어 정보 가져오기3.4 세마포어 되돌려.. 더보기
사용가용한 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.. 더보기