http://blueheartscabin.blogspot.kr/2013/08/ipb.html
http://www.streaminglearningcenter.com/articles/producing-h264-video-for-flash-an-overview.html?page=4
http://www.axis.co.kr/img/product/brochure/wp_h264_kor_lo.pdf
http://www.programering.com/a/MjNwcTMwATg.html
http://www.mathcs.emory.edu/~cheung/Courses/558a/Syllabus/2-video/mpeg2.html
I frame : key frame
P - frame : 이전 I frame or 이전의 P frame을 정보를 사용하며 , P Frame은 전체 이미지가 바뀌는 것이 아니라, 이지지의 블럭들이 옆으로 이동하는 것을 움직이것을 것을 생각하여, 차이 값을 부호화 하여 기록 .
B - Frame : 이전, 이후의 I- Frame 과 P Frame을 모두 사용 , P frame과의 차이는 단 반향 혹은 양방향이냐의 차이 .
http://en.wikipedia.org/wiki/H.264/MPEG-4_AVC
http://microdev.tistory.com/109
http://microdev.tistory.com/110
글 혹은 그림의 출처가 문제있다면 수정 및 삭제하겠습니다. 우측의 Tags 와 검색기능을 이용하여 편하게 찾을 수 있습니다.
Please check buttons on the right like Tags and language options if can't read this blog (*mobile not support)
10/28/2014
10/20/2014
Linux debug Strace 사용 (추후 정리후 삭제)
Strace Debug
http://www.brendangregg.com/perf.html
https://brunch.co.kr/@alden/12
http://linuxspot.tistory.com/253
http://man7.org/linux/man-pages/man1/strace.1.html
$ strace -h usage: strace [-CdffhiqrtttTvVwxxy] [-I n] [-e expr]... [-a column] [-o file] [-s strsize] [-P path]... -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS] or: strace -c[dfw] [-I n] [-e expr]... [-O overhead] [-S sortby] -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS] Output format: -a column alignment COLUMN for printing syscall results (default 40) -i print instruction pointer at time of syscall -o file send trace output to FILE instead of stderr -q suppress messages about attaching, detaching, etc. -r print relative timestamp -s strsize limit length of print strings to STRSIZE chars (default 32) -t print absolute timestamp -tt print absolute timestamp with usecs -T print time spent in each syscall -x print non-ascii strings in hex -xx print all strings in hex -y print paths associated with file descriptor arguments -yy print ip:port pairs associated with socket file descriptors Statistics: -c count time, calls, and errors for each syscall and report summary -C like -c but also print regular output -O overhead set overhead for tracing syscalls to OVERHEAD usecs -S sortby sort syscall counts by: time, calls, name, nothing (default time) -w summarise syscall latency (default is system time) Filtering: -e expr a qualifying expression: option=[!]all or option=[!]val1[,val2]... options: trace, abbrev, verbose, raw, signal, read, write -P path trace accesses to path Tracing: -b execve detach on execve syscall -D run tracer process as a detached grandchild, not as parent -f follow forks -ff follow forks with output into separate files -I interruptible 1: no signals are blocked 2: fatal signals are blocked while decoding syscall (default) 3: fatal signals are always blocked (default if '-o FILE PROG') 4: fatal signals and SIGTSTP (^Z) are always blocked (useful to make 'strace -o FILE PROG' not stop on ^Z) Startup: -E var remove var from the environment for command -E var=val put var=val in the environment for command -p pid trace process with process id PID, may be repeated -u username run command as username handling setuid and/or setgid Miscellaneous: -d enable debug output to stderr -v verbose mode: print unabbreviated argv, stat, termios, etc. args -h print help message -V print version
$ sudo cat /proc/550/maps // 실행과 관련된 공유라이브러리 확인 $ sudo cat /proc/550/status // Process 상태확인 $ readelf -h /proc/550/exe // 실행파일 확인 $ readelf -s /proc/550/exe // symbol table 확인 $ strace -p 550 -f -t ........... [pid 994] 11:25:13 pselect6(0, NULL, NULL, NULL, {0, 10000000}, NULL) = 0 (Timeout) [pid 994] 11:25:13 openat(AT_FDCWD, "/proc/irq/366/spurious", O_RDONLY) = 31 [pid 994] 11:25:13 fstat(31, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 [pid 994] 11:25:13 fstat(31, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 [pid 994] 11:25:13 read(31, "count 180\nunhandled 0\nlast_unhan"..., 1024) = 42 ............... $ strace -p 550 -f -tt [pid 994] 11:30:52.563464 fstat(31, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 [pid 994] 11:30:52.563761 fstat(31, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 [pid 994] 11:30:52.564047 read(31, "count 180\nunhandled 0\nlast_unhan"..., 1024) = 42 $ strace -cp 550 -f strace: Process 550 attached with 4 threads ^Cstrace: Process 550 detached strace: Process 743 detached strace: Process 994 detached strace: Process 995 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 98.67 0.488000 1132 431 pselect6 0.94 0.004653 12 382 sendto 0.13 0.000666 2 382 openat 0.10 0.000495 1 382 close 0.09 0.000457 1 764 fstat 0.06 0.000310 1 382 read 0.00 0.000000 0 4 2 futex ------ ----------- ----------- --------- --------- ---------------- 100.00 0.494581 2727 2 total
http://www.brendangregg.com/perf.html
https://brunch.co.kr/@alden/12
http://linuxspot.tistory.com/253
http://man7.org/linux/man-pages/man1/strace.1.html
10/19/2014
USB Device Descriptor 기본구조
1. USB의 Descriptor 의 역할
Descriptor의 역할은 Host와 Device 사이에 DATA를 어떻게 주고 받을 것인지, Interface를
어떻게 설정할지 데이타의 흐름을 어떻게 설정하지 등 구체적인 설정하는 것이다.
이 정보는 USB Device가 가지고 있어야 하며, USB Host는 이에 맞게 Driver를 연결해야한다.
USB 범용으로 사용되는 Class Device Driver는 윈도우에서도 동일하게 지원을 하고 있다.
이전에는 직접 이렇게 했는데, 요즘 거의 이렇게까지 할일이 거의 없으며, 표준 Class Device Driver 에 연결하여 사용한다.
http://www.jungo.com/st/support/documentation/windriver/10.2.1/wdusb_manual.mhtml/wd_usb_arch.html
2. USB의 Device Descriptors의 구조
Device -> Coifnguration-> Interface -> Endpoint Tree 형태로 구성이 되어있으며, 각각의 Descriptor 에 하단의 Descritor의 갯수를 정의하여, 각 구성이 가능하다.
Configuration Descriptor 는 각각의 Interface Descriptor 가지고 있으며, 이는Host에서 Device Driver 에서 Device/Interface의 Class 정보를 가지고
각 Class Device Driver를 구동을 하여 실행이 가능하다.
3. USB Descriptor 의 Table 구성
실제 USB Device의 Descriptor의 구성을 살펴보자.
중요하게 봐야 할 부분
USB의 Class 정보
https://www.usb.org/defined-class-codes
Interface Decirptor
https://www.beyondlogic.org/usbnutshell/usb5.shtml#InterfaceDescriptors
각 Endpoint 마다 Transer Type을 정의하고 Endpoint를 2 (In/Out)개 혹은 그 이상으로 정의하여 각각의 Stream Pipe 구성한다.
Endpoint의 통신방식
http://www.beyondlogic.org/usbnutshell/usb4.shtml
http://www.jungo.com/st/support/documentation/windriver/10.2.1/wdusb_manual.mhtml/USB_data_transfer_types.html
http://www.beyondlogic.org/usbnutshell/usb5.shtml
USB의 SETUP Packet
http://www.beyondlogic.org/usbnutshell/usb6.shtml
Descriptor의 역할은 Host와 Device 사이에 DATA를 어떻게 주고 받을 것인지, Interface를
어떻게 설정할지 데이타의 흐름을 어떻게 설정하지 등 구체적인 설정하는 것이다.
이 정보는 USB Device가 가지고 있어야 하며, USB Host는 이에 맞게 Driver를 연결해야한다.
- Device Descriptor (Host에서는 이를 Device로 인식)
- Configuration Descriptor (Device의 상태 및 설정)
- Interface Descriptor ( 실제 연결되는 Interface Driver 연결, HID,CDC, Mass Storage)
- Endpoint Descriptor ( 전송방식과 전송방향 ,데이타구조 정의)
- 일반적인 USB Device ( Class Device )
USB 범용으로 사용되는 Class Device Driver는 윈도우에서도 동일하게 지원을 하고 있다.
- 개별정의 USB Device
이전에는 직접 이렇게 했는데, 요즘 거의 이렇게까지 할일이 거의 없으며, 표준 Class Device Driver 에 연결하여 사용한다.
http://www.jungo.com/st/support/documentation/windriver/10.2.1/wdusb_manual.mhtml/wd_usb_arch.html
2. USB의 Device Descriptors의 구조
Device -> Coifnguration-> Interface -> Endpoint Tree 형태로 구성이 되어있으며, 각각의 Descriptor 에 하단의 Descritor의 갯수를 정의하여, 각 구성이 가능하다.
Configuration Descriptor 는 각각의 Interface Descriptor 가지고 있으며, 이는Host에서 Device Driver 에서 Device/Interface의 Class 정보를 가지고
각 Class Device Driver를 구동을 하여 실행이 가능하다.
3. USB Descriptor 의 Table 구성
실제 USB Device의 Descriptor의 구성을 살펴보자.
- Device Descriptor
Offset | Field | Size | Value | Description |
0 | bLength | 1 | Number | Size of the Descriptor in Bytes (18 bytes) |
1 | bDescriptorType | 1 | Constant | Device Descriptor (0x01) |
2 | bcdUSB | 2 | BCD | USB Specification Number which device complies too. |
4 | bDeviceClass | 1 | Class | Class Code (Assigned by USB Org) If equal to Zero, each interface specifies it’s own class code If equal to 0xFF, the class code is vendor specified. Otherwise field is valid Class Code. |
5 | bDeviceSubClass | 1 | SubClass | Subclass Code (Assigned by USB Org) |
6 | bDeviceProtocol | 1 | Protocol | Protocol Code (Assigned by USB Org) |
7 | bMaxPacketSize | 1 | Number | Maximum Packet Size for Zero Endpoint. Valid Sizes are 8, 16, 32, 64 |
8 | idVendor | 2 | ID | Vendor ID (Assigned by USB Org) |
10 | idProduct | 2 | ID | Product ID (Assigned by Manufacturer) |
12 | bcdDevice | 2 | BCD | Device Release Number |
14 | iManufacturer | 1 | Index | Index of Manufacturer String Descriptor |
15 | iProduct | 1 | Index | Index of Product String Descriptor |
16 | iSerialNumber | 1 | Index | Index of Serial Number String Descriptor |
17 | bNumConfigurations | 1 | Integer | Number of Possible Configurations |
중요하게 봐야 할 부분
- ID / Vendor ID: 정해진 값으로 Device 제조사에 의해 결정
- ID / Product: 정해진 값으로 Device 제조사에 의해 결정
- Class/Sub Class/Protocol :
VendorID 신청
- Configuration Descriptor
Offset | Field | Size | Value | Description |
0 | bLength | 1 | Number | Size of Descriptor in Bytes |
1 | bDescriptorType | 1 | Constant | Configuration Descriptor (0x02) |
2 | wTotalLength | 2 | Number | Total length in bytes of data returned |
4 | bNumInterfaces | 1 | Number | Number of Interfaces |
5 | bConfigurationValue | 1 | Number | Value to use as an argument to select this configuration |
6 | iConfiguration | 1 | Index | Index of String Descriptor describing this configuration |
7 | bmAttributes | 1 | Bitmap | D7 Reserved, set to 1. (USB 1.0 Bus Powered) D6 Self Powered D5 Remote Wakeup D4..0 Reserved, set to 0. |
8 | bMaxPower | 1 | mA | Maximum Power Consumption in 2mA units |
- Interface Descriptor
Offset | Field | Size | Value | Description |
0 | bLength | 1 | Number | Size of Descriptor in Bytes (9 Bytes) |
1 | bDescriptorType | 1 | Constant | Interface Descriptor (0x04) |
2 | bInterfaceNumber | 1 | Number | Number of Interface |
3 | bAlternateSetting | 1 | Number | Value used to select alternative setting |
4 | bNumEndpoints | 1 | Number | Number of Endpoints used for this interface |
5 | bInterfaceClass | 1 | Class | Class Code (Assigned by USB Org) |
6 | bInterfaceSubClass | 1 | SubClass | Subclass Code (Assigned by USB Org) |
7 | bInterfaceProtocol | 1 | Protocol | Protocol Code (Assigned by USB Org) |
8 | iInterface | 1 | Index | Index of String Descriptor Describing this interface |
USB의 Class 정보
https://www.usb.org/defined-class-codes
Interface Decirptor
https://www.beyondlogic.org/usbnutshell/usb5.shtml#InterfaceDescriptors
- Endpoint Descriptor
Offset | Field | Size | Value | Description |
0 | bLength | 1 | Number | Size of Descriptor in Bytes (7 bytes) |
1 | bDescriptorType | 1 | Constant | Endpoint Descriptor (0x05) |
2 | bEndpointAddress | 1 | Endpoint | Endpoint Address Bits 0..3b Endpoint Number. Bits 4..6b Reserved. Set to Zero Bits 7 Direction 0 = Out, 1 = In (Ignored for Control Endpoints) |
3 | bmAttributes | 1 | Bitmap | Bits 0..1 Transfer Type
01 = Isochronous 10 = Bulk 11 = Interrupt Bits 3..2 = Synchronisation Type (Iso Mode)
01 = Asynchronous 10 = Adaptive 11 = Synchronous
01 = Feedback Endpoint 10 = Explicit Feedback Data Endpoint 11 = Reserved |
4 | wMaxPacketSize | 2 | Number | Maximum Packet Size this endpoint is capable of sending or receiving |
6 | bInterval | 1 | Number | Interval for polling endpoint data transfers. Value in frame counts. Ignored for Bulk & Control Endpoints. Isochronous must equal 1 and field may range from 1 to 255 for interrupt endpoints. |
각 Endpoint 마다 Transer Type을 정의하고 Endpoint를 2 (In/Out)개 혹은 그 이상으로 정의하여 각각의 Stream Pipe 구성한다.
- USB Transfer Type은 총 4가지 종류
- Control Transfers: Control 하기위해 사용되며 Host에서 Device에게 명령전달
- Interrupt Transfers: 작은용량의 Data를 비동기적으로 받을경우 사용
- Isochronous Transfers: 시간에 제한되어지는 Device 사용되며, 대표적으로 telephony
- Bulk Transfers: 많은용량으로 사용할 경우 사용하며, 대표적으로 Mass Storage
Endpoint의 통신방식
http://www.beyondlogic.org/usbnutshell/usb4.shtml
http://www.jungo.com/st/support/documentation/windriver/10.2.1/wdusb_manual.mhtml/USB_data_transfer_types.html
- String Descriptor
Offset | Field | Size | Value | Description |
0 | bLength | 1 | Number | Size of Descriptor in Bytes |
1 | bDescriptorType | 1 | Constant | String Descriptor (0x03) |
2 | wLANGID[0] | 2 | number | Supported Language Code Zero (e.g. 0x0409 English - United States) |
4 | wLANGID[1] | 2 | number | Supported Language Code One (e.g. 0x0c09 English - Australian) |
n | wLANGID[x] | 2 | number | Supported Language Code x (e.g. 0x0407 German - Standard) |
Offset | Field | Size | Value | Description |
0 | bLength | 1 | Number | Size of Descriptor in Bytes |
1 | bDescriptorType | 1 | Constant | String Descriptor (0x03) |
2 | bString | n | Unicode | Unicode Encoded String |
- 더 자세한 내용은 아래사이트 (상위내용은 아래에서 참고)
http://www.beyondlogic.org/usbnutshell/usb5.shtml
USB의 SETUP Packet
http://www.beyondlogic.org/usbnutshell/usb6.shtml
10/15/2014
FILE SYSTEM의 수정 및 Script 수정 (정리가 필요)
1. 목적
기존 ODROID에서 사용하던 File system을 TI File system 으로 대체
ODROID는 FILE SYSTEM은 Ubuntu 을 TI Linux Embed File system으로 변경.
2. Script 및 Service on /off
2.1 Background
service를 제어를 하는데 있어서 현재 두가지 방법이 있으며, 관련 directory는 아래와 같다.
2.2 ubuntu
ex) S20xrdp : X의 remote disply 로 원격접속에 사용 이를 제거
ps --ppid 2 -p 2 --deselect (user process : 2 kthreadd)
http://askubuntu.com/questions/5039/what-is-the-difference-between-etc-init-and-etc-init-d
http://snoopybox.co.kr/1720
2.3 TI Filesystem
inittab 사용
3. 수정사항
1. /lib/module sync ( 기본 모듈 복사)
2. /dev sync ( 기존 dev 복사 )
3. /etc/inittab 수정 ( TI Filesystem 은 inittab 사용)
4. /etc/rc5.d ( 불필요한 서비스 제거 )
-
6. /lib/ld-linux-armhf.so.3 ( loader 복사 및 관련 lib 복사)
7. 연관된 프로그램 복사
http://onestep.tistory.com/78
기존 ODROID에서 사용하던 File system을 TI File system 으로 대체
ODROID는 FILE SYSTEM은 Ubuntu 을 TI Linux Embed File system으로 변경.
2. Script 및 Service on /off
2.1 Background
service를 제어를 하는데 있어서 현재 두가지 방법이 있으며, 관련 directory는 아래와 같다.
- /etc/init.d : System init tool 방식 기존 부터 존재하던 방식
- /etc/init : ubuntu 에서 적용하는 방식이며, 파일은 service의 설정파일
2.2 ubuntu
- 런레벨 설정
$ vi /etc/init/rc-sysinit.conf env DEFAULT_RUNLEVEL=2
- X Manager 제어
$ vi /etc/init/lightdm.conf start on ((filesystem and runlevel [!026] and started dbus and (drm-device-added card0 PRIMARY_DEVICE_FOR_DISPLAY=1 or stopped udev-fallback-graphics)) or runlevel PREVLEVEL=S)
- 기타 다른 제어 (/etc/init service 기능)
$ cd /etc/init $ grep -r runlevel .
- /etc/init.d 제어
ex) S20xrdp : X의 remote disply 로 원격접속에 사용 이를 제거
ps --ppid 2 -p 2 --deselect (user process : 2 kthreadd)
http://askubuntu.com/questions/5039/what-is-the-difference-between-etc-init-and-etc-init-d
http://snoopybox.co.kr/1720
2.3 TI Filesystem
inittab 사용
3. 수정사항
1. /lib/module sync ( 기본 모듈 복사)
2. /dev sync ( 기존 dev 복사 )
3. /etc/inittab 수정 ( TI Filesystem 은 inittab 사용)
sudo vi inittab S:2345:respawn:/sbin/getty 115200 ttySAC1 // kernel Arg 참조 // tty1-6 가상 console이므로, 속도는 상관없음
4. /etc/rc5.d ( 불필요한 서비스 제거 )
$ ls etc/rc5.d $ sudo vi ../init.d/mount-sdcard // 현재 UUID로 마운트 필요없는 부분제거
-
6. /lib/ld-linux-armhf.so.3 ( loader 복사 및 관련 lib 복사)
7. 연관된 프로그램 복사
http://onestep.tistory.com/78
10/14/2014
Linux debug ( syslogd vs klogd ) 소개
Linux debug ( syslogd vs klogd ) 소개
Log Server 로 File로 저장이 가능하여, Debug 정보를 저장이 가능하다.
http://blog.naver.com/PostView.nhn?blogId=dudwo567890&logNo=130158473389
http://dooeui.blogspot.kr/2010/04/linux-logging-syslogd-vs-klogd.html
http://reebok.tistory.com/entry/klogd-syslogd
Log Server 로 File로 저장이 가능하여, Debug 정보를 저장이 가능하다.
http://blog.naver.com/PostView.nhn?blogId=dudwo567890&logNo=130158473389
http://dooeui.blogspot.kr/2010/04/linux-logging-syslogd-vs-klogd.html
http://reebok.tistory.com/entry/klogd-syslogd
FILE SYSTEM의 IMAGE 수정 (추후 TEST 완료 후 삭제)
1. 목적
기존에 존재하던 image 파일을 수정하여 새로운 image 파일을 만드는 것이 목적.
기존에 존재하던 image 파일을 수정하여 새로운 image 파일을 만드는 것이 목적.
TI에서 제공하는 Filesystem 사용
2. Image 수정
FAT는 Boot file이기에 건들지 않고, Linux File system만 외부의 파일 system에서 가져와
새로 파티션을 만들어 수정한다.
2.1 각각의 Image 구성 확인
2.2 Image 수정
두번째 파티션 지우고 동시에 새로운 파티션을 만드며,각 사이즈를 정하고, Sector 크기를
2의 배수로 정한다. ( 1 Block이 2 Sector)
2.3 Image Resizing
위의 emmc_backup_2014_09_30.img 의 경우 아직 7818MB이며, 15269888 sectors 사용중 하지만 우리의 새로운 image의 end는
아래와 같이 dd 명령어를 사용해서, image를 resize를 한다.
마지막 sector가 1712089 이고 해서, 이를 짝수를 맞추고, 여분을 주기위해서, +1011줌.
현재 1 block = 2 sectors
* bs size에 속도차이가 심함
count 값은 위의 sectors 값을 반으로 나눈값 , bs를 변경 해도 됨
결과물로 test_newImage.img
3. Filesystem 복사
3.1 Filesystem 복사 방법
A. Mount 복사
skip = input block offset
seek = output block offset
위에서 에러가 나서, 그냥 dd로 전부 copy
B. dd를 이용하여 복사
위와 같이 여러번 했으나, 에러 발생으로 다른 방법시도
참조: http://forum.falinux.com/zbxe/index.php?document_srl=561988&mid=lecture_tip
C. mkfs.ext4 와 losetup 을 이용
* 에러 메시지를 보고, 안되는 이유가 파티션의 사이즈 배분을 잘못해서 문제생김.
3.2 File system 복사 ( Porting Qt 및 기타 사항)
3.3 SD 카드 이용시 할 경우
추후, TEST SD 카드 변경하여 아래와 같이 변경
- emmc_backup_2014_90_30.img의 filesystem을 지우고, TI-Filesystem 대체
- emmc_backup_2014_90_30.img resize
2. Image 수정
FAT는 Boot file이기에 건들지 않고, Linux File system만 외부의 파일 system에서 가져와
새로 파티션을 만들어 수정한다.
2.1 각각의 Image 구성 확인
- 각 구성은 1. boot 2. Linux filesystem 으로 구성
$ fdisk -l /media/sf_SHARED/emmc_backup_2014_09_30.img Disk /media/sf_SHARED/emmc_backup_2014_09_30.img: 7818 MB, 7818182656 bytes 255 heads, 63 sectors/track, 950 cylinders, total 15269888 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000c4046 Device Boot Start End Blocks Id System /media/sf_SHARED/emmc_backup_2014_09_30.img1 4096 266239 131072 b W95 FAT32 /media/sf_SHARED/emmc_backup_2014_09_30.img2 266240 11532287 5633024 83 Linux
2.2 Image 수정
두번째 파티션 지우고 동시에 새로운 파티션을 만드며,각 사이즈를 정하고, Sector 크기를
2의 배수로 정한다. ( 1 Block이 2 Sector)
$ fdisk /media/sf_SHARED/emmc_backup_2014_09_30.img Command (m for help): m Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only) Command (m for help): d Partition number (1-4): 2 Command (m for help): p Disk /media/sf_SHARED/emmc_backup_2014_09_30.img: 7818 MB, 7818182656 bytes 255 heads, 63 sectors/track, 950 cylinders, total 15269888 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000c4046 Device Boot Start End Blocks Id System /media/sf_SHARED/emmc_backup_2014_09_30.img1 4096 266239 131072 b W95 FAT32 Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p Partition number (1-4, default 2): 2 First sector (2048-15269887, default 2048): 266240 Last sector, +sectors or +size{K,M,G} (266240-15269887, default 15269887): 1712089 //1606499 -160650 = 1712089 Command (m for help): p Disk /media/sf_SHARED/emmc_backup_2014_09_30.img: 7818 MB, 7818182656 bytes 255 heads, 63 sectors/track, 950 cylinders, total 15269888 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000c4046 Device Boot Start End Blocks Id System /media/sf_SHARED/emmc_backup_2014_09_30.img1 4096 266239 131072 b W95 FAT32 /media/sf_SHARED/emmc_backup_2014_09_30.img2 266240 1712089 722925 83 Linux Command (m for help): w
2.3 Image Resizing
위의 emmc_backup_2014_09_30.img 의 경우 아직 7818MB이며, 15269888 sectors 사용중 하지만 우리의 새로운 image의 end는
아래와 같이 dd 명령어를 사용해서, image를 resize를 한다.
마지막 sector가 1712089 이고 해서, 이를 짝수를 맞추고, 여분을 주기위해서, +1011줌.
현재 1 block = 2 sectors
* bs size에 속도차이가 심함
count 값은 위의 sectors 값을 반으로 나눈값 , bs를 변경 해도 됨
$ dd if=/media/sf_SHARED/emmc_backup_2014_09_30.img of=/media/sf_SHARED/test_newImage.img bs=1k count=$(((1712089+1011)/2))
결과물로 test_newImage.img
3. Filesystem 복사
$ fdisk -l /media/sf_SHARED/test_newImage.img Disk /media/sf_SHARED/test_newImage.img: 877 MB, 877107200 bytes 255 heads, 63 sectors/track, 106 cylinders, total 1713100 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000c4046 Device Boot Start End Blocks Id System /media/sf_SHARED/test_newImage.img1 4096 266239 131072 b W95 FAT32 /media/sf_SHARED/test_newImage.img2 266240 1712089 722925 83 Linux
$ fdisk -l /media/sf_SHARED/TI-IMAGE.img Disk /media/sf_SHARED/TI-IMAGE.img: 3965 MB, 3965190144 bytes 255 heads, 63 sectors/track, 482 cylinders, total 7744512 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /media/sf_SHARED/TI-IMAGE.img1 * 63 144584 72261 c W95 FAT32 (LBA) /media/sf_SHARED/TI-IMAGE.img2 160650 1606499 722925 83 Linux /media/sf_SHARED/TI-IMAGE.img3 1606500 7743329 3068415 83 Linux
3.1 Filesystem 복사 방법
$ sudo mount -o loop,offset=$((512 * 266240)) /media/sf_SHARED/test_newImage.img ./tmp1 mount: wrong fs type, bad option, bad superblock on /dev/loop1, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so $ sudo mount -o loop,offset=$((512 * 160650)) /media/sf_SHARED/TI-IMAGE.img ./tmp2
skip = input block offset
seek = output block offset
위에서 에러가 나서, 그냥 dd로 전부 copy
B. dd를 이용하여 복사
$ dd if=/media/sf_SHARED/TI-IMAGE.img of=/media/sf_SHARED/test_newImage.img bs=512 skip=160650 seek=266240 count=$((1606499-160650))
위와 같이 여러번 했으나, 에러 발생으로 다른 방법시도
참조: http://forum.falinux.com/zbxe/index.php?document_srl=561988&mid=lecture_tip
C. mkfs.ext4 와 losetup 을 이용
$ sudo losetup -o$((512 * 266240)) /dev/loop0 /media/sf_SHARED/test_newImage.img //attach device $ sudo mkfs -t ext4 /dev/loop0 $ sudo losetup -d /dev/loop0 //detach device
$ sudo mount -o loop,offset=$((512 * 266240)) /media/sf_SHARED/test_newImage.img ./tmp1 EXT4-fs (loop0): bad geometry: block count 1408255 exceeds size of device (214137 blocks)
* 에러 메시지를 보고, 안되는 이유가 파티션의 사이즈 배분을 잘못해서 문제생김.
3.2 File system 복사 ( Porting Qt 및 기타 사항)
$ sudo mount -o loop,offset=$((512 * 266240)) /media/sf_SHARED/emmc_backup_2014_09_30.img ./tmp1 $ sudo mount -o loop,offset=$((512 * 160650)) /media/sf_SHARED/TI-IMAGE.img ./tmp2 $ cd tmp1 $ sudo rm -rf * $ sudo cp -a ../tmp2/* . $ cd usr/local $ sudo cp -a /usr/local/Qt-4.8.6 .
3.3 SD 카드 이용시 할 경우
추후, TEST SD 카드 변경하여 아래와 같이 변경
$ sudo mount -o loop,offset=$((512 * 266240)) /media/sf_SHARED/emmc_backup_2014_09_30.img ./tmp1 $ sudo mount -o loop,offset=$((512 * 160650)) /media/sf_SHARED/TI-IMAGE.img ./tmp2 $ sudo umount tmp1 tmp2 1. lib/module 복사 2. dev 복사 3. etc/rc5.d 수정 S02dbus-1 S20netperf S20syslog S90mount-sdcard S98parse-ip 4. sudo vi inittab //commnad line보고 수정, tty1 가상 console S:2345:respawn:/sbin/getty 115200 ttySAC1 5. sudo vi ../init.d/mount-sdcard // 현재 UUID로 마운트 필요없는 부분제거 6. /lib/ld-linux-armhf.so.3 loader 복사 7. QT 복사 8. EMA 복사 9. sudo ln -s libcmirisLib2_arm_2.1.3.so libcmirisLib2_arm_2.1.1.so //usr/local/lib export LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/Qt-4.8.6/lib:/usr/local/lib export QWS_DISPLAY="LinuxFb:/dev/fb6" export PATH=$PATH:/usr/local/bin TEST cd /usr/local/ ./deform -qws -display LinuxFb:/dev/fb6
10/12/2014
Kernel의 printk debug-2
1. User에서 Printk 관련설정
User에서 printk 설정 세부 확인
상위를 보면 숫자 4개가 나오며 각각의 의미는 아래와 같다.
These values influence printk() behavior when printing or logging error messages, which come from inside the kernel.
See syslog(2) for more information on the different log levels.
# cat /proc/sys/kernel/printk
기본 설정: 6 4 1 7
Kernel Message 막기 위해서 아래와 같이 설정
# echo "0 4 1 7" > /proc/sys/kernel/printk
# echo 0 > /proc/sys/kernel/printk
1.1 Kernel message 보기
# dmesg
혹은 klogd을 죽이고
#cat /proc/kmsg
https://elinux.org/Debugging_by_printing
User에서 printk 설정 세부 확인
$ cat /proc/sys/kernel/printk // printk 설정 및 보기
상위를 보면 숫자 4개가 나오며 각각의 의미는 아래와 같다.
- console_loglevel,
- default_message_loglevel,
- minimum_console_level
- default_console_loglevel respectively.
These values influence printk() behavior when printing or logging error messages, which come from inside the kernel.
See syslog(2) for more information on the different log levels.
- /proc/sys/kernel/console_loglevel
- /proc/sys/kernel/default_message_level
- /proc/sys/kernel/minimum_console_loglevel
- /proc/sys/kernel/default_console_loglevel
# cat /proc/sys/kernel/printk
기본 설정: 6 4 1 7
Kernel Message 막기 위해서 아래와 같이 설정
# echo "0 4 1 7" > /proc/sys/kernel/printk
# echo 0 > /proc/sys/kernel/printk
1.1 Kernel message 보기
# dmesg
혹은 klogd을 죽이고
#cat /proc/kmsg
https://elinux.org/Debugging_by_printing
10/03/2014
Linux의 udev 와 sys filesystem 이해 (수정 및 정리-1)
1. Background
가끔 udevd 없는 filesystem이 존재하여, 매번 자동화의 필요성을 느끼며, Kernel 의 sys filesystem 및 udevd의 기능을 필요로 하여 관련부분을 정리하고자 한다.
오래전에는 Application 에서 Driver의 상태의 알어서 HW 이벤트 알고 다시 다른 Driver를 제어하려면
항상 애플리케이션 프로그램과 통신을 해서 알아내고 제어를 해야만 했다.
하지만, udev와 sys filefs가 나온 이후로 이 문제들이 간단히 해결이 되고 관리가 편해졌다.
간단한 예가 usb의 hotplug일 것이며, 이를 확장해서 사용도 가능하다.
1.1 NETLINK의 이해
udev에서 Kernel과 UserInterface 사이를 쉽게 통신하기위해서 사용되는 IPC로 사용방법은 socket으로 사용하고, 중요한 것은 udev의 uevent의 전달일 것 같다.
protocol은 NETLINK_xxx 로 다양하게 지원하며, uevent는 NETLINK_KOBJECT_UEVENT
Netlink 사용방법 및 세부내용은 아래의 사이트 참고
https://en.wikipedia.org/wiki/Netlink
https://yhcting.tistory.com/entry/Linux-kobject-uevent-in-kernel
https://stackoverflow.com/questions/3299386/how-to-use-netlink-socket-to-communicate-with-a-kernel-module
https://gist.github.com/JeonghunLee/17db624665da91ee46c221b00e2b93f5
https://elixir.bootlin.com/linux/v4.2/source/lib/kobject_uevent.c#L386
https://elixir.bootlin.com/linux/v4.2/source/lib/kobject_uevent.c#L414
http://egloos.zum.com/furmuwon/v/11024590
1.2 D-BUS
기본적인 동작형태는 D-Bus Instance와 중개자인 D-BUS Damon과 Socket으로 연결형태라고 생각하면된다.
아래에서 제공해주는 그림을 보면 쉽게 이해가 간다.
세부내용은 Wiki 참고
https://en.wikipedia.org/wiki/D-Bus
https://www.freedesktop.org/wiki/Software/dbus/
https://dbus.freedesktop.org/doc/api/html/group__DBusMessage.html
http://makersweb.net/lecture/16441
1.3 sysfs 의 이해
sysfs는 system filesystem의 약어이며, 이를 이용하여, USER에서 device driver의 상태확인 및 제어 쉽게 가능하다
Kernel에서 만들어주는 Filesystem이기에, 각 Device driver에서 제공을 해주어야 하며,실제 Filesystem에서는 sysfs로 mount만 해주면 동작이 된다.
기존 /proc 와 다른 점은 /proc의 경우 상태확인만 가능했지만, /sys는 설정가능하다.
대표적인 예로 GPIO 설정을 쉽게 User에서 쉽게 변경가능하지만, Device Driver에서 제공을 해주어야하기에, Device Driver 마다 사용법이 다를 수 있다.
https://en.wikipedia.org/wiki/Sysfs
sys filesystem의 실제 사용의 예제
http://processors.wiki.ti.com/index.php/DSS2_SYSFS_Examples
1.4 udev의 기본이해
udev는 userspace 의 /dev로 주로 hotplug 와 hw event에 주로 사용되며, /dev 의 deivce node를 관리를 주목적으로 한다.
Linux device driver에 특정 HW event (hotplug)가 발생하면, User에서는 /dev의 device node를 필요시 새로 생성할 필요가 있다.
Kernel에서는 Netlink로 User에게 uevent를 전달하면, udevd에서 새로운 /dev/의 device node를 생성가능 하며,
그리고 더불어 User에서 정한 udev rule에 의해서
udev 는 NETLINK 통신하여 uevent를 받아 udev의 rule에 맞게 적용을 된 부분을 D-BUS를 이용하여 통신한다.
(netlink socket) (libudev를 사용한 damon )
-->-->
https://docs.oracle.com/cd/E37670_01/E41138/html/ch07s03.html
https://access.redhat.com/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Logical_Volume_Manager_Administration/udev_device_manager.html
http://chaoxifer.egloos.com/viewer/1752706 (USB Auto mount)
https://code.google.com/p/yad/wiki/USBFlash
http://www.hanbit.co.kr/network/view.html?bi_id=1425
https://access.redhat.com/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Logical_Volume_Manager_Administration/udev_device_manager.html#tb-udev-for-devicemap
2. udev 와 sysfs의 기본동작
http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/
http://dynamicbu.egloos.com/m/3048465
그림은 상위 두가지 루틴을 다 설명해주며, 핵심은 udev event process이다.
아래의 기본구조를 이해를 Driver 순서부터 보는 것이 좋고, uevent라는 HW Event message로 udevd이 이를 관리하고, udev event process에 전달하는 것이다.
이는 /etc/udev/rules.d/에서 설정 및 관리가 가능하다.
구조파악하기가 쉬움
http://sonseungha.tistory.com/323
2.1 sysfs와 udev Kernel 실제동작예
아래는 rtc driver의 udev 와 sys file system 의 좋은 예제이며, uevent의 봐야할 부분은 kobject_uevent_env 부분을 보면 기본동작이 이해가 간다
/proc/sys/kernel/hotplug 이 부분도 연관이 있다고 하는데, 이부분은 추후파악
udev 및 udevadm 사용 및 rule 관련내용
https://wiki.archlinux.org/index.php/udev
udev와 sysfs 관련 분석
http://furmuwon.egloos.com/m/11024590
http://www.troot.co.kr/tc/1958
https://stackoverflow.com/questions/36009559/sd-card-how-to-force-the-kernel-to-read-the-wp-pin-again-without-removing-the-s
https://www.pks.mpg.de/~mueller/docs/suse10.1/suselinux-manual_en/manual/cha.udev.html
3. udev의 device 설정
아래와 같이 설정추가
가끔 udevd 없는 filesystem이 존재하여, 매번 자동화의 필요성을 느끼며, Kernel 의 sys filesystem 및 udevd의 기능을 필요로 하여 관련부분을 정리하고자 한다.
오래전에는 Application 에서 Driver의 상태의 알어서 HW 이벤트 알고 다시 다른 Driver를 제어하려면
항상 애플리케이션 프로그램과 통신을 해서 알아내고 제어를 해야만 했다.
하지만, udev와 sys filefs가 나온 이후로 이 문제들이 간단히 해결이 되고 관리가 편해졌다.
간단한 예가 usb의 hotplug일 것이며, 이를 확장해서 사용도 가능하다.
1.1 NETLINK의 이해
udev에서 Kernel과 UserInterface 사이를 쉽게 통신하기위해서 사용되는 IPC로 사용방법은 socket으로 사용하고, 중요한 것은 udev의 uevent의 전달일 것 같다.
- NETLINK의 사용방식 및 구조
int socket(AF_NETLINK, SOCK_DGRAM ''or'' SOCK_RAW, ''protocol'')
protocol은 NETLINK_xxx 로 다양하게 지원하며, uevent는 NETLINK_KOBJECT_UEVENT
Netlink 사용방법 및 세부내용은 아래의 사이트 참고
https://en.wikipedia.org/wiki/Netlink
https://yhcting.tistory.com/entry/Linux-kobject-uevent-in-kernel
- NETLINK의 Kernel 과 User 실제사용의 예
- NETLINK 테스트 Instruction
- NETLINK TEST Kernel Module (protocl: NETLINK_USER 사용)
- NETLINK TEST User Interface (socket(PF_NETLINK, SOCK_RAW, NETLINK_USER) 사용)
https://stackoverflow.com/questions/3299386/how-to-use-netlink-socket-to-communicate-with-a-kernel-module
https://gist.github.com/JeonghunLee/17db624665da91ee46c221b00e2b93f5
- Kernel의 uevent 의 이해
https://elixir.bootlin.com/linux/v4.2/source/lib/kobject_uevent.c#L386
https://elixir.bootlin.com/linux/v4.2/source/lib/kobject_uevent.c#L414
http://egloos.zum.com/furmuwon/v/11024590
1.2 D-BUS
기본적인 동작형태는 D-Bus Instance와 중개자인 D-BUS Damon과 Socket으로 연결형태라고 생각하면된다.
아래에서 제공해주는 그림을 보면 쉽게 이해가 간다.
세부내용은 Wiki 참고
https://en.wikipedia.org/wiki/D-Bus
https://www.freedesktop.org/wiki/Software/dbus/
https://dbus.freedesktop.org/doc/api/html/group__DBusMessage.html
http://makersweb.net/lecture/16441
1.3 sysfs 의 이해
sysfs는 system filesystem의 약어이며, 이를 이용하여, USER에서 device driver의 상태확인 및 제어 쉽게 가능하다
Kernel에서 만들어주는 Filesystem이기에, 각 Device driver에서 제공을 해주어야 하며,실제 Filesystem에서는 sysfs로 mount만 해주면 동작이 된다.
기존 /proc 와 다른 점은 /proc의 경우 상태확인만 가능했지만, /sys는 설정가능하다.
대표적인 예로 GPIO 설정을 쉽게 User에서 쉽게 변경가능하지만, Device Driver에서 제공을 해주어야하기에, Device Driver 마다 사용법이 다를 수 있다.
https://en.wikipedia.org/wiki/Sysfs
sys filesystem의 실제 사용의 예제
http://processors.wiki.ti.com/index.php/DSS2_SYSFS_Examples
1.4 udev의 기본이해
udev는 userspace 의 /dev로 주로 hotplug 와 hw event에 주로 사용되며, /dev 의 deivce node를 관리를 주목적으로 한다.
Linux device driver에 특정 HW event (hotplug)가 발생하면, User에서는 /dev의 device node를 필요시 새로 생성할 필요가 있다.
Kernel에서는 Netlink로 User에게 uevent를 전달하면, udevd에서 새로운 /dev/의 device node를 생성가능 하며,
그리고 더불어 User에서 정한 udev rule에 의해서
udev 는 NETLINK 통신하여 uevent를 받아 udev의 rule에 맞게 적용을 된 부분을 D-BUS를 이용하여 통신한다.
- udev의 기본동작
(netlink socket) (libudev를 사용한 damon )
-->-->
- udev의 daemon과 에 관련 tool
- libudev : systemd 이 사용이 하며, d-bus를 이용하기 위해서 사용되어짐.
- udevd : user 영역에서 virtual /dev를 관리하며 netlink로 통신하며, uevent를 감지
- udevadm : 진단목적으로 만들어진 utility 라고 한다.
- udev의 Rules
- /lib/udev/rules.d/ -규칙은 각각의 꾸러미가 설치하며, 보통 사용자가 바꾸어선 안됩니다.
- /etc/udev/rules.d/ - 최종유저가 설정한 규칙이 이라고하며, 새로운 규칙은 이곳에해야한다
- 기본사항 참고
- Kernel 설정 및 기본설정방법 참고
- /lib/udev/rules.d Manual 및 설정의 예 관련사항
https://docs.oracle.com/cd/E37670_01/E41138/html/ch07s03.html
https://access.redhat.com/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Logical_Volume_Manager_Administration/udev_device_manager.html
http://chaoxifer.egloos.com/viewer/1752706 (USB Auto mount)
https://code.google.com/p/yad/wiki/USBFlash
http://www.hanbit.co.kr/network/view.html?bi_id=1425
https://access.redhat.com/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Logical_Volume_Manager_Administration/udev_device_manager.html#tb-udev-for-devicemap
2. udev 와 sysfs의 기본동작
- udev를 이용하여, sysfs를 이용하는 방법
- udev를 이용하여 application에서 감지
- 동작-1 udevd과 Application 에서 감지
- device driver는 netlink를 이용하여 uevent를 발생
- udevd는이를 감지하고 알아내고, 중복 uevents 들을 삭제한다.
- udevd는 이 udev event process 에게 전달한다
- /xxx/udev/rules.d rules을 memory에 저장 및 parsing하여 rule 적용후 udev database 생성
- 이를 d-bus를 이용하여 다른 App들에게 공유한다.
- 최종 application은 d-bus를 통해 이를 감지하고 동작한다.
- 동작-2 sysfs 동작
- Kernel은 kobject_create 만들고 이를 sysfs를 속성 및 uevent 정보 생성 (/dev 관련정보)
- uevent를 발생되면 sysfs 정보를 이용하여 /dev에 device node를 추가
http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/
http://dynamicbu.egloos.com/m/3048465
그림은 상위 두가지 루틴을 다 설명해주며, 핵심은 udev event process이다.
출처: http://blogas.sysadmin.lt/?p=141 |
아래의 기본구조를 이해를 Driver 순서부터 보는 것이 좋고, uevent라는 HW Event message로 udevd이 이를 관리하고, udev event process에 전달하는 것이다.
이는 /etc/udev/rules.d/에서 설정 및 관리가 가능하다.
구조파악하기가 쉬움
http://sonseungha.tistory.com/323
2.1 sysfs와 udev Kernel 실제동작예
아래는 rtc driver의 udev 와 sys file system 의 좋은 예제이며, uevent의 봐야할 부분은 kobject_uevent_env 부분을 보면 기본동작이 이해가 간다
- user에서 rtc module 커널에 등록
- rtc_init 함수는 misc_register->class_device_register를 호출
- kobject_add 후 /sys/class/misc/rtc 의 base directory 생성
- /sys/class/misc/rtc/uevent 생성 ( device name or interface 제공 )
- /sys/class/misc/rtc/dev 생성 ( /dev/rtc의 major/minor number 제공)
- kobject_uevent->kobject_uevent_env 호출되어 uevent의 환경설정과 uevent발생
- netlink에 의해 uevent 함께 환경값이 udevd에 의해 /dev/rtc 생성 (4번 ,5번정보)
- 설정된 uevent 환경값을 udev rule에 적용하여 추가동작
/proc/sys/kernel/hotplug 이 부분도 연관이 있다고 하는데, 이부분은 추후파악
출처: http://www.embeddedlinux.org.cn/EssentialLinuxDeviceDrivers/final/ch04lev1sec3.html |
udev 및 udevadm 사용 및 rule 관련내용
https://wiki.archlinux.org/index.php/udev
udev와 sysfs 관련 분석
http://furmuwon.egloos.com/m/11024590
- udev의 정보확인방법
$ udevadm info -a -n /dev/sda1 looking at device '/devices/platform/s5p-ehci/usb1/1-2/1-2.3/1-2.3.3/1-2.3.3:1.0/host0/target0:0:0/0:0:0:0/block/sda/sda1': KERNEL=="sda1" SUBSYSTEM=="block" DRIVER=="" ATTR{partition}=="1"
http://www.troot.co.kr/tc/1958
https://stackoverflow.com/questions/36009559/sd-card-how-to-force-the-kernel-to-read-the-wp-pin-again-without-removing-the-s
https://www.pks.mpg.de/~mueller/docs/suse10.1/suselinux-manual_en/manual/cha.udev.html
3. udev의 device 설정
아래와 같이 설정추가
$ vi /etc/udev/rules.d/10-usbdisk.rules .... SUBSYSTEMS="usb", ENV{ID_FS_USAGE}=="filesystem", ENV{UDISKS_MOUNT_OPTIONS}="rw" ....
피드 구독하기:
글
(
Atom
)