본문 바로가기

Programming/Linux_Kernel

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 더보기
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 을 통해 유저 어플리케이션과 데이타를 주고 받게 된다.이 때 데이타에 대한 유효성과 커널공간으로 사용자 영역으로부터의 데이타를 가져오는작업을 수행하게 되는데 이때 주의 해야할 점과 회피하는 방법이다. 물론 내가 드라이버를 짜고 어플리케이션을 짜면 어떤 자료형을 넘기는지 알기 때문에여러가지를 고.. 더보기
x86 inline assembly http://www.hep.wisc.edu/~pinghc/x86AssmTutorial.htm http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html int a=10, b; asm ("movl %1, %%eax; movl %%eax, %0;" :"=r"(b) /* output */ :"r"(a) /* input */ :"%eax" /* clobbered register */ ); Here what we did is we made the value of ’b’ equal to that of ’a’ using assembly instructions. Some points of interest are:"b" is the output operand, re.. 더보기
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 & 더보기
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 더보기
Android Terminal Emulator 을 이용한 linux kernel debugging 기법 오늘은 Android Terminal Emulator App 을 소개하고자 한다. linux kernel 개발을 할때 간혹 디버깅 용도로 sysfs 를 쓰는 경우가 있다. usb 도 연결 안되서 adb shell 도 못쓰고,무언가 kernel 과 간접적으로 read / write 를 할때 이러한 방법을 사용하고 하는데,이때마다 App 을 만들어서 경로와 write data 를 변경하는 것은 매우 번거로운 짓이다. 이때 해당 App 을 이용해서, 화면에서 직접 terminal 을 접근해서 재어 할 수 있다. 단, control 하려는 sysfs node 는 미리 chmod 로 권한을 풀어두는 것이 좋을 것이다. App 은 일단 link 한다. http://www.appsapk.com/android-term.. 더보기
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; 더보기