본문 바로가기

Kernel

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 .. 더보기
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.. 더보기
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.. 더보기
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.. 더보기
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 = (.. 더보기
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.. 더보기
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) \ .. 더보기
wait queue 오늘은 wait queue 에 대해서 짚어보려고 합니다. 별 생각 없이 사용하곤 했지만, 정확히 개념을 알고 있는것이 중요하다고 생각되네요. - wait queue 의 개념. 간단하게 말해서 wait queue 는 프로세스들을 관리하는 집단이라고 생각하면 된다. 프로세스는 어떤 사건이 일어나기를 기다릴 때 그에 맞는 wait queue 에 삽입된다. 그후에 제어권을 다른 프로세스에 넘긴다. 그리고 wait queue 에 들어가 있던 process 는 그에 맞는 조건이 되면 깨어나고 wait queue 에서 제거된다. 예를 들어 A라는 리소스를 원하는 프로세스 들이 있다고 하자 A 가 매우 비싼(?) 자원이라서 여러 프로세스들이 대기를 하고 있다면 우리는 A의 사용이 끝나는 동시에 기다리고 있는 프로세스들.. 더보기
__initdata keyword in kernel 커널 소스를 보던중 다음과 같은 코드가 있었다. static unsigned int cachepolicy __initdata = CPOLICY_WRITEBACK; 여기서 __initdata 라는 메크로는 무엇을 뜻하는 걸까? 아래에 자세한 설명이 있다. 원문 : http://tong.nate.com/thisbe71/29152477 __init에 init이 들어 가 있으니 초기화에 관련 된것이라고, 쉽사리 추측을 할수는 있지만, 그냥 넘어가기에는 역시..이놈의 성격이...ㅋㅋ 자 그럼 한번 알아 볼까요?? 이젠 안덥죠~?? 라고 근영씨가 말하는 군요.. 쉽게 말해서 __init 가 붙은 함수나 __initdata 가 붙은 변수는 메모리 한쪽에 잘 모아 놨다가... 시스템 초기화 시에 따~악 한번만 실행하고.. 더보기
Kprobes를 이용한 커널 디버깅 시간이 될때 꼭 한번 해보고싶다. 하지만 ARM을 지원하지 않는다는거... ㅜ.- http://webdizen.new21.net/blog/2900 더보기
특정 시간 동안 system cpu 사용량 구하기 (linux) 오늘은 특정시간동안의 cpu 사용량 구하는 법에 대해서 알아보고자 합니다. /proc/stat 정보를 조합하면 원하시는 정보를 얻으실 수 있습니다. cat /proc/stat 를 하시면 아래와 같은 정보를 얻을 수 있습니다. # cat /proc/stat cpu 4939 385 2406 38767 313 20 320 0 0 cpu0 4939 385 2406 38767 313 20 320 0 0 intr 102031 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 190 0 0 0 0 0 1045 0 8147 0 92 0 1286 0 0 0 0 0 0 0 0 2 0 0 0 133 0 0 0 1 0 0 0 1765 0 0 0 0 0 0 2 0 0 70437 0 0 0 0 0 0 0 0 0.. 더보기
slab cache - 생성과 파괴를 반복하는 커다란 자료구조 관리 리눅스 커널에서 커다란 자료 구조(structer)를 자주 생성/파괴해야 하는 경우라면 slab cache의 사용을 고려해 보자. slab layer 는 프로세서별로 할당되는 객체 캐시를 보존하며, 이 리스트는 객체(데이터)의 할당과 해제 성능을 획기적으로 향상시킨다. (예를 들어 inode 로 slab cache 로 관리한다.) 객체(데이터) slab------------------------- 객체(데이터) 객체들... cache----------------------- 객체(데이터) slab------------------------- 객체들... slab들 .... 각 객체 유형별(struct 별)로 하나의 cache 를 선언한다. 하나의 cache 는 다수의 slab 을 가지고 이 각각의 sla.. 더보기
linux kernel update list 정리 (2.6.25 - 2.6.29) - 프로세스 메모리 사용량의 좀 더 정확한 측정을 위한 새로운 인터페이스 도입, - 프로세서 그룹의 메모리 사용을 제어하기 위한 ‘memory resource controller’ 1. Important features (AKA: the cool stuff) 1. Memory Resource Controller : memory resource controller 를 Cgroups 로 통합하였음. 2. Real Time Group scheduling : 2.6.24 에서 사용되었던 group scheduling 에 SCHED_RT type 추가 3. RCU Preemption support 4. FIFO ticket spinlocks in x86 5. Better process memo.. 더보기
oom killer 에 관한 글 OOM killer 에 대해서 좋은글이 있어서 링크를 건다. http://barriosstory.blogspot.com/2009/02/taming-oom-killer.html 헨드셋에서는 linux 기본 OOM 을 사용하기에는 무리가 있다. 모바일특성상 OOM이 발동할 시기는 이미 유저입장에서는 시스템이 한참 전에 뻗어 있은 후이기 때문이다. 따라서 안드로이드의 low memory killer 의 컨샙을 변형하여 일정이상 ram 이 부족하게 되면 현재 실행중인 어플들 리스트중에 원하는 것을 kill 하도록 구현하였다. 더보기
RCU (read-copy update) 에 대한 이해 원문 : http://barriosstory.blogspot.com/2009/01/rcu.html RCU에 대해 이해하기 쉽게 정리한 문서가 있다. RCU에 대한 이해 아래 링크도 그림으로 잘 표현되어 있습니다. http://2005elc.elancer.co.kr/eTimes/page/eTimes_view.html?str=c2VsdW5vPTI5MDM= 더보기