본문 바로가기

Programming/Linux_Kernel

checkpatch.pl 과 Lindent 사용법 기본적으로 kernel/script/checkpatch.pl --file filename.c 를 하시면 linux coding style 과 다른 부분을 모두 check 해 주는 것은 이미 많은 분들이 알고 계실 겁니다. 하지만 이를 수작업으로 모두 수정하는 것도 많은 시간이 소요됩니다. 이때는 Lindent 를 사용하시면 적어도 "들여쓰기"에 대한 부분은 자동으로 수정이 됩니다. 사용법은 다음과 같습니다. ./scripts/Lindent filename.c 해당 스크립트를 사용하시려면 synaptic package manager 에서 indent 를 설치 하시면 됩니다. 더보기
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 을 호출하며 관리합니다. 지금 내부 소스를 보면 크게 동작에 영향을 주진 않지만 해당 카운트를 관리하는 목적.. 더보기
platform_get_irq 로 irq number 받아서 사용하기. 함수에서 다음과 같이 irq num 를 받아올 경우가 있다. static int __init my_probe(struct platform_device *pdev) { ... irq_num = platform_get_irq(pdev, 0); } 이때 얻어지는 데이터는 아래와 같이 등록되어 있는 platform_device 의 리소스 입니다. platform_get_irq 함수는 해당 리소스에 접근한 후flag 값이 IORESOURCE_IRQ 임을 보고 0 번째 배열의 irq 를 리턴하게 됩니다. /* HPD */ static struct resource s5p_hpd_resources[] = { [0] = { .start = IRQ_TVOUT_HPD, .end = IRQ_TVOUT_HPD, .flags =.. 더보기
per-CPU 변수 (dual-core) 원문 : http://nix102guri.blog.me/90098904482 리눅스 2.6에 오면서 생긴 기능 중에 하나가 CPU별 변수 선언(per-CPU variable)이다. CPU별 변수는 여러가지 면에서 상당히 좋은 기능을 제공한다. 우선, SMP 환경에서 자기 CPU에 해당하는 변수만 접근하게 된다면 동기화에 대해서 고려해야 되는 부분이 줄어들게 된다. 따라서, 전체적인 성능을 높일 수 있게 된다. 각각이 자신의 Processor와 연관된 변수만 사용한다면 캐쉬 효율성이 좋아지게 될 것이다. 이러저러한 이유로 되도록이면 CPU별 변수를 사용하는 것이 좋다. CPU별 변수를 작성하고 사용하는 방법은 두가지가 있다. 컴파일시에 생성되도록 하는 방법과 런타임시에 생성하는 방법이 있다. CPU별 변수.. 더보기
linux kernel document - phonet kernel/Documentation/networking/phonet.txt 의역. Linux Phonet protocol family ============================ Introduction ------------ Phonet is a packet protocol used by Nokia cellular modems for both IPC and RPC. With the Linux Phonet socket family, Linux host processes can receive and send messages from/to the modem, or any other external device attached to the modem. The modem takes care of rout.. 더보기
TASK_KILLABLE : 리눅스에 도입된 새로운 프로세스 상태 원문 : http://www.ibm.com/developerworks/kr/library/l-task-killable/index.html TASK_KILLABLE: 리눅스에 도입된 새로운 프로세스 상태 새로운 잠들기 상태는 치명적인 시그널에 반응하도록 TASK_UNINTERRUPTIBLE을 반영한다 Avinesh Kumar, 시스템 소프트웨어 엔지니어, IBM Avinesh Kumar는 인도 푸네에 소재한 IBM 소프트웨어 연구소의 앤드류 파일 시스템 팀에서 시스템 소프트웨어 엔지니어로 일한다. Kumar는 리눅스, AIX, 솔라리스 플랫폼에서 일어나는 버그 보고뿐만 아니라 커널과 사용자 응용 프로그램과 관련한 덤프와 비정상 종료 디버깅 작업을 맡고 있다. Kumar는 푸네 대학교 컴퓨터 공학과에서 MC.. 더보기
select 함수에 대한 친절한 설명 http://blog.naver.com/ehdus85?Redirect=Log&logNo=130098898750 파일 디스크립터를 리턴 받았다는 것은 입/출력 버퍼가 생겼다는 의미 파일 디스크립터의 변화는 입/출력 버퍼의 변화가 있는 것 입/출력 버퍼의 변화 : 입/출력 버퍼의 여유가 있는가? select 함수는 파일 디스크립터의 변화가 없으면 리턴하지 않는다 : 대기상태(블로킹)에 빠질수 있다. 타임 아웃 설정 : 대기 상태에 빠지지 않도록 원하는 시간이 되면 알아서 리턴하도록 설정 검사 범위 설정 : select 함수가 보다 쉽게 검사하도록 디스크립터 설정 자료형 변수 : 비트단위 구분을 통해서 구분 readset : 변수 선언 FD_ZERO : 전달받은 변수에 대한 인자를 0으로 초기화 FD_SET .. 더보기
kernel 동작을 trigger 시킨 process name과 pid 얻기 system call 이나 sysfs 등을 통해서 kernel 을 동작시킨 process 주체의 name 과 pid 를 kernel 단에서 얻을 수 있습니다. process 명칭 문자열 : current->comm pid : task_pid_nr(current) 더보기
What is mean? __init_refok, __initdata_refok, __exit_refok /* modpost check for section mismatches during the kernel build. * A section mismatch happens when there are references from a * code or data section to an init section (both code or data). * The init sections are (for most archs) discarded by the kernel * when early init has completed so all such references are potential bugs. * For exit sections the same issue exists. * The following markers a.. 더보기
[U-BOOT] U-BOOT 환경변수 설정을 위한 setenv, printenv 및 fw_setenv, fw_printenv U-BOOT(the Universal Boot Loader, http://www.denx.de/wiki/U-Boot)의 경우 Kernel 및 User Application에서 상호 참조를 위한 공통의 데이터를 Flash Device에 저장하는 도구를 지원합니다. 이는 부트로더와 Kernel, Application이 상호 참조하여 동작하는 루틴이 필요할 경우 사용가능하며, 종류는 아래와 같습니다. 부트로더 자체에서 사용되는 커맨드인 setenv, saveenv, prientenv와 Tool로 사용할 수 있는 fw_printenv, fw_setenv가 바로 그것이며 오늘은 이들 중 fw_setenv, fw_printenv의 사용법을 알아보겠습니다. 해당 소스는 U-BOOT소스트리 내의 tool/env 디렉토.. 더보기
virtual file system diagram 안녕하세요. 오늘은 말도많고 복잡하기로도 유명한 linux 의 virtual file system 을 보겠습니다. virtual 은 각 file system layer 에의 상위에 위치하며 공통의 interface 를 user 단에 재공하여, user 단에서 사용하고 있는 file system 에 상관없이 구현을 하도록 돕는 역할을 하고 있습니다. =========================================================== ------------------------------- virtual file system ------------------------------- file system (UBI, ext4, nf.. 더보기
mknod 의 의미 원문 : http://blog.naver.com/venezia99?Redirect=Log&logNo=30010552572 이 명령어는 insmod에서 등록한 디바이스 드라이버는 커널에 등록하는 명령어입니다. 일단 응용 프로그램은 이러한 드라이버를 인식할 수 없습니다. 응용 프로그램은 파일이라는 개념으로 접근하기 때문에 응용 프로그램이 인식할 수 있는 장치 파일로 만들어 주어야 됩니다. 본 명령어가 장치 파일로 만들어 주는 명령어 입니다. 글쓴이 : 박철 (2003년 01월 12일 오후 02:49) 읽은수: 8,084 [ 임베디드강좌/박철 ] 지금까지 진행해온 과정은 insmod를 하였을 때 수행되는 과정까지를 정리하였다. 디바이스 드라이버는 결국 사용자에게는 파일로 인식되어야 한다. 이를 위한 전단계 과.. 더보기
Serial(uart) port 를 통한 consol 출력에 대해서.. linux 를 다루다 보면 의외로 간단한 부분이지만 linux 가 자체 지원해 주어서 잘 모르는 부분이 있습니다. 그중에 하나가 serial port 에 관련된 부분인데요. 내용을 간단하게 다뤄 봅시다. 우선 사용되는 node 는 다음 위치에 있습니다. /dev/ttySAC0 .. 1 .. 2 .. 3 어느 port 를 사용할 것인지는 kernel 에 boot param 으로 넘기게 되어 있지요. console=console=ttySAC2,115200n8 요렇게 셋팅해주면 kernel 에서 ttySAC2 node 를 mknod 해 주어서 자동으로 consol 에 물려줍니다. 실제로 다음과 같이 입력해 보면 동일한 메세지가 consol 에 출력되는것을 보실 수 있습니다. # echo "test messag.. 더보기
GPIO control 을 user 에 넘기는 세련된 방법 아주 특별한 경우에 있어서 gpio control 을 user application 에 넘기는 경우가 있습니다. 저는 sysfs 를 사용할까 했었는데 더 세련된 방법이 있더군요. gpio_request(gpio, "Test_Pin"); gpio_cfgpin(gpio, GPIO_OUTPUT); gpio_direction_output(gpio, 1); gpio_export(gpio, 1); 바로 gpio_export() 라는 함수입니다. 이 함수를 사용하면 /sys/class/gpio/ 위치에 해당 포트에 대한 pin node 가 생성되어서 user 단에서 r/w 가 가능해 집니다. 다만 유의할 점은 gpio_free() 함수를 호출하면 export 된 정보가 사라진 다는 점입니다. 따라서 gpio_free.. 더보기
linux file system 용어 - UBI 얼마전부터 UBI와 UBIFS 를 분석중에 있습니다. 주로 영문 Document 들을 번역하면서 분석중인데요. 제가 file system 을 체계적으로 공부한적도 없고 해서, 용어들이 매우 헷갈리는군요. 다른 입문자 분들을 위해 간단한 용어의 뜻을 정리해 봅니다. 혹시 잘못된 내용이 있으면 댓글 부탁드립니다. - Flash Tree : data 를 저장하는 tree 구조 - TNC : Tree Node Cache - GC : Garbage collection – 무효한 데이터들을 모아서 erase 함으로서 용량을 확보하는 것 - Wear leveling : flash 의 특성상 erase 반복 횟수가 있으므로 이를 flash memory 의 전 block 에 걸쳐 가급적 균등하게 하려는 알고리즘 - LV.. 더보기
boot param의 해석 - __early_param, __sertup mecro 분석 kernel 은 bootloader 부터 각 세부사항들을 parameter 로 전달 받게 됩니다. U-boot 를 쓰신다면 bootloader command mode 에서 printenv 로 출력해 볼 수 있지요. 보통 다음과 같은 형태 입니다. # printenv bootcmd=if mmc rescan 1; then if run loaduimage; then run sdboot; else run ubifsboot; fi; else run ubifsboot; fi bootdelay=0 baudrate=115200 ethaddr=8e:28:0f:fa:3c:39 ipaddr=192.168.129.3 serverip=192.168.129.1 gatewayip=192.168.129.1 netmask=255.25.. 더보기
memory mapping 전에 serial print 사용하기 기본적으로 printk 는 buffer 를 사용하기 때문에 memory mapping 이 되기 전에는 puts 정도밖에 사용할 수 없습니다. 따라서 debugging 을 할때 변수값등을 볼 수 없어서 어려움이 있는데요. 2.6.33 kernel 이후 부터는 다음 함수를 사용하면 됩니다. asmlinkage void early_printk(const char *fmt, ...); 더보기
kernel 초기화시 지켜야 할 Ram memory size align 단위 kernel 2.6.32 kernel 초기화시 각 영역별로 ram memory 를 잡게 됩니다. 이러한 메모리들은 bank 에 저장되어서 start_kernel 에서 bootmem_init 을 호출하여 초기화 하게 되지요. 조금 더 정확하게 적자면 다음과 같이 boot param 을 bootloader에서 kernel로 전달되게 되면 "meminfo=mem=80M mem=253M@0x40000000 mem=128M@0x50000000" parse_cmdline 에서 early_mem 함수를 호출하여서 해당 구문을 해석하고 arm_add_memory 를 호출합니다. arm_add_memory 는 bank 구조체에 해당 정보를 채우게 되지요. meminfo = ( nr_banks = 0x3, bank = (.. 더보기
register_mtd_user() - partition에 융통성 있는 driver 구현하기 안녕하세요. linux device 를 작성하면서 간혹 특정 mtd partition 에 의존하는 코드를 구현할 필요가 있습니다. 이때 해당 partition num 를 hard coding 한다면, partition table 이 변경될때마다 쫒아다니면서 일일이 수정해야 겠지요. 하지만 지금 소개시켜 드리는 함수를 잘 이용하시면, 시스템 초기화시는 물론 시스템 운용중에 변경되는 partition 에 대해서도 유동적으로 대처할 수 있는 융통성 있는 device 를 구현할 수 있습니다. 일단 man page 정보를 먼저 봅시다. NAMEregister_mtd_user - register a 'user' of MTD devices. SYNOPSIS"SYNOPSIS" void register_mtd_user .. 더보기
kernel 에서 user process 실행하기 call_usermodehelper 라는 함수를 사용하면 됩니다. envp 의 0에 실행파일의 path 가 들어가는것을 눈여겨 보시기 바랍니다. #define NAND_DUMP_MAKE_FILE_APPL_PATH "/bin/nand_log_dump_file" #define DEFAULT_LOG_FILE_SAVE_PATH "--to=/mnt/ums/.tmp/debug/" char *argv[] = {NAND_DUMP_MAKE_FILE_APPL_PATH, DEFAULT_LOG_FILE_SAVE_PATH, NULL}; char *envp[] = { "HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL }; rst = call_usermodehelper(argv[0], ar.. 더보기
make menuconfig 화면에서 앞에 문자 삭제 키 make menuconfig 화면에서 간혹 문자를 입력하는 경우가 있습니다. 이때 back space 를 누르면 엉뚱한 동작을 하게 되는데요. 이 화면에서 앞 글자를 삭제하려면 Ctrl + Back Space 를 누르면 됩니다. 더보기
git 에서 수정사항에 대한 patch file 만들기 git 에서 아래와 같은 수정사항이 있을때 system.h universal.h 의 수정사항만을 patch 파일로 만든다고 한다면, linux-2.6.32]$ git status # On branch master # Changed but not updated: # (use "git add ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working directory) # # modified: C110_Attach.cmm # modified: arch/arm/kernel/traps.c # modified: arch/arm/mach-s5pv210/include/mach/system.h # mod.. 더보기
MTD 이해하기 원문 : http://dooeui.blogspot.com/2009/01/mtd.html MTD는 memory technology device의 약자로, char. device, block device와 같은 별도의 디바이스그룹이라고 간주하는것이 맞을 것 같다. 전통적으로 OS에서 장치를 char. device 와 block device 로 나누어왔기 때문에 flash memory용 디바이스 드라이버를 둘 중 어떤 것으로 분류 시켜야 하는지 고민이 생기게 된다, MTD는 분명 hdd를 대체하는 장치로 사용되고 있지만, 그 동작 특성이 block device와는 현저히 다르기 때문에 굳이 이를 block device 로 부르는 것은 옳지 않으므로 그냥 MTD 라고 부르는 것이 맞을 것 같다. MTD가 선보이.. 더보기
linux kernel 2.6.32 - 2.6.35 change list Linux 2 6 33 Linux 2.6.33 has been released on February 24th, 2010. Summary: This version features Nouveau (a reverse-engineered driver for Nvidia graphic cards), Nintendo Wii and Gamecube support, DRBD (Distributed Replicated Block Device), a security extension for TCP called "cookie transactions", a syscall for batching recvmsg() calls, several new perf subcommands (perf probe, perf bench, per.. 더보기
Kprobe 를 이용한 kernel debugging 2.6.31 kernel 부터 Kpref 와 Kprobe 가 지속적으로 발전하고 있다. 아직 ARM side 에서 활용할 수 있을지는 미지수지만, 향후 진행 방향이 주목된다. 이참에 Kprobe 에 대해 문서 IBM에서 제공한 하나를 소개해본다. http://www.ibm.com/developerworks/kr/library/l-kprobes.html 차후에 Kpref 에 대해 기술해 보겠다. 더보기
linux kernel 2.6.30, 31, 32 change list Linux 2 6 30 Linux 2.6.30 was released on the 9th of June, 2009. Summary: This version adds the log-structured NILFS2 filesystem, a filesystem for object-based storage devices, a caching layer for local caching of NFS data, the RDS protocol which delivers high-performance reliable connections between the servers of a cluster, a distributed networking filesystem (POHMELFS), automatic flushing of .. 더보기
Ram Memory 설정하기 안녕하세요. 오늘은 linux kernel 에서 ram 사용 setting 에 대해 아주 조금만 적어보겠습니다. 커널이 부팅할때 boot param 으로 셋팅이 넘어가게 되는데요. 이 영역은 vmlinux.lds 라는 파일에 다음과 같이 기술되어 있습니다. linux-2.6.29.4/arch/arm/kernel/vmlinux.lds ... *(.init.setup) __setup_end = .; __early_begin = .; *(.early_param.init) __early_end = .; ... setup.c 에 보면 __early_param("mem=", early_mem); 이라는 메크로가 나오는데요. 이를 해석하면 다음과 같습니다. #define __early_param(name,fn) \ .. 더보기
work queue & kworker 원문 : http://blog.naver.com/luis8282?Redirect=Log&logNo=20087602680 void flush_scheduled_word() 함수에 대해서 찾다가 발견한 문서인데, work queue 에 대해서 개념 설명이 잘 되어있다. 태스크 큐와 워크 큐의 필요성 특정 I/O에 대한 지속적인 감시가 필요한 경우 디바이스 드라이버의 주기적인 I/O 감시 방법 타이머 인터럽트 이용 => 시스템에서 사용하지 않는 여분의 타이머 인터럽트 필요. 시스템이 폭주할 수 있다. 커널 타이머 이용 => 정확한 주기로 동작, 1/HZ 이하의 주기에 서는 사용 불가능. 인터럽트 한계는 그대로 남아 있다. 태스크 큐와 워크 큐 이용 => 동작 시점 예측 힘듬, 커널 타이머보다 자주 혹은 빠르게.. 더보기
wait queue 오늘은 wait queue 에 대해서 짚어보려고 합니다. 별 생각 없이 사용하곤 했지만, 정확히 개념을 알고 있는것이 중요하다고 생각되네요. - wait queue 의 개념. 간단하게 말해서 wait queue 는 프로세스들을 관리하는 집단이라고 생각하면 된다. 프로세스는 어떤 사건이 일어나기를 기다릴 때 그에 맞는 wait queue 에 삽입된다. 그후에 제어권을 다른 프로세스에 넘긴다. 그리고 wait queue 에 들어가 있던 process 는 그에 맞는 조건이 되면 깨어나고 wait queue 에서 제거된다. 예를 들어 A라는 리소스를 원하는 프로세스 들이 있다고 하자 A 가 매우 비싼(?) 자원이라서 여러 프로세스들이 대기를 하고 있다면 우리는 A의 사용이 끝나는 동시에 기다리고 있는 프로세스들.. 더보기