본문 바로가기

Linux

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 더보기
segment 와 paging 기법 x86 에서는 segment 라는 선형주소를 물리주소로 변환시켜주는 unit 을 사용합니다.하지만 이기능이 linux 와 page 와 매우 유사하여 다소 혼동되는 부분이 있습니다.이에대해 understanding the linux kernel 에서는 다음과 같이 기술하고 있습니다. x68 마이크로 프로세서는 프로그래머가 app을 서브루틴이나 전역 데이터 영역, 지역데이터 영역같은 논리적인 부분으로 쪼갤 수 있도록 segmentation 이라는 기법을 지원한다. 그러나 리눅스는 이를 매우 제한적으로 사용한다. - segmentation 과 paging 은 둘 다 프로세스의 물리 주소 공간을 나누기 위해 사용됨.- segmentation 은 각 프로세스에 다른 선형주소 공간을 할당- paging 은 같은 선.. 더보기
커널 API - IOCTL 함수 작성시 자료형의 검사 원본 : http://forum.falinux.com/zbxe/index.php?document_srl=533526&mid=Kernel_API ioctl 함수를 만들때 다양한 검사를 수행할 수 있는 유용한 메크로 들이 있다.이를 소개한 글인데 내용이 너무 좋아서 링크해 본다.드라이버 작성시 file operation 에 사용되는 자료형의 형태 디바이스 드라이버를 작성하다 보면 주면 read, write, ioctl 을 통해 유저 어플리케이션과 데이타를 주고 받게 된다.이 때 데이타에 대한 유효성과 커널공간으로 사용자 영역으로부터의 데이타를 가져오는작업을 수행하게 되는데 이때 주의 해야할 점과 회피하는 방법이다. 물론 내가 드라이버를 짜고 어플리케이션을 짜면 어떤 자료형을 넘기는지 알기 때문에여러가지를 고.. 더보기
Lock-free, cas 참조 : http://www.gamedevforever.com/83 - Lockfree algorithm Lockfree 알고리즘을 이해하기 위해서는 먼저 Atomic Operation에 대해서 알아볼 필요가 있습니다. atomic operation의 정의 1. 일련의 모든 연산이 끝날 때까지 다른 프로세스는 그 연산에 대한 어떠한 변화도 할 수 없다. 2. 전체 연산 중 어느 하나라도 실패할 경우, 모든 연산은 실패하여, 시스템은 전체 연산이 시작하기 전의 상태로 복구된다. 32비트 인텔 CPU (IA-32)에서 지원되는 Atomic Operation에 관해 알아보자. 다음과 같은 인텔의 CPU 연산들 앞에 LOCK을 붙여 해당 연산을 Atomic하게 만들 수 있다. 즉, 스레드간의 동기화를 신경쓰지 .. 더보기
linxu bash shell script 명령어 참고 사이트 : http://cybercafe.tistory.com/330http://linuxconfig.org/bash-scripting-tutorial bash : Bourne-again shell - bash 의 상태 확인# env - shell script 시작파일 첫 머리에 다음 구문 삽입#!/bin/bash - 사칙연산 : leta=10b=10 let c=a+b echo $a+$b=$c --> 출력결과 : 10+10=20 c=$a$b echo $c --> 출력결과 : 1010 a="10"b="10" let c=a+b echo $a+$b=$c --> 출력결과 : 10+10=20 c=$a$b echo $c --> 출력결과 : 1010 - 길이로 문자열 자르기 : ${var:start:length.. 더보기
linux 명령어 dd # dd if=/dev/zero of=file_name bs=1MB count=1024 무언가 설명이 복잡한데.. 결국 위명령어는/dev/zero 라는 파일에서 내용을 복사해서 file_name 이라는 파일을 만들겠다는 것입니다.아마 /dev/zero 는 이런 용도로 사용하기 위해서 만들어진'크기 무한대'의 파일이 아닐까 생각이 됩니다. dd의 입출력시에 사용되는 단위들c : Character, 1bytew : Word, 2bytesk : Kilo Bytes, 1024bytesb : Block, 512bytes 주요옵션bs=BYTES : 한번에 BYTES씩 읽어들이고 출력. ibs와 obs를 한번에 지정한 것과 같음cbs=BYTES : 한번에 BYTES씩 변환작업을 함conv=CONVS : ,로 분리된 .. 더보기
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, %.. 더보기
CPSR 원문 : http://forum.falinux.com/zbxe/index.php?document_srl=575677&mid=lecture_tiparm register 그림 : http://recipes.egloos.com/4986854 오늘은 ARM register 중 하나인 cpsr 에 대해서 좋은 글이 있어서, 필요한 내용을 복사해 왔습니다.이것 외에도 ARM 에 대해서 좋은 강좌가 많은 블로그 이니, 한번씩 들려보세요. CPSR (Current Program Status Register) 프로그램의 상태를 저장하는 레지스터 31비트에서 24까지는 플래그(Flag) 비트, 23비트에서 16까지는 상태(Status) 비트, 15비트에서 8까지는 확장(Extension)비트, 7비트에서 0 비트까지는 제.. 더보기
arm 에서의 linux process 와 thread 1) linux 에서 process 와 thread 의 차이점은?2) interrupt handler 의 pid 는?3) system call 이 호출되었을때의 pid 는? 이러한 것들을 해결해 본다. 1. kernel 에서의 pid 알기pid = task_pid_nr(current); current->pid 이글은 계속해서 업데이트 됩니다. 더보기
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 더보기
gpio_request 의 정확한 사용상의 의미 보통 linux kernel driver coding 시에 습관적으로 사용하는 gpio_request 함수에 대해 알아보자.결론부터 이야기 하자면 별 기능을 하지 않는 함수 이다. - 기능 : 특정 GPIO 핀이 현재 다른 설정으로 사용되어 있는 지에 대한 여부를 판단하여 그 결과를 return 함- 반환값 : 이미 어디선가 설정한 핀이면 -EBUSY 를 리턴 어디에서도 설정한 흔적이 없으면 0 을 리턴 즉, 어떤 gpio pin 을 사용하고 싶은데, 다른 driver 와 중복해서 사용하는 위험을 피하고자 할때 사용.특별한 기능은 없다. 더보기
kernel 에서 call stack(call tree) 출력하기. 어떤 함수의 call stack 이 궁금하다면 다음 방법으로 간단히 확인할 수 있다. kernel build 가 가능하고gdb 를 사용하는 것보다 build & download 가 편할때 사용할 수 있는 방법임. #include int poo(){....dump_stack();....} 을 호출해주면 log 로 call stack 이 출력된다. 더보기
kconfig 에서 default 옵션에 대한 오류 kernel document 보면 The default value is only assigned to the config symbol if no other value was set by the user (via the input prompt above). If an input prompt is visible the default value is presented to the user and can be overridden by him. 이렇게 설명되어 있다. 이것을 보면 make menuconfig 로 굳이 하지 않고, defconfig 에 명시적으로 입력하면 적용되어야 할 것처럼 보인다. ex) config AAA bool default n help aaa .. 더보기
kernel list 항목 삭제 항목을 삭제할때 얻는 item(객체) 은 list_for_each_entry 가 아닌 list_for_each_entry_safe 로 얻은 item 이어야 한다. *자세한 설명은 kernel document 참고 ex) #include struct packet { u8data_1; u8data_2; struct list_head p_packet_list; }; LIST_HEAD(g_packet_list); void func() { struct packet* p_pkt, *scratch; ... list_for_each_entry_safe(p_pkt, scratch, &g_packet_list, p_packet_list) { list_del(&p_pkt->p_packet_list); kfree(p_pkt).. 더보기
work queue 함수들의 특성 정리 create_singlethread_workqueue - 이 workqueue 에 넣은 work 함수는 중복 실행되지 않는다. 즉, callback 함수가 수행되고 있는 동안에는 해당 callback 함수가 중복 실행되지 않는다. -- 계속 -- 더보기
gpio 와 sysfs node 의 정보가 일치하지 않는 문제 gpio를 특정값으로 셋팅하였는데 /sys/class/gpio/gpio[num]/... 에는 반영이 되어 있지 않은 경우가 있다. samsung LSI gpio driver 의 경우 s3c_gpio_cfgpin 나 s3c_gpio_setpull 와 같이 arch\arm\plat-samsung\gpio-config.c 에서 제공하는 gpio control 함수들은 shadow buffer 를 사용하지 않는다. 따라서 shadow buffer 의 값을 기반으로 정보를 주는 sysfs node 에는 gpio-config.c 에서 제공하는 함수를 사용해서 적용한 내용은 반영되지 않는다. 해당 문제를 해결하기 위해서는 drivers\gpio\gpiolib.c 에서 제공하는 함수들을 사용해서 gpio config .. 더보기
I2C check 함수 i2c adapter 가 smbus 를 지원하는지 check 함. if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) return -EIO; 더보기
이름이 위배되는 사용자 계정 만들기 - ubuntu sudo adduser --force-badname youngil.won Sudo 권한 추가 : /etc/sudoers 파일 맨 밑줄에 신규 계정 추가. %admin ALL=(ALL) ALL %youngil.won ALL=(ALL) ALL 더보기
singlethread_workqueue 사용 아래와 같이 함수 구정을 하면 됩니다. 간단한 함수들이므로 설명은 생략 합니다. struct work_struct my_int_work; struct workqueue_struct *my_wq = NULL; void test-device_int_irq_handler_sched(void) { queue_work(my_wq, &my_int_work); } void my_interrupt_event_work(struct work_struct *p) { printk(KERN_ERR "my_interrupt_event_work() is called\n"); ... // 실제 work } static int my_device_probe(struct i2c_client *client, const struct i2c_.. 더보기
linux coding tip / guide 1. 상태 변수는 atomic 함수를 사용하라. atomic_set(&hdmi_status, HDMI_ON); if (atomic_read(&hdmi_status)) { ... } 2. work 가 중복 실행되기를 원하지 않는다면 schedule_work 를 호출하기 전에 pending 검사를 하라. if (!work_pending(p_work)) { schedule_work(p_work); } 3. gpio_request 를 호출하였으면 gpio_free를 호출하라. 내부적으로 chip->state[chip_index].refcount 를 가지고 있어서 request 때 +1, free 때 -1 을 호출하며 관리합니다. 지금 내부 소스를 보면 크게 동작에 영향을 주진 않지만 해당 카운트를 관리하는 목적.. 더보기
per-CPU 변수 (dual-core) 원문 : http://nix102guri.blog.me/90098904482 리눅스 2.6에 오면서 생긴 기능 중에 하나가 CPU별 변수 선언(per-CPU variable)이다. CPU별 변수는 여러가지 면에서 상당히 좋은 기능을 제공한다. 우선, SMP 환경에서 자기 CPU에 해당하는 변수만 접근하게 된다면 동기화에 대해서 고려해야 되는 부분이 줄어들게 된다. 따라서, 전체적인 성능을 높일 수 있게 된다. 각각이 자신의 Processor와 연관된 변수만 사용한다면 캐쉬 효율성이 좋아지게 될 것이다. 이러저러한 이유로 되도록이면 CPU별 변수를 사용하는 것이 좋다. CPU별 변수를 작성하고 사용하는 방법은 두가지가 있다. 컴파일시에 생성되도록 하는 방법과 런타임시에 생성하는 방법이 있다. CPU별 변수.. 더보기