본문 바로가기

Programming

wait queue 오늘은 wait queue 에 대해서 짚어보려고 합니다. 별 생각 없이 사용하곤 했지만, 정확히 개념을 알고 있는것이 중요하다고 생각되네요. - wait queue 의 개념. 간단하게 말해서 wait queue 는 프로세스들을 관리하는 집단이라고 생각하면 된다. 프로세스는 어떤 사건이 일어나기를 기다릴 때 그에 맞는 wait queue 에 삽입된다. 그후에 제어권을 다른 프로세스에 넘긴다. 그리고 wait queue 에 들어가 있던 process 는 그에 맞는 조건이 되면 깨어나고 wait queue 에서 제거된다. 예를 들어 A라는 리소스를 원하는 프로세스 들이 있다고 하자 A 가 매우 비싼(?) 자원이라서 여러 프로세스들이 대기를 하고 있다면 우리는 A의 사용이 끝나는 동시에 기다리고 있는 프로세스들.. 더보기
compile 된 binary 가 thumb / thumb-2 인지 check 하기 오늘은 thumb-2 code 가 절 고민하게 만들었습니다. 아시다 시피 ARM 은 기본적으로 두가지 모드(arm code , thumb code) 를 지원합니다. arm 은 32bit instruction 이고 thumb 는 16 bit instruction 이지요. 헌데 thumb-2 와 thumbEE 라는 32 bit instruction 이 나와서 instruction 의 길이만으로 구별하기가 참 애매해 졌습니다. 단순하게 thumb 만으로만 build 된 경우 objdump 로 build 된 영역을 interpret 해 보면 thumb 인지 금방 알 수 있습니다. instruction 이 16bit 로 나오거든요.. thumb mode 로 빌드하려면 컴파일 시 다음 옵션을 추가하면 됩니다. -m.. 더보기
restart_syscall 의 호출 경로 - 작성중 system call 에 대한 기본적인 내용은 생략하고.. strace 에서 오류가 나서 추적을 하다보니 sys_restart_syscall 의 경우 일반 syscall 과는 호출 경로가 조금 다르다. 왜 그런지 문서를 찾아보았지만 명확한 이유를 찾을 수가 없다. 일단 정리해 두고 차후에 원인을 알게 되면 보충해 보겠다. -000 |[0000:0xc00a97e0] sys_open( | filename = 0x851C, | flags = 1, | mode = 0) | -001 |[0000:0xC002EF40] ret_fast_syscall(asm) | --> |exception -002 |ZUR:0x6C6:0x400477BC(asm) : /lib/libc-2.5.so .. 더보기
process의 signal 처리 상태 보기 오늘은 특정 process 의 signal 상태에 대해 알아보는 법을 살펴 봅시다. 커맨드는 단순 합니다. # cat /proc/1548/status Name: phonestatus-ser State: S (sleeping) Tgid: 1548 Pid: 1548 PPid: 1529 TracerPid: 0 Uid: 0 0 0 0 Gid: 0 0 0 0 FDSize: 32 Groups: VmPeak: 6760 kB VmSize: 6760 kB VmLck: 0 kB VmHWM: 3116 kB VmRSS: 3116 kB VmData: 472 kB VmStk: 84 kB VmExe: 32 kB VmLib: 4832 kB VmPTE: 12 kB Threads: 1 SigQ: 1/3704 SigPnd: 0000000.. 더보기
linux system call 의 호출 구조 system call 의 구조에 대해 잘 설명해 놓은 문서 난 사실 restart_syscall 의 정체가 알고 싶을 뿐이고...;; 그러자니 여기서부터 출발해야 할 뿐이고...;; 출처 : http://network.hanbitbook.co.kr/view.php?bi_id=1062 저자: 서민우 출처: Embedded World 제목 : 리눅스 커널의 이해(2): 리눅스 커널의 동작 1. 리눅스 커널의 기본적인 동작 이제 리눅스 커널이 어떻게 동작하는지 들여다 보자. 리눅스 커널은 그 소스량은 엄청나지만 역시 커널의 기본적인 동작은 우리가 지금까지 보아온 커널의 동작과 별로 다르지 않다. 덧붙이자면 다른 RTOS도 역시 마찬가지다. system call에 의해 시작하는 리눅스 커널의 일반적인 동작 [그.. 더보기
__read_mostly keyword linux kernel source 를 분석중 생소한 keyword 가 눈에 띄어서 posting 해 본다. 원문 : http://pyun9998.springnote.com/pages/1318976?print=1 리눅스 커널 소스에서 전역변수 뒤에 __read_mostly 라고 선언한 코드를 볼 수 있습니다. 예를 들면 이런 식이죠. static struct list_head ptype_all __read_mostly; __read_mostly 로 선언한 변수들은 말 그대로 주로 읽히기만 하는 변수들로서 __read_mostly 를 사용한 전역변수들은 실행이미지에서 인접한 주소 영역에 그룹으로 위치하게 됩니다. 이렇게 되는 이유는 SMP 시스템에서 성능을 높이기 위해서입니다. CPU 는 캐쉬라인 사이즈 .. 더보기
Cache - Flush, clean, Invalidate cache 의 disable 하는 방법을 찾다가 invalidate 와 diable 의 용어의 혼돈이 생겨서 검색하던중 좋은 자료를 발견하였다. 헌데 cache disable 은 어떻게 하는걸까 ㅡㅡ; 찾으면 추가로 정리하겠다. 원문 : http://blog.naver.com/PostView.nhn?blogId=sadbiker&logNo=90016135740&redirect=Dlog&widgetTypeCall=true Cache Flush와 Invalidate… Cache란 뭐 다들 아시다시피.. 저장공간(일반적 메모리와 하드등 저장공간)과 CPU사이에 속도차이를 줄여주기 위하여 있는 소형(비싸서 작은것만 쓰져) 메모리 공간입니다.. 주로 CPU내부에 장착되어 있다지요? ^^ 그래서 CPU는 저장장치에서.. 더보기
__initdata keyword in kernel 커널 소스를 보던중 다음과 같은 코드가 있었다. static unsigned int cachepolicy __initdata = CPOLICY_WRITEBACK; 여기서 __initdata 라는 메크로는 무엇을 뜻하는 걸까? 아래에 자세한 설명이 있다. 원문 : http://tong.nate.com/thisbe71/29152477 __init에 init이 들어 가 있으니 초기화에 관련 된것이라고, 쉽사리 추측을 할수는 있지만, 그냥 넘어가기에는 역시..이놈의 성격이...ㅋㅋ 자 그럼 한번 알아 볼까요?? 이젠 안덥죠~?? 라고 근영씨가 말하는 군요.. 쉽게 말해서 __init 가 붙은 함수나 __initdata 가 붙은 변수는 메모리 한쪽에 잘 모아 놨다가... 시스템 초기화 시에 따~악 한번만 실행하고.. 더보기
linux virtual memory - Zone, Node, Section 의 개념 정의 : kernel 이 비슷한 속성을 가지는 page 를 관리하는 각 영역 사용 이유 1. 특정 메모리 주소에만 DMA 를 사용할 수 있는 HW 가 있다. 2. 가상 주소보다 더 많은 물리 주소를 사용할 수 있는 아키텍처가 있다. 종류 : ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM In Linux, the memory available from all banks is classified into "nodes". These nodes indicate how much memory each bank has. This classification is mainly useful for NUMA architectures, but it's also used for.. 더보기
virtual address 와 physical address 를 서로 변환하기 static inline unsigned long virt_to_phys(volatile void * address) { return __pa(address); } static inline void * phys_to_virt(unsigned long address) { return __va(address); } 더보기
linux 에서 Movi Nand, MMC Control 흐름도 Movi Nand 및 MMC 는 각 섹터와 파티션으로 구분되어 있습니다. 각 파티션 마다 다른 file system 을 사용할 수 있습니다. 예 > mmca mmca1 = fat16, size 106 sector mmca2 = fat32, size 11 sector system call (read, write,..) ↓ page cache ↓ bio : make request and push request queue request queue mmc driver : pop request queue and get request ↓ MoviNand & MMC Card 더보기
dd, tail 명령어 주어진 Node 에서 필요한 만큼의 데이터를 출력합니다. tail -c 20971520 /dev/mmca2 > /mnt/ums/mmca2_VGR_csc_20M.bin dd if=/dev/mmca3 of=/mnt/ums/mmca3_10M.bin bs=1M count= 10 dd if=/dev/mmca3 of=/mnt/ums/mmca3_end_90M.bin bs=1M count=90 skip=2744 요로코롬 쓰시면 됩니다. 더보기
L1, L2 cache 와 I cache, D cache 의 관계 전에도 언급한 적이 있듯이 어떠한 instruction set 이나 data 를 읽어올때 부근에 있는 data 들을 cache 로 저장합니다. 이때 L1 cache 를 사용하게 되며 L1 cache 에 없는 내용은 L2 cache 에서 뒤지게 됩니다. L2 cache 에도 없으면 Ram 에서 해당 데이터와 주변의 값들을 읽어오는 것이지요. I cache 는 instruction 이고 D cache 는 data cache 를 말합니다. L1 은 I cache 와 D cache 를 모두 가지고 있으며, L2 는 자주 access 가 이루어 지는 D cache 만으로 이루어져 있습니다. ==> 실제 확인해 본 결과 (Havard Archithecture 의 프로세서에서) L2 cache 에 Data와 Inst.. 더보기
Device Driver - memory mapping 원문 : http://vincenthanna.springnote.com/pages/2267520?print=1 Device Driver - memory mapping 가상 주소와 MMU 간단한 시스템은 물리 주소만으로도 동작할 수 있다. 그러나 다중프로세스를 지원하고 각 프로세스에 대해 메모리 공간을 보호해야 하는 운영체제는 물리 주소만으로 구현하기는 어렵다. MMU는 프로세서에 전달되는 주소를 다른 주소로 변환한다. 그래서 프로세서가 메모리에 접근하는 주소가 메모리에 직접 전달되는 것이 아니라 먼저 MMU에 전달되고, MMU는 변환 테이블을 참고해 이 주소를 실제 물리 주소로 변환해 전달한다. 이때 프로세서가 MMU에 가상 주소를 전달하면, MMU가 이 가상 주소를 해석하여 나온 물리 주소를 실제 메모.. 더보기
Kprobes를 이용한 커널 디버깅 시간이 될때 꼭 한번 해보고싶다. 하지만 ARM을 지원하지 않는다는거... ㅜ.- http://webdizen.new21.net/blog/2900 더보기
flush_dcache_page와 kmap_atomic 원문 : http://barriosstory.blogspot.com/2009/01/flushdcachepage-kmapatomic.html 굉장히 소중한 자료이다. 더불어 글을 쓰는 스타일도 너무나 마음에 든다. 좋은 자료를 공유해준 분께 다시한번 감사 드립니다. 왜 file system code들 중 kmap_atomic과 flush_dcache_page가 있을까? 아는 분의 도움으로 이 문제에 대해서 생각해 볼 기회가 생겼다. 먼저, flush_dcache_page 함수의 용도를 먼저 알아야 한다. David Miller가 작성한 문서에는 다음과 같이 되어 있다. void flush_dcache_page(struct page *page) Any time the kernel writes to a pag.. 더보기
L1, L2 cache 원문 : http://www.bcpark.net/bbs/31751 CPU는 Central Processing Unit의 머릿글자로 이 용어에서 알수 있듯이 여러개의 장치가 모여서 CPU를 구성하고 있습니다 이 구성요소중 하나가 케시메모리인데 케시 메모리는 L1 cache와 L2 cache로 나뉩니다. L1 cache memory는 CPU가 처리하는과정에서 필요한 여러가지 계산식이나 명령코드를 저장하는 케시메모리로써 CPU에 포함되어 있습니다 반복되는 계산을 줄이는 방법이 되는 중요한 케시 입니다 L2 cache memory는 CPU와 다른 장치와의 속도차이를 개선하기 위해 사용되는 메모리인데 CPU가 연산처리를 하는동안 다음에 필요한 데이터를 미리 저장해두는 공간입니다 즉 가장빠른 CPU가 상대적으로 느.. 더보기
arm - SIGSERV나 SIGILL 이 발생했을때의 asm 동작 ldr r1,[r6,+r3] 만약 이 instruction 에서 문제가 발생했다고 하자. 구문을 해석하자면 r1 = *(r6 + r3) 입니다. r6+r3 에서 나오는 주소에 문제가 있어서 SIGSEGV 가 발생하였는데 이때 r1 에 영향이 없을것 같은데 r1 에는 0 이 대입됩니다. ARM - coretex 입니다. 더보기
linux - t32 로 code 영역 dump 뜨기 코드영역을 비교해 보려고 다음과 같이 덤프를 떳는데 한참 작은 size 만 덤프가 되었다. data.save.binary "D:\c_expat_code_2.dat" 0x40031000++0x1d000 다시한번 시도해 보니 bus 애러가 난다. 이유인 즉슨... linux 는 4kb 단위로 demanding page 를 한다. 따라서 hit 가 되지 않은 code 영역은 ram 상에 없고, map 되어 있지 않으므로 애러가 나고 덤프되던 영역까지만 저장이 되는 것이다. 코드 영역이 40031000-4004e000 r-xp 00000000 b3:02 25236034 /mnt/data/factoryfs/lib/libexpat.so.1.5.0 이정도 크기라면, 해당 영역을 뒤져가며 다 dump 를 떠야지만 co.. 더보기
symbol table 로 code area 에서 함수 위치 찾기 readelf -s library.so 를 치면 symbol table 이 나온다. 9315: 000c3230 28 FUNC LOCAL DEFAULT 11 __GI_delete_module 9316: 00093188 540 FUNC LOCAL DEFAULT 11 __pathconf 9317: 0006ca08 952 FUNC LOCAL DEFAULT 11 __malloc 9318: 00059b88 236 FUNC LOCAL DEFAULT 11 _IO_padn_internal 9319: 000b4614 24 FUNC LOCAL DEFAULT 11 __read_nocancel # cat /proc/1456/maps 을 해서 나온 code 영역에서 40242000-4035b000 r-xp 00000000 8b:.. 더보기
readelf - 섹션 위치 한눈에 보기 readelf 에는 다음과 같은 기능이 있습니다. elf의 각 섹션들을 나열해 주고 크기와 속성을 보여줍니다. > readelf -l core.1455 Elf file type is CORE (Core file) Entry point 0x0 There are 79 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align NOTE 0x000a14 0x00000000 0x00000000 0x001dc 0x00000 0 LOAD 0x001000 0x2a000000 0x00000000 0x4d000 0x4d000 R E 0x1000 LOAD 0x04e000 0x2a0550.. 더보기
objdump - 실행파일에서 asm code 확인 objdump 의 여러 기능이 있지만 다음과 같은 기능이 있습니다. 바로 실행 파일에서 sam code 를 바로 확인해 볼 수 있는거지요. 옵션을 보면 source 와 매칭을 시킬 수도 있을것 같은데 좀 더 익숙해 지면 업데이트 하겠습니다. >objdump -d a.out | grep -A10 '' 08052cbc : 8052cbc: 0d c0 a0 e1 30 or $0x30e1a0c0,%eax 8052cc1: d8 2d e9 04 b0 4c fsubrs 0x4cb004e9 8052cc7: e2 38 loop 8052d01 8052cc9: 30 90 e5 00 40 a0 xor %dl,0xa04000e5(%eax) 8052ccf: e1 00 loope 8052cd1 8052cd1: 00 53 e3 add.. 더보기
linux mailing list 정리 linux 를 하면 할 수록 깊이있는 정보는 구글에서도 얻기가 힘들어 지고, 결국 mailing list 를 이용할 수 밖에 없더군요 근식이 형에게 메일링 리스트를 문의했더니 유용한 리스트들을 작업해 둔 페이지를 보내주었습니다. http://invain.homeip.net/maintainer.php 앞으로 도움이 많이 될것 같네요. 필요하신분들 참고하시기 바랍니다. 더보기
linux - Heap 은 움직인다(늘어난다). cat /proc/[pid]/maps 를 하면 해당 process 가 메모리를 어떻게 사용하고 있는지 알 수 있습니다. Test 를 할 일이 있어서 malloc 을 계속해서 할당하는 application 을 구현해서 heap size 를 보았습니다. # cat maps 00008000-00009000 r-xp 00000000 8a:09 42521 /opt/make_lock_up 00010000-00011000 rwxp 00000000 8a:09 42521 /opt/make_lock_up 00011000-0a8ad000 rwxp 00011000 00:00 0 [heap] 40000000-4001c000 r-xp 00000000 8b:07 2304052 /lib/ld-2.5.so 4001c000-4001f0.. 더보기
특정 시간 동안 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.. 더보기
Platform_get_irq & struct resource kernel 소스를 보다보면 irq handler 를 등록하는 부분에서 다음과 같은 code 를 볼 수 있다. static int __devinit kp_probe(struct platform_device *pdev) { ... keypad->irq = platform_get_irq(pdev, 0); printk("[KEY] %s() irq = 0x%x\n", __FUNCTION__, keypad->irq); if (keypad->irq irq; goto err_disable_clk; } ... } Platform_get_irq 는 어디서 등록된 irq 정보를 가지고 오는 것일까? probe 에서 가지고 온것을 보니 분명 어딘가에서 register_device 를 한.. 더보기
무선랜이 있는 노트북끼리 데이터 공유하는 방법 단순히 PC2대를 무선으로 연결시키는 법은 AD-hoc 모드를 사용해서 연결 하시면 됨니다..^^ 첫번째 노트북에서 제어판 -> 네트워크 및 인터넷 연결 -> 네트워크 연결 -> 무선네트워크 연결 -> 속성 -> 무선네트워크 -> 고급 -> 컴퓨터 간 네트워크만(특별) 선택 -> 닫기 추가 -> 네트워크 이름(SSID) 란에 아무거나 넣어줌. 네트워크 인증 : 개방모드 데이터 암호화 : WEP 키가 자동으로 공급됨 체크 안함 키인덱스 : 1 네트워크 키 : 암호이며(10자리를 16진수로 입력) 네트워크 키 확인 : 위의 네트워크 키 를 재입력 확인, 확인 하여 나오시면 되고, 다시 무선네트워크의 속성 -> 인터넷 프로토콜 TCP/IP -> 속성 "다음 IP주소 사용" IP주소 : 192.168.0.2 서.. 더보기
간단히 system lock up 상황 만들기 여러 방법들이 있겠지만 이방법이 가장 간달할것 같다. sysfs 파일에 다음을 등록해서 호출하면 바로 lock-up 상황이 연출된다. while(1){ printk("lockup count = %d\n", i++); local_irq_disable(); } 참고로 local_irq_disable 함수는 각종 인터럽트들을 disable 시킨다. 더보기
Trace32 - break point 에서 원하는 변수면 area 에 출력하기 break 옵션에 CMD 창에 다음과 같이 적는다. print "g_len=" v.value(g_len) " g_offset=" v.value(g_offset) " g_log_index=" v.value(g_log_index) " g_chunk=" v.value(g_chunk) 더보기
ps u에 나오는 RSS 사이즈는 VSZ 사이즈까지 증가한다. (할 수 있다)| 원문 : http://elenoa.tistory.com/181 좋은 내용이군요. 이론으로는 알고 있는 내용이지만 이렇게 실재로 눈으로 보는것은 참 의미있다고 생각합니다. 헌데 여기서 나오는 rss 는 smaps 에 나오는 rss, pss 와 같은 의미일까요? 결과를 다 써놓고 정리하자니 벌쭘하지만. VSZ와 RSS는 뭘까? man 페이지의 ps 항목에서 설명하는 두 파라미터의 설명은 다음과 같다. VSZ virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize). RSS resident set size, the .. 더보기