본문 바로가기

Programming/Linux_Kernel

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에 의해 시작하는 리눅스 커널의 일반적인 동작 [그.. 더보기
__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 요로코롬 쓰시면 됩니다. 더보기
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가 상대적으로 느.. 더보기
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 를 한.. 더보기
간단히 system lock up 상황 만들기 여러 방법들이 있겠지만 이방법이 가장 간달할것 같다. sysfs 파일에 다음을 등록해서 호출하면 바로 lock-up 상황이 연출된다. while(1){ printk("lockup count = %d\n", i++); local_irq_disable(); } 참고로 local_irq_disable 함수는 각종 인터럽트들을 disable 시킨다. 더보기
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 .. 더보기
linux proc 정보 원문 : http://www.promsoft.net/main/board/dev.asp?index=33&gotopage=1 linux 의 proc 는 해당 system 과 process 에 대한 상당히 자세한 정보를 제공해 줍니다. proc 를 알면 linux 가 보인다. - 제 생각입니다. ^^; proc/cmdline 부트로더에서 넘어온 command line rootfs정보, 시리얼정보, ram, 파티션정보 /proc/cpuinfo 말그대로 CPU정보 /proc/devices 현재 올라와있는 디바이스정보 /proc/fb frame buffer 정보 /proc/filesystems 지원하는 filesystem /proc/interrupts 등록된 interrupt정보 /proc/iomem Memory .. 더보기
linux 병목현상 분석 : latencytop linux 에는 수많은 디버깅 도구들이 있습니다. 그중 제가 이번에 주목한 녀석은 latencytop 입니다. 이녀석은 동작중에 느려지는 병목현상에서 어떤 프로세서가 문제를 일으키는지 분석해 주는 툴입니다. 무려 arm 에도 포팅이 되어 있다는 사실에 무척 기쁘긴 하지만, linux tool 들의 단점을 이녀석도 가지고 있습니다. 한눈에 파악하기 힘들다는 점인데요. 이러한 visiblity 를 향상하는 작업을 해보려고 합니다. 우선 이녀석은 다음 두가지 config 와 관련되어 있습니다. CONFIG_LATENCYTOP CONFIG_HAVE_LATENCYTOP_SUPPORT 그리고 최소한 다음 파일들에 영향을 미치네요. fs/proc/base.c:377:#ifdef CONFIG_LATENCYTOP fs/.. 더보기
각 HW block clock control 하기 - linux 2.6.29 요즘같은 SOC 환경에서 개발하다 보면 chip 내부에 각 hw block 마다 clock 을 enable / disable 해서 컨트롤 하게 됩니다. 이는 power save 측면에서도 중요한 사항이지요. 이러한 clock control 에 대한 general methord 에 대해 이야기 하려고 합니다. omap 과 s3c 시리즈에서 하용되는 코드지만 많은 칩셋들이 이와같이 동작하리라 봅니다. arch \ arm \ plat-chip명칭 \ clock.c 를 보면 아래와 같이 각 clock 의 device 들이 등록되어 있습니다. static struct clk init_clocks[] = { ... }, { .name = "spi", .id = 0, .parent = &clk_p66, .enable.. 더보기
slab cache - 생성과 파괴를 반복하는 커다란 자료구조 관리 리눅스 커널에서 커다란 자료 구조(structer)를 자주 생성/파괴해야 하는 경우라면 slab cache의 사용을 고려해 보자. slab layer 는 프로세서별로 할당되는 객체 캐시를 보존하며, 이 리스트는 객체(데이터)의 할당과 해제 성능을 획기적으로 향상시킨다. (예를 들어 inode 로 slab cache 로 관리한다.) 객체(데이터) slab------------------------- 객체(데이터) 객체들... cache----------------------- 객체(데이터) slab------------------------- 객체들... slab들 .... 각 객체 유형별(struct 별)로 하나의 cache 를 선언한다. 하나의 cache 는 다수의 slab 을 가지고 이 각각의 sla.. 더보기
misc 에 sysfs 등록하기 커널버전 : 2.6.29 misc driver 에 sysfs 를 등록하려 했으나 device object 가 없어서 난감한 상황에 빠졌다. sysfs 를 등록하려면 device 로 등록을 해야 하는데 misc를 사용하는 하위 device들은 register_device 로 등록을 하지 않기 때문이다. 구글링을 해보니 나같은 난감한 상황때문에 고민했던 사람이 있었고, 그 사람이 2003년에 패치를 만든것을 발견하였다. 역시 정식 커널 버전에도 적용되어 있었다. 소스 코드를 뒤져보니 패치로 인해서 misc structer 에 device 구조체가 추가 되었다. struct miscdevice { int minor; const char *name; const struct file_operations *fops.. 더보기
linux 레지스터 맵핑주소 찾기 간혹 virtual address 로 register 를 setting 하는 코드 들이 있다. 일반적으로 linux버전 \ arch \ arm \ plat-칩명 \ plat \ map.h 에 보면 cpu 각 모듈에 대한 register mapping table 이 있다. 예를들면 #define S3C_ADDR_BASE (0xF4000000) #ifndef __ASSEMBLY__ #define S3C_ADDR(x) ((void __iomem __force *)S3C_ADDR_BASE + (x)) #else #define S3C_ADDR(x) (S3C_ADDR_BASE + (x)) #endif #define S3C_VA_IRQ S3C_ADDR(0x00000000) /* irq controller(s) */ .. 더보기
정식 i2c port 에 등록하여 사용하기 mach-모델명.c 파일등에서 i2c_board_info 구조체 형태로 각 포트에 맞게 이름과 slave address 를 저장합니다. static struct i2c_board_info i2c_devs0[] __initdata = { { I2C_BOARD_INFO("KXSD9", 0x18), }, /* accelerator */ { I2C_BOARD_INFO("USBIC", 0x25), }, /* uUSB ic */ { I2C_BOARD_INFO("max17040", 0x36), }, /* max17040 fuel gauge */ }; s3c_i2c0_set_platdata(NULL); i2c_register_board_info(0, i2c0_devs, ARRAY_SIZE(i2c0_devs)); 드라이.. 더보기
Probe 함수의 파라미터로 데이터 전달하기 먼저 module_init 이나 device register 단에서 해당 드라이버에 대한 정보를 등록하며 이때 파라미터로 전달한 데이터를 등록해 놓는다. 이때 다음 함수가 사용된다. platform_set_drvdata static struct ak4671_setup_data smdk6410_ak4671_setup = { .i2c_bus = 3, // id = 3, GPIO_FM_SCL, GPIO_FM_SDA platform device. .i2c_address = (0x24 >> 1), }; static struct snd_soc_device smdk6410_snd_devdata = { .machine = &smdk6410, .platform = &s3c24xx_soc_platfor.. 더보기