본문 바로가기

Programming

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.. 더보기
git 커맨드 시트 오오 이런 좋은 자료가 !!일단 주소부터 keep. http://www.insightbook.co.kr/wp-content/uploads/2013/04/git-치트시트프린트.png http://www.insightbook.co.kr/wp-content/uploads/2013/04/git-%EC%B9%98%ED%8A%B8%EC%8B%9C%ED%8A%B8%ED%94%84%EB%A6%B0%ED%8A%B8.png 더보기
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.. 더보기
volatile keyword "비휘발성" 이라는 의미로,컴파일러에게 임의의 최적화를 금지할때 쓰는 키워드 이다. #define LCD_RAM (*((volatile unsigned short *) 0x60020000)) /* RS = 1 */ 이런식으로 address 에 직접 access 할때,저장공간을 컴파일러가 최적화 하여, r3 나 r5 로 변경해 버리면 곤란할 것이다. 또한, HW 에 의해서 지속적으로 변경되는 데이터를 담고 있다면,이또한 read 할때마다, 값이 update 되어야 하는데컴파일러 최적화는 이를 방해하는 요소가 된다. 이러한 것들을 피할때 volatile keyword 를 사용한다. 단, 추가 첨언을 하자면..The rule of thumb in Linux kernel programming is that if.. 더보기
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 이 출력된다. 더보기
I2C 파형 read write 정리 찰칵찰칵 님의 I2C 정리 부분내가 본 한글 자료중 가장 잘 정리되어 있는 자료다. 원문 : http://cafe.naver.com/firstpicturestory/33 I2C 정리 -개념Inter-Integrated Circuit의 약자SCL(클럭), SDA(테이타)의 두개의 라인을 사용.100Kbit/s(Standard Mode)~3.4Mbit/s(High-speed Mode)까지의 양방향 통신.* 일반적으로 40~400Kbits의 속도로 사용됨 - 통신의특성 신호는 크게 Start, data, stop 로 나뉜다.Start 는 SCL 이 high 일 때 SDA 가 falling으로 가는 경우로 Slave 에게 I2C 의 시작 됨을알린다.Stop 는 SCL 이 high 일 때 SDA 가 rising으.. 더보기
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 더보기
checkpatch.pl 과 Lindent 사용법 기본적으로 kernel/script/checkpatch.pl --file filename.c 를 하시면 linux coding style 과 다른 부분을 모두 check 해 주는 것은 이미 많은 분들이 알고 계실 겁니다. 하지만 이를 수작업으로 모두 수정하는 것도 많은 시간이 소요됩니다. 이때는 Lindent 를 사용하시면 적어도 "들여쓰기"에 대한 부분은 자동으로 수정이 됩니다. 사용법은 다음과 같습니다. ./scripts/Lindent filename.c 해당 스크립트를 사용하시려면 synaptic package manager 에서 indent 를 설치 하시면 됩니다. 더보기
구글 켈린더(안드로이드 폰)에 음력 일정 추가하기 PC에서 브라우저 주소창에 다음과 같이 입력하고 엔터를 눌러서 ics 파일을 저장합니다. http://korean-lunar-ical.appspot.com/YYYYMMDD.ics?summary=제목 YYYYMMDD : 실제 날자로 수정 제목 : 제목으로 수정 PC 브라우저로 구글 켈린더에서 해당 ics 일정을 불러오기 합니다. 설정 -> 켈린더 탭 -> 새 켈린더 만들기(켈린더 가져오기) 일정이 추가됩니다. 더보기
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.. 더보기