본문 바로가기

Programming

메모리 번지로 사이즈 계산하기 참 쉬운건데 헷갈리고 있었네요. 뒷번지 - 앞번지 + 1 이 해당 메모리 사이즈의 byte 값입니다. 예1 ) 0x0000 -- 0x1FFF 는 0x1FFF - 0x0000 + 1 = 0x2000 (=8192) 8192 byte 이고 8 kbyte 입니다. --------------------------------------------------- 예2 ) 0x04FFFFFF 0x04FFFFFF + 1 = 0x5000000 (byte) 0x5000000 / 0x400(1024) = 0x14000 = 81920 (kbyte) 81920 / 1024 = 80 Mbyte 공식으로 만들면 아래와 같습니다.(선형주소 + 1) / (1024*1024) = x MB 참고로 64MB : 0x 0400 0000 1G :.. 더보기
device driver check list (using I2C) I2C 드라이버를 사용하는 디바이스 드라이버를 작성할때 check list 이다. 모든 디버깅은 의심 포인트 리스트를 만들고 테스트 하기 쉬운것 -> 어려운것 순으로 하는것이 좋다. 문제를 해결했을때 처음에 내가 작성한 "의심 리스트"에 해당 문제가 없었다면 아직 경험이 부족하거나 관련 지식이 불충분한 것이다. 0. 모든 device driver 에 check list 0순위는 전원과 enable gpio high 이다. 1. slave address 보통 slave address 는 spec대로 입력하면 I2C 드라이버 내부적으로 1bit 를 왼쪽으로 shift 해서 사용한다. 혹시 I2C 가 계속 ACK fail 이 난다면 slave address 를 더보기
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/.. 더보기
전처리기 사용 : define ## 오랫만에 C에 대한 내용으로 포스팅을 하는군요. 개발을 하다 포트 번호에 따라 다른 레지스터를 사용해야 하는 일이 있었는데요. 레지스터를 보니 포트 번호에 따라 숫자만 다르고 같은 문자열을 가지더군요. S3C2410_TCON_T1MANUALUPD S3C2410_TCON_T2MANUALUPD S3C2410_TCON_T3MANUALUPD 이런식의 레지스터가 여러게가 있어서 레지스터가 하나 변경될때마다 여기저기 찾아다니며 수작업을 해주어야 합니다. 포트를 진행하는 모델에 따라 변경해야 하는데 이걸 하드코딩으로 하자니 왠지 폼이 안나구요.. 실수라도 하는 날엔 디버깅으로 날려먹을 시간을 생각하니 먼가 "다이나믹"하게 적용하고 싶더군요. 그래서 아래와 같이 작업을 해 보았습니다. #define PWM_PORT_N.. 더보기
각 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.. 더보기
linux 에서 GPIO로 I2C Emulation 사용하기 mach-모델명.h code 에서 에뮬레이션 i2c device 등록 #define GPIO_TOUCH_SDA S3C64XX_GPC(5) static struct i2c_gpio_platform_data i2c_touch_platdata = { .sda_pin = GPIO_TOUCH_SDA, // gpio number .scl_pin = GPIO_TOUCH_SCL, .udelay = 2, .sda_is_open_drain = 0, .scl_is_open_drain = 0, .scl_is_output_only = 0 }; static struct platform_device sec_device_i2c_touch = { .name = "i2c-gpio", .id = 4, // adepter number .d.. 더보기
arm cache 의 속성과 셋팅 (2) = Cache System = Write strategy 1. Write- through All write are passed to main memory immediately Processor slow down to main memory speed during write cpu ↔ cache ↔ Main memory요 때, Write Through와 Write Back이라는 용어가 난무하는데요, Write Through라는 용어는 쓰루 패스와 마찬가지로 Memory에 뭔가를 쓸 때 그 값이 Cache위에 올라와 있는 값일 경우에 곤란하겠죠. Cache와 Memory값이 다르면 안되니까요. Write Through를 쓰게 되면 Cache와 Memory에 모두 Update를 같이 해버리는 거지요. 간편한 S.. 더보기
MMU 의 section register 의 의미 원문 : http://wabar.tistory.com/tag/TLB MMU의 등장 배경 초창기의 프로그래머는 물리주소를 직접 사용하여 프로그래밍을 하였었죠. 우리가 아는 OS 중에 DOS와 같은 것은 논리주소를 사용하지 않죠. 현재는 대부분의 OS가 가상메모리를 제공하므로 논리주소가 필요합니다. 가상메모리의 개념이 만들어지게 된 과정은 역시 효율적 자원의 활용이라는 인간의 욕구가 시발입니다. 컴퓨터의 프로그램은 결국 CPU에 의해서 순차적으로 실행이 되므로 CPU가 필요로 하는 프로그램의 코드는 한 시점에 일부만 메모리에 존재해도 된다는 것을 인식하게 되었죠. 이는 물리적으로 작은 메모리를 설치한 컴퓨터에서 이 메모리보다 큰 프로그램을 실행시키고 싶은 필요에 의해 나왔죠. 메모리 가상화를 위해 나온 기술.. 더보기
arm cache 의 속성과 셋팅 (1) cache 셋팅에 여러가지 속성중 두가지에 대해 이야기 해보자. #define L_PTE_MT_UNCACHED (0x00 더보기
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.. 더보기
SPI interface 이글은 가필드 님이 작성하신 글입니다. 좋은 내용을 보존 및 확산 하기 위해서 부득이 하게 원문을 그대로 퍼 왔음을 양해해 주시기 바랍니다. 원문출처 : http://garfieldfactory.tistory.com/ SPI 란? 1. SPI란? SPI는 Serial Peripheral interface의 약자로, 친절하게 해석해 드리면 “시리얼 방식의 주변 장치 인터페이스”정도 되시겠다. SPI 통신은 달랑 전선 3개로만 통신하는 간단하고도 쓸모가 많은 통신방식이다. 특히나 MCU의 GPIO 포트가 모자르거나, 데이터를 주고받는 프로토콜에 신경 쓰기 귀찮아하는 필자같은 게으름뱅이한테 딱 좋은 방식이라고 하겠다. 2. SPI의 동작 방식 자료구조에서 Circular Queue라고 아시는가? “환형 큐”라.. 더보기
linux 압축 관련 명령어 모음 tar xzvf [파일이름] 압축하기 tar -czvf [이름] [폴더명] aa, bb, cc 파일을 zip.tar라는 파일로 묶는다. [root@sense tar]# tar -cf zip.tar aa bb cc [root@sense tar]# ls aa bb cc zip.tar 나) 아카이브를 풀지 않고 내용을 확인할 수 있다. [root@sense tar]# ls aa bb cc zip.tar [root@sense tar]# tar tvf zip.tar -rw-r--r-- root/root 0 2005-03-26 11:16:05 aa -rw-r--r-- root/root 0 2005-03-26 11:16:07 bb -rw-r--r-- root/root 0 2005-03-.. 더보기
linux rpm 관련 명령어 (1) 설명: 새로운 패키지를 설치하거나 업그레이드시 사용한다. (2) 관련옵션 -i : 새로운 패키지를 설치할 때 사용한다. (--install) -U : 기존의 패키지를 새로운 버전의 패키지로 업그레이드할 때 사용하고 설치된 패키지가 없을 경우 패키지를 설치를 한다.( -i 옵션과 같음) -F : 이전 버전이 설치되어 있는 경우에만 설치한다.(--freshen) -v : 메시지를 자세히 보여준다. -h : '#'기호로 표시해 준다. --force : 기존에 설치된 패키지와 관계없이 강제로 설치 한다. --nodeps : 의존성 관계를 무시하고 설치 한다. -vv : 메시지를 아주 자세히 보여준다. --oldpackage : 구버전으로 다운그레이드할 때 사용한다. --rebuilddb : 특정한 패키지.. 더보기
Linux Network proxy setting 방법 Ubuntu 환경에서는 windows 와 다르게 proxy setting 을 여러곳에 각각 해 주어야 하는 번거로움이 있다.크게 3가지 인데 아래에 정리해본다 참고 : http://xmodulo.com/how-to-set-up-proxy-auto-config-on-ubuntu-desktop.html 그래픽 UI 의 setting menu 에서 아래와 같이 설정한다. you have created this PAC file, go to "System Settings" -> "Network" -> "Proxy Settings", and choose "Automatic" method in network proxy. Then type "file://.. 더보기
linux 초보자를 위한 잡다지식 퍼레이드 출처가 불분명한 글을 얻어서 올립니다. 혹시 문제가 된다면 연락주세요. LINUX 명령어 Option 설 명 비 고 ls 자신이 위치한 디렉토리에 있는 파일들의 이름을 보여줌 LiSt 의 준말 >을 사용해서 출력문을 파일로 저장할 수 있음.. ex> ls > ls.txt = 파일리스트가 화면에 보이지 않고 ls.txt파일로 저장됨. 파일의 종류는 이름 뒤에 붙은 기호로 알 수 있음.. ‘/’가 붙으면 디렉토리 ‘*’가 붙으면 실행파일 -l 파일에 대한 정보를 자세하게 보여줌.. ex>ls -l ?? drwxrwxr-x 1 root root 1024 apr 11 21:20 Mail/ 파일속성,권한 링크된파일수 소유자 소유그룹 크기 최종수정일 파일이름 └?? 앞에 한자리는 파일의 종류, 다음은 세 자리씩 끊.. 더보기
linux yum 명령어 yum -y update -y 옵션은 질문에 대해 모두 yes로 응답. 설치 팩키지 확인 rpm -qa | grep '패키지명' 패키지 찾기 yum search '패키지명' 패키지 설치 및 update yum install '패키지명' yum update ('패키지명') 서치 경로 변경 /etc/yum.repos.d/* 모든 파일의 경로를 아래와 같이 변경 # vi /etc/yum.repos.d/fedora.repo baseurl=http://download.fedora.redhat.com/pub/fedora/linux/releases/$releasever/Everything/$basearch/os/ #mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?re.. 더보기
linux ftp 명령어 유닉스 콘솔에서 ftp 명령어 mput 사용시 파일 하나 전송할때마다 y/n을 물어 보는 것을 없애는 방법은 . prompt 키워드로 대화식 모드를 off로 해야함 ftp> prompt 하면됨. 한번 더하면 원래 대로 돌아옴. ftp> binary 바이너리 모드로 전송됨. ftp> mput * 모든 파일이 전송됨. 간혹 mget *.* 하면 전송 안되는 파일이 있음. 확장자가 없는 파일이 있기 때문에...... *** 파일 보내기(mput), 파일 가져오기(mget)*** mget * ==> 디렉토리를 제외한 나머지 파일을 모두 가져온다. mget -R BACKUP ==> BACKUP이란 폴더 안에 존재하는 모든 내용을 가져온다. mget -R * ==> 역시 하위 폴더까지 모두 가져온다. get -R .. 더보기
linux 디렉토리및 파일관리 명령어 ##디렉토리및 파일관리 명령어## ls - 파일및 디렉토리 목록 보기 [옵션] -a 숨김파일(.xx) 도모두 출력 -c 변경시간 에 따른 정렬 -C 다중 컬럼 표시 -d 디렉토리만 표시 -F 이름 끝에 파일 형식 표시 -l 롱포맷 으로 표시 (자세히보기) -r 이름 역순 표시 -R 서브디렉토리까지 표시합니다 cd - 경로변경 pwd - 현재 경로 보기 tty - 현재 로그인되어 있는 터미널의 장치 이름 보기 man - 명령어나 파일에 대한 매뉴얼 cat - 파일의 내용을 출력 touch -빈파일 생성및 엑세스시간 변경 mkdir - 디렉토리 를 생성 rmdir - 디렉토리 삭제 route - 인터페이스 정보확인 cp -파일 복사 ex) cp 대상파일 이동파일 [옵션] -a : 소스파일의 구성과 속성도 함.. 더보기
유용한 linux 명령어들 이 문서는 계속해서 업데이트 됩니다. find 폴더경로 -type d -name .svn | xargs rm -rf 예제 : 폴더내 하위폴더들에 해당 문자열이 있는 파일 찾기 grep -snr "IPMC_IOCTL_SET_CPU_MODE" * egrep "UPLOAD|DELETE" *.log >> log.txt : 문자열만 추출해서 파일로 옮기기 grep [옵션][찾을문자][대상파일] -C : 일치되는 내용이 있는 행의 개수를 센다. -V : 문자가 존재하지 않는 행 출력 -i : 대소문자 구분없이 검색 -CV : 문자가 존재하지 않는 행의 갯수 출력 -h : 일치되는 내용을 찾은 파일의 이름을 표시하지 않는다. -n : 일치되는 .. 더보기
리눅스명령어top 사용법과 설명과 CPU과부하(CPU used 100%) 원본 : http://weezzle.net/1360 top이라고 친 후 h라고 입력 하면 도움말이 나옵니다. 거기에서 보고싶은 걸 입력하면 됩니다. >#top ---------------------------------------------------------------------------- top - 11:35:19 up 44 days, 5:09, 5 users, load average: 0.03, 0.05, 0.05 Tasks: 343 total, 1 running, 342 sleeping, 0 stopped, 0 zombie Cpu(s): 1.2% us, 0.1% sy, 0.0% ni, 96.7% id, 1.9% wa, 0.0% hi, 0.0% si Mem: 2070100k total, 1748.. 더보기
linux 평균 cpu 점유률 구하기 top -d 0.1 -n 10 | grep Cpu 에서 나온 정보중 # top -d 0.1 -n 10 | grep Cpu Unknown HZ value! (2810100) Assume 100. Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 99.9% id, 0.1% wa, 0.0% hi, 0.0% si, 0.0% st Cpu(s): 11.6% us, 14.5% sy, 0.0% ni, 72.5% id, 0.0% wa, 1.4% hi, 0.0% si, 0.0% st Cpu(s): 25.8% us, 35.5% sy, 0.0% ni, 32.3% id, 0.0% wa, 6.5% hi, 0.0% si, 0.0% st Cpu(s): 10.0% us, 53.3% sy, 0.0% ni, 33.3% id,.. 더보기
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= 더보기
oprofile 관련 유용한 정보들 - oprofile 사용법 HowTo http://linuxspot.tistory.com/34 - oprofile 에 대한 전반적인 내용 http://www.ibm.com/developerworks/kr/library/l-pow-oprofile/index.html 더보기