12/02/2018

ltrace

1. ltrace 의 기능 

대부분 Ubuntu에 기본으로 설치가 되어있는 것으로 보이며, 동적라이브러리를 추적할때 사용한다고 한다. 
주목적은 shared library 추적이며, dlopen시 마다 이를 hooking해서 추적한다. 

ltrace의 기능소개 
  https://en.wikipedia.org/wiki/Ltrace

  • 기본설치 
$ sudo apt install ltrace

  • 기본사용법
$ ltrace --help
Usage: ltrace [option ...] [command [arg ...]]
Trace library calls of a given program.

  -a, --align=COLUMN  align return values in a secific column.
  -A MAXELTS          maximum number of array elements to print.
  -b, --no-signals    don't print signals.
  -c                  count time and calls, and report a summary on exit.
  -C, --demangle      decode low-level symbol names into user-level names.
  -D, --debug=MASK    enable debugging (see -Dh or --debug=help).
  -Dh, --debug=help   show help on debugging.
  -e FILTER           modify which library calls to trace.
  -f                  trace children (fork() and clone()).
  -F, --config=FILE   load alternate configuration file (may be repeated).
  -h, --help          display this help and exit.
  -i                  print instruction pointer at time of library call.
  -l, --library=LIBRARY_PATTERN only trace symbols implemented by this library.
  -L                  do NOT display library calls.
  -n, --indent=NR     indent output by NR spaces for each call level nesting.
  -o, --output=FILENAME write the trace output to file with given name.
  -p PID              attach to the process with the process ID pid.
  -r                  print relative timestamps.
  -s STRSIZE          specify the maximum string size to print.
  -S                  trace system calls as well as library calls.
  -t, -tt, -ttt       print absolute timestamps.
  -T                  show the time spent inside each call.
  -u USERNAME         run command with the userid, groupid of username.
  -V, --version       output version information and exit.
  -x FILTER           modify which static functions to trace.

Report bugs to ltrace-devel@lists.alioth.debian.org

  • 현재 동작 중인 Process 기본분석 
/proc의 기본정보를 이용하여 ELF 정보를 비롯하여 Map 정보등 세세한 정보를 얻을 수 있다

$ ps -aux   //현재 동작 중인 Process 확인 
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
....
systemd+     713  0.0  0.0  90456  6336 ?        Ssl   5월21   0:01 /lib/systemd/systemd-timesyncd
...
$ sudo cat /proc/713/maps  // 보고자하는 PID의 MAP 확인 (사용되어지는 공유 Library 확인)
...
7fe6e9dfa000-7fe6e9dfc000 rw-p 00000000 00:00 0
7fe6e9dfc000-7fe6e9e24000 r--p 00000000 08:15 2367775                    /usr/lib/x86_64-linux-gnu/libseccomp.so.2.4.3
7fe6e9e24000-7fe6e9e2f000 r-xp 00028000 08:15 2367775                    /usr/lib/x86_64-linux-gnu/libseccomp.so.2.4.3
7fe6e9e2f000-7fe6e9e33000 r--p 00033000 08:15 2367775                    /usr/lib/x86_64-linux-gnu/libseccomp.so.2.4.3
7fe6e9e33000-7fe6e9e4e000 r--p 00036000 08:15 2367775                    /usr/lib/x86_64-linux-gnu/libseccomp.so.2.4.3
7fe6e9e4e000-7fe6e9e4f000 rw-p 00051000 08:15 2367775                    /usr/lib/x86_64-linux-gnu/libseccomp.so.2.4.3
7fe6e9e4f000-7fe6e9e52000 r--p 00000000 08:15 2361499                    /usr/lib/x86_64-linux-gnu/librt-2.31.so
7fe6e9e52000-7fe6e9e56000 r-xp 00003000 08:15 2361499                    /usr/lib/x86_64-linux-gnu/librt-2.31.so
......

$ sudo cat /proc/713/status  // Process 상태확인 
Name:   systemd-timesyn
Umask:  0022
State:  S (sleeping)
Tgid:   713
Ngid:   0
Pid:    713
PPid:   1
TracerPid:      0
Uid:    102     102     102     102
Gid:    104     104     104     104
FDSize: 64
Groups: 104
NStgid: 713
NSpid:  713
NSpgid: 713

$ sudo readelf -h /proc/713/exe    // 실행중인 파일 ELF의 포맷확인 및 기본정보확인
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
.....

$ sudo readelf -s /proc/713/exe    // 실행중인 파일의 ELF에서 symbol table 확인   

Symbol table '.dynsym' contains 108 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND getegid@GLIBC_2.2.5 (2)
     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __errno_location@GLIBC_2.2.5 (2)
     3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND config_parse_sec@SD_SHARED (3)
     4: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND sendto@GLIBC_2.2.5 (2)
     5: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND bind@GLIBC_2.2.5 (2)
     6: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND sd_event_loop@SD_SHARED (3)
     7: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND socket@GLIBC_2.2.5 (2)
     8: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND recvmsg@GLIBC_2.2.5 (2)
     9: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND log_assert_failed_unreach@SD_SHARED (3)
..........

  • ltrace 기본사용법 
우선 ps로 CPU를 가장 많이 사용하는 PID를 사용하여 각 상태를 확인을 하자. 
아래와 같이 너무 많이 호출되어지기 때문에 특정함수만 검색하고 싶다면 상위 -e 옵션추가

$ ps -aux    //CPU를 가장 많이 이용하는 PID 찾기 
......

$ sudo ltrace -p 2025 -i     //ltrace로 pid 추적 timestamp 이용 
[0x138e9a5] __errno_location()                                                                                                   = 0x7afe3648
[0x138e9a5] __errno_location( unfinished ...
[0x138e31c] clock_gettime(1, 0x7afdfd30, 0x7afdfd30, 0x7b10b5ce)                                                                 = 0
[0x138e9a5] ... __errno_location resumed )                                                                                     = 0x7fbd7afe46c8
......

$ sudo ltrace -p 7026 -t     //ltrace로 pid 추적 timestamp 이용 
13:42:24 __errno_location( unfinished ...
13:42:24 __errno_location( unfinished ...
13:42:24 ... __errno_location resumed )                                                                                        = 0x482ea648
13:42:24 ... __errno_location resumed )                                                                                        = 0x7fd2482eb6c8
13:42:24 clock_gettime(1, 0x482e6d30, 0x482e6d30, 0x484125ce unfinished ...
13:42:24 clock_gettime(1, 0x7ffec722d690, 0x7ffec722d690, 0x7fd2484125ce unfinished ...
13:42:24 ... clock_gettime resumed )                                                                                           = 0
13:42:24 ... clock_gettime resumed )
..............


참고자료 
  https://jiming.tistory.com/237
 
debugfs
  https://m.blog.naver.com/PostView.nhn?blogId=dudwo567890&logNo=130156521971&proxyReferer=https%3A%2F%2Fwww.google.com%2F

11/18/2018

cron 과 anacron

1. cron  란?

반복적인 작업을 해야할 경우가 필요해져서  cron 이라는  damon 을 알게되었고 간단히 사용법을 정리한다.

1.1 cron 의 기본사용법

우선 아래와 같이 cron이 존재하는지와 디렉토리가 존재하는지 확인하자.
그리고, 개별 디렉토리에 각각의 shell script or link가 존재할 것이다.
만약 본인이 원하는 script가 하루에 한번 or 한시간에 한번 실행되기 바란다면 shell script작성한 후  아래의 디렉토리에 추가하면된다.

  1. cron.hourly  : 시간마다 실행
  2. cron.daily   :  일마다 실행
  3. cron.weekly : 1주일 마다 실행
  4. cron.monthly : 1달 마다 실행

$ ps aux | grep cron

$ ls /etc/cron*
/etc/crontab

/etc/cron.d:
anacron  popularity-contest

/etc/cron.daily:
0anacron  apt-compat    cracklib-runtime  google-chrome  man-db   passwd              samba                   upstart
apport    bsdmainutils  dpkg              logrotate      mlocate  popularity-contest  update-notifier-common

/etc/cron.hourly:

/etc/cron.monthly:
0anacron

/etc/cron.weekly:
0anacron  fstrim  man-db  update-notifier-common


1.2 cron shell script 작성예제

1시간 마다 실행할 shell script을 만든다고 가정하고 작성해보자.
좀 더 자세히 작성하고자 하면, 반드시 if를 넣어 실행될 조건을 찾아서 넣자.

$ sudo vi /etc/cron.hourly/chksize
#!/bin/sh

MY_PATH=/home/pi
LOG_PATH=$MY_PATH/log
LOG=$LOG_PATH/cron_$(date +%Y%m%d-%H%M-%S).log

time=$(date "+%Y-%m-%d %H:%M:%S")
echo "Check My SD Disk" >> $LOG
echo $time >> $LOG
REMAIN=`df | awk 'NR == 2 {print $4}'`
echo $REMAIN >> $LOG
echo "" >> $LOG
echo " TEST"

$ sudo chmod +x /etc/cron.hourly/chksize  // 실행추가 

Shell Script을 작성후 1시간을 기다릴수 없으므로, 직접 hourly 관련된 script를 전체 실행해보자.


  • 작성된 shell script TEST
$ sudo run-parts --report /etc/cron.hourly  // TEST 
/etc/cron.hourly/chksize:
TEST

LOG도 기록이 되고 있기 때문에 좋지만, Log 파일은 하나로 만드는 것이 좋겠다.
상위 Shell Script을 추후 수정

  • Shell Script 사용시 주의사항 
  1. #!/bin/sh  반드시 추가 
  2. 실행하는 주체가 root 이므로 $HOME 과 같은 본인의 USER를 사용하지 말자.
  3. chmod +x 실행모드 추가해야 실행됨  

1.3 cron의 세부 설정 및 구조 

cron의 구조를 살펴보고 이해하자.

$ vi /etc/crontab             
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )


  1. m : minute 0~59
  2. h : hour 0~23
  3. dom: day of month (1 ~30 설정)
  4. mon:  month 몇월에 실행할지도 설정가능  (1~12 or May )
  5. dow:  day of week (1~7 or Sun)
  6. user : root 동일 
  7. command :  test -x 실행가능한지 확인하고, run-parts로 실행 

만약 본인이 원하는 cron.directory를 추가하고 만들수도 있다.
  https://webdir.tistory.com/175

  • crontab을 이용한 세부설정 

$ crontab -e 
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# m h  dom mon dow   command
0 10 * * * /etc/cron.hourly/chksize

  https://jdm.kr/blog/2

anacron은 정확한 시각에 작업을 실행하는 용도가 아니라, 매일/매주/매달의 작업을 실행하기위해서 만들어졌다고 한다.
damon process가 존재하지 않으며, 상위 cron에서 정기적으로 실행되는 구조로 동작된다고하며, 분산화를 위해 사용한다고 한다.


$ vi /etc/anacrontab 
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root

# These replace cron's entries
1       5       cron.daily      run-parts --report /etc/cron.daily
7       10      cron.weekly     run-parts --report /etc/cron.weekly
@monthly        15      cron.monthly    run-parts --report /etc/cron.monthly


  https://soooprmx.com/archives/6786


11/09/2018

Unit Test

최근 TDD(Test Driven Development)에 관심이 많아서 이 관련된 책을 봤지만, 추후 다시 적용하여 개발할 경우 이때 다시 정리하자.

  https://en.wikipedia.org/wiki/Test-driven_development

UnitTest

  https://en.wikipedia.org/wiki/Unit_testing
  https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%9B_%ED%85%8C%EC%8A%A4%ED%8A%B8
  https://github.com/google/googletest


Unit TEST 의 종류

  https://www.guru99.com/unit-testing-guide.html
  https://www.guru99.com/integration-testing.html

xUnit frameworks

  https://en.wikipedia.org/wiki/List_of_unit_testing_frameworks

10/12/2018

dd 와 hd/hexdump 사용법

1. dd 명령어

일반적으로 리눅스에서 block device의 data를 backup or data를 block device에 저장할때 주로 많이 사용이 되어지며, 본인이 원하는 image file을 생성시 사용된다.

사용법은 입력과 출력을 정하고 본인이 원하는 옵션을 넣어 복사를 진행한다. 그리고 복사되는 시간을 알려준다.


1.1 dd의 기본사용법 

dd의 기본사용법 아래와 같은 방법으로 사용

$ dd if=(input file)  of=(output file) bs=(block size) skip=(input offset) seek=(output offset) conv=(conversion) 
$ dd if=test1 | cat          // 파이프 사용 stdout   
$ cat test1   | dd of=test2 //  파이프 사용 stdin  

bs는 2의 지수이며, 일반적으로 512단위로 사용 (ie, 512, 1024, 2048, 4096, 8192, 16384)



1.2  dd의 세부옵션  


주요 옵션은 다음과 같으며, 자세한 정보를 알고 싶으면, $man dd 로 알아보자.

OPERAND DESCRIPTION
bs=BYTES read and write up to BYTES bytes at a time (한번에 사용가능 Block Size 설정 in/out)
conv=CONVS convert the file as per the comma separated symbol list (옵션은 아래 참조)
count=N copy only N input blocks (default: 512 , 상위 bs 변경가능)
ibs=BYTES read up to BYTES bytes at a time (default: 512) 상위 bs의 input 세부설정
if=FILE read from FILE instead of stdin (Input File)
iflag=FLAGS read as per the comma separated symbol list
obs=BYTES write BYTES bytes at a time (default: 512) 상위 bs의 output 세부설정
of=FILE write to FILE instead of stdout (Onput File)
oflag=FLAGS write as per the comma separated symbol list
seek=N skip N obs-sized blocks at start of output (output 의 offset 기능 ,단위는 상위 bs,obs)
skip=N skip N ibs-sized blocks at start of input (input 의 offset 기능 ,단위는 상위 bs,ibs)


  1. N은 Block의 갯수 
  2. bs/ibs/obs는 Block의 크기 결정 (default:512)

  • N/BYTES 에 사용되는 suffix
N/BYTE의 suffix 단위Bytes
c1
w2
b512
K1024
kB1000
M1024*1024
MB1000*1000
G1024*1024*1024
xM1000*1000*1000

  • conv 옵션
CONVS DESCRIPTION
nocreat do not create the output file
notrunc do not truncate the output file (output file를 크기 줄이지 않고 유지)
noerror continue after read errors
fdatasync physically write output file data before finishing

  • iflag/oflag 옵션 
FLAG DESCRIPTION
dsync use synchronized I/O for data
sync dsync기능과 metadata도 포함 (MBR)
noerror continue after read errors
count_bytes treat 'count=N' as a byte count (iflag only)
skip_bytes treat 'skip=N' as a byte count (iflag only)
seek_bytes treat 'seek=N' as a byte count (oflag only)


1.3 MBR의 구성

Master Boot Record 약자이며 MBR 은 1 Sector (512 Byte)에 존재하며, 구조는 wiki를 보면 설명이 자세히 나온다.
이는 fdisk 와 parted 방식으로 사용할 경우 각각의 MBR이 조금씩 다른것으로 파악됨 

  • Classical generic MBR구성 (fdisk 사용할 경우)
  1. 446 bytes bootstrap 
  2. 064 bytes Partition table(16bytes x 4)
  3. 002 bytes Signature (0x55 0xAA)

MBR 구성
  https://en.wikipedia.org/wiki/Master_boot_record
  https://ko.wikipedia.org/wiki/%EB%A7%88%EC%8A%A4%ED%84%B0_%EB%B6%80%ED%8A%B8_%EB%A0%88%EC%BD%94%EB%93%9C

GPT (parted 기반구성)
  https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface


1.4. dd의 기본사용법 


  • 자주사용하는 장치 FILE
  1. /dev/zero  : 0값 
  2. /dev/random : random 값
  3. /dev/urandom : random 값
  4. /dev/null   : remove
  5. /dev/sdx(a,b,c,d)   : SATA Device   (1st,2nd,3st,4st)
  6. /dev/sda(1,2,3,4)   : SATA Partition (1st,2nd,3st,4st)
  7. /dev/mmcblkx(0,1,2) : SD Card Device   (1st,2nd,3st,4st)  
  8. /dev/mmcblkxp(0,1,2) : SD Card Partition (1st,2nd,3st,4st) 
  9. /dev/mem  : memory map I/O ( offset: virtual address)
  10. /dev/loop(0,12,3): loop device  


  https://ko.wikipedia.org/wiki//dev/random
  https://www.ibm.com/support/knowledgecenter/en/ssw_aix_72/com.ibm.aix.files/mem.htm
  
  • losetup 기본 사용법
간단하게 loop device를 이용하여 image를 만들고자 할때 많이 사용하여, 이와 함께 dd /fdisk/ mount를 이용하여 세부구성한다.
//losetup은 attach 를 한 후 반드시 사용 후 detach
$ sudo losetup /dev/loop0 ./data.img          //attach device ( data.img는 /dev/loop0를 통해 접근가능)
$ sudo losetup -a                             //현재 연결된 loop device 확인  
....    // fdisk or dd or mount를 이용하여 /dev/loop0으로 접근하여 data.img를 구성 
$ sudo losetup -d /dev/loop0                  //detach device ( data.img 와 /dev/loop0 연결끊음)

//losetup은 attach 를 하지만 offset를 정해서 사용
$ sudo losetup -o0 /dev/loop0 ./data.img     //attach device (offset 0 byte에 연결) 
....
$ sudo losetup -d /dev/loop0                 //detach device


$ sudo losetup -e des /dev/loop0 ./data.img   //attach device 와 encrytion 함
....
$ sudo losetup -d /dev/loop0




  • 일반적인 장치 복사 및 Backup 
$ dd if=/dev/sda of=/dev/sdb bs=4096 conv=noerror,sync    //SDA 장치 전부 
$ dd if=/dev/mmcblk0 of=/dev/mmcblk1 bs=4096 conv=noerror,sync         //mmcblk0 장치전부

//한번에 4096 byte씩 input 에서 읽어서 output 전송 , 물론 output은 input보다 작으면 안된다.

$ dd if=/dev/sda1 of=sda1.img      // sda 1st partition , Backup  

$ dd if=sda.img of=/dev/sda      // sda에 sda.img write


  • 압축이미지 생성 및 복구 
$ dd if=/dev/sda | gzip -c > sda.img.gz 
$ md5sum sda.img.gz  > sda.img.gz.md5sum
//Backup 압축 이미지 생성 

$ gzip -dc sda.img.gz | dd of=/dev/sda
//Backup Image로 복구 


  • MBR Delete, Backup ,  Restore
$ dd if=/dev/zero of=file1 bs=512 count=1 conv=notrunc  
// file의 길이를 줄이지 않고, 앞에 512byte만 삭제 

$ dd if=/dev/sda of=sda.img bs=512 count=1
//Backup MBR   

$ dd if=sda.img of=/dev/sda bs=512 count=1
//Restore MBR

$ dd if=/dev/sda of=/tmp/sdambr2.img bs=446 count=1
//Backup only boot data of MBR , Remove partition table  


1.5 dd 와 losetup 같이 File Image 생성 

  • data.img 생성 과 data.img 구성방법

//1. 빈 500MB data.img Image 생성
$ dd if=/dev/zero of=data.img bs=1k count=500k 
....
524288000 바이트 (524 MB) 복사됨, 1.91343 초, 274 MB/초
// 0으로 채우며, 한번에 1024byte 씩 500*1024 반복하여 Image 생성 (500*1024*1024)

//2. 새로 생성된 data.img  파티션 설정 
$ fdisk ./data.img   // fdisk를 사용하여 Partition 설정

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-1023999, default 2048): 204800
Last sector, +sectors or +size{K,M,G} (204800-1023999, default 1023999): //Enter 

Command (m for help): w
The partition table has been altered!
//상위 204800x512 ~ 1023999x512 Partition 생성완료

$ fdisk -l ./data.img  // fdisk를 사용하여 Partition 생성확인
Disk ./data.img: 500 MiB, 524288000 bytes, 1024000 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
Disklabel type: dos
Disk identifier: 0x5591d382

Device      Boot  Start     End Sectors  Size Id Type
./data.img1      204800 1023999  819200  400M 83 Linux

//3. EXT4 FS 포맷 (204800x512 ~ 1023999x512) 상위주소 확인
$ sudo losetup -o $((512 * 204800)) /dev/loop0 data.img
$ sudo mkfs -t ext4 /dev/loop0
$ sudo losetup -d /dev/loop0

//4. data.img 내부의 EXT4 mount 후 내부 Filesystem 확인 
$ mkdir tmp1
$ sudo mount -o loop,offset=$((512 * 204800)) data.img ./tmp1  //loop device 사용 
or 
$ sudo mount -o ro,offset=$((512*204800)) data.img ./tmp1 // read only 
$ ls ./tmp1/
lost+found
$ umount tmp1 

//5. MBR을 제외한 부분 1*512 ~ 512*204800  각 Image 복사 default bs 는 512 bytes 
$ sudo losetup -o0 /dev/loop0 ./data.img     //attach device (0 byte에 연결) 
$ dd if=tmp1 of=data.img seek=1  //seek=01 , tmp1 파일을 data.img 01 x 512 byte 부터 복사 
$ dd if=tmp2 of=data.img seek=31 //seek=31 , tmp2 파일을 data.img 31 x 512 byte 부터 복사
$ dd if=tmp3 of=data.img seek=63 //seek=31 , tmp2 파일을 data.img 63 x 512 byte 부터 복사 
$ sudo losetup -d /dev/loop0   //detach device

  • 상위 data.img 구성 (fdisk사용시만)
  1. 0~512 byte : MBR ( Partition 정보)
  2. 01 x 512 ~ 31 x 512 : tmp1
  3. 31 x 512 ~ 63 x 512 : tmp2
  4. 63 x 512 ~ 31 x 512 : tmp3

GPT의 경우 parted 사용하며, 이부분은 Partition 구성이 다르므로 생략 

dd 사용예제
  https://ahyuo79.blogspot.com/2014/08/tmp.html
  https://ahyuo79.blogspot.com/2014/08/odroid-build2.html


dd 명령어 관련내용 
  http://wiki.linuxquestions.org/wiki/Some_dd_examples
  https://linoxide.com/linux-command/linux-dd-command-create-1gb-file/
  http://forum.falinux.com/zbxe/index.php?document_srl=561988&mid=lecture_tip
  https://en.wikipedia.org/wiki/Dd_(Unix)
  https://linoxide.com/linux-command/linux-dd-command-create-1gb-file/


2. hexdump/hd 기본사용법 

dd와 함께 data를 검증하기 위해서 사용해보자

  • hd/hexdump 옵션
  1. -s offset
  2. -n length
  3. -v display all input data.
  • hexdump 옵션
  1. -C hex와 ascii 값도 출력 


$ hd -s 512 -n 1024 -v data.img  // 512byte 부터 길이 1024 bytes 만 보기 

00000200  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000210  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000220  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000230  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000240  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
........

$ hd -n 512 -v data.img  // 앞에 512 byte만 보기 

$ hd -v data.img  // 전체보기 

$ hd data.img | less // 전체를 보지만 less로 위치이동가능 (g 와 line 입력)

10/10/2018

SSH/Serial Program

1. Window SSH/ Serial Program 

Window에서 내가 개인적으로 좋아하는 Serial Program 과 SSH Program을 간단히 정리한다.
SSH를 지원을 한다면, 확인해야 할 것이 SFTP or SCP의 기능도 확인을 해야 할 것이다.

  • XSHELL
SSH 사용과 Serial 사용시 필요한 잘 사용하는 프로그램으로, 평가판/가정 및 학교사용자는 무료로 사용이 가능하지만, 기업은 유료라는 사실을 잊으면 안된다.

Download
  https://www.netsarang.co.kr/download/down_form.html?code=612

Ubuntu 16.04 사용시 주의사항
  https://ahyuo79.blogspot.com/2018/05/ubuntu-1604-lts-version.html

기타내용
  https://ahyuo79.blogspot.com/2015/02/vi.html
  https://ahyuo79.blogspot.com/2013/12/virtual-box-network-nat.html




  • Teraterm 
완전무료이며, SSH 와 Serial 을 지원하고 있으며, 상위와 비슷한 기능을 가지고 있지만, 나에게는 크게 매력적으로 다가오지는 않는다.
다만 회사에서만 사용하면 모를까

Download
  https://download.cnet.com/Tera-Term/3000-2094_4-75766675.html



10/05/2018

Prebuilt Toolchain Download

1. Prebuilt Toolchain

Cross Compiler를 Prebuilt toolchains에서 배포하는 곳은 많으며, 대체적으로  BSP에서 제공해주는 것에  맞추어서 설치하면된다.
오래전 같으면 Cross Compiler를 직접빌드해서 사용했지만, 지금은 설치만 하면되니까,
그래도 직접 빌드는 안하지만 개념은 까먹지 않아야 할꺼 같아 정리한다.


  GCC (GNU Compiler)
  https://www.gnu.org/software/gcc/

일단 GCC의 동작 및 기본구성원리를 들을 알아보자.

1.1 GCC의 구성 및 동작 

GCC의 C Compiler만을 의미하는 것이 아니며, C, C++, Objective-C, Fortran, Ada, and Go 다양한 언어를 제공해주는 GNU의 Compiler이다


  • GCC의 구성도 
  1. Front End (각 언어에 (C/C++/Fortran) 맞게 Parsing 및 구조화 ) 
  2. Middle End ( Front End에서 생긴 것을 최적화) 
  3. Back End ( 각 Architecture에 맞게 PowerPC/ARM/X86  Machine Code 생성)


상위 그림은 LLVM에서 가져온것이지만 GCC도 거의 동일하다.

각 프로그래밍 언어는 Frontend에서 담당을 하므로, GCC에 추가한다면 Front End이다.
그래서 GCC C/C++만을 위한 것이 아니며, 다양한 언어를 지원한다.

  http://www.aosabook.org/en/llvm.html
  https://www.gnu.org/software/gcc/frontends.html

  • LLVM 
LLVM의 경우는 빌드성능이 좋다고는 하는데, 아직 사용해본 경험이 없으며, TI Compiler or 다른 컴파일러 사용해본 경험밖에 없어 뭐라고 하기가 그렇다.

  http://releases.llvm.org/

  • GCC Manual 
GCC를 이용할 경우 제공되어지는 옵션을 확인이 가능하며, Architecture별 옵션을 확인가능하다

GCC-4.8.5 전체 Manual
  https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/


  • Preprocessor 사용되는 Command 및 Manual 보는법 
GCC 과 다른 Compiler를 보면 Preprocessor 를 사용하는 방법이 다소 다를때가 많으며, 이는 어쩔수 없이 봐야할 부분인 것 같다.
많이 사용되는 곳이 Kernel 과 초기화 코드 및 관련부분이며, 일반 Application에서는 사실 거의 사용하지 않을 것이다.

아래와 같이 상위 Manual을 보면될 것이며, 자료가 방대하다보니 목록을 반드시 확인하고 보자.

#pragma
  https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/Pragmas.html#Pragmas
  https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/Function-Specific-Option-Pragmas.html#Function-Specific-Option-Pragmas

__attribute__ (함수/변수 시)
  https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/Function-Attributes.html#Function-Attributes
  https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/Variable-Attributes.html#Variable-Attributes


1.2 How To Build Cross Compiler 

아래의 사이트에서 크로스 컴파일러가 어떻게 만들어지는 간단하게 알아보자.

  https://rtime.felk.cvut.cz/hw/index.php/How_to_build_GNU_cross-compilers
  https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
  https://wiki.osdev.org/GCC_Cross-Compiler

  • C만 지원하는 일반적 GCC 필요구성 
  1. binutils (linker 및 assember 포함) 
  2. gcc 
  3. glibc/uclibc/musl/newlib  (C library 의 종류)
  4. linux header  ( kernel 정보)

1.3 일반적인 GCC의 필요사항 

일반적인 GCC라면, C만 지원이 되는 glibc를 말할 것이며, 구성요소는 다음과 같다.

  • Linux Kernel header
  https://www.kernel.org/

  • GNU Binutils
  GCC에서 필요한 부분이며, Assembler 및 Linker / readelf/ objdump 및 각 필요한 tool
  https://www.gnu.org/software/binutils/

  • GNU GCC 
  https://gcc.gnu.org/releases.html

  • GNU C Library (다른 Library 생략)
  https://www.gnu.org/software/libc/
  https://en.wikipedia.org/wiki/Newlib


1.4. ABI 관련사항 

ABI(Application Binary Interface)는 CPU Architecture에서 어떻게 Register를 사용 및 할당할 것이지,
그리고CPU 입장에서 함수에 어떻게 변수를 전달할 것인지, 모든 규칙을 정의해놓은 Interface 규격이다.

예를들면, ARM의 PCS(Procedure Call Standard)를 보면, 함수를 호출시  Register로 어떻게 변수를 전달 할 것인지를 설명해준다.
이는 ARM만이 아니라 PowerPC/MIPS 다 존재하며 CPU의 Register 구조가 다르기 때문에 개별 ABI 가 필요하다. (이전 PowerPC는 GP Register 32개)
좀더 들어가면, Data Type , File Format, Stack 의 구조사용법 및  ELF의 동적링크 부분도 다 이 문서에 포함이 되어있다.


  • ABI의 관련사항 
  https://en.wikipedia.org/wiki/Application_binary_interface

  • ARM ABI 관련문서 
  http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.swdev.abi/index.html

  • MIPS ABI 관련문서 
  http://www.cygwin.com/ml/binutils/2003-06/msg00436.html


1.4.1 EABI와 OABI

EABI(embedded-application binary interface) 는 embedded system에서 최적화하기 위해서 만들어졌다고 한다.
더 자세히 말하면 ARM의 EABI는 ARM의 ABI의 일부사양일 뿐이라고 한다.
그리고, 기존의 ABI는 OABI(Old-ABI)로 불린다고 한다.
그러므로, 만약 설정할 일이 있다면, 설정추가를 하는것이지 설정을 변경할일은 아니다.

  • ARM EABI의 탄생배경
기존의 OABI는 FPU를 사용한다고 가정하 만들었기에 FPU와 통신을 해서 문제가 발생한다고 한다 ARM은 FPU가 있는 버전과 없는 버전이 존재한다.
그리고 이를 FPU관련 부분을 효율적으로 사용하기위해서 EABI가 나왔다고 한다.

Debian에서는 ToolChain도 ABI에 따라 3가지 Version으로 구분되어 나온다고 한다.

Architecture ABI FPU Releases
ARM OABI Not required, but very slow without All debian releases upto and including Lenny were OABI. It has since been deprecated.
ARMEL EABI Does not make use of FPU Lenny and beyond
ARMHF EABI FPU required. Specifically benefits from NEON architecture and VFP. Wheezy and beyond

참고로, 상위 Lenny, Wheezy는 Version의 이름이다.

  https://wiki.embeddedarm.com/wiki/EABI_vs_OABI


  • ARM EABI 관련내용 
  https://wiki.debian.org/ArmEabiPort

  • EABI 관련장점 정리사항  
  1. Floating point performance, with or without an FPU is fast and mixing soft and hardfloat code is possible
  2. Structure packing is not as painful as it used to be 
  3. More compatibility with various tools (in future - currently linux-elf is well supported)
  4. A more efficient syscall convention 

  • EABI의 관련장점 설명  
  1. 1번은 상위에서 설명했듯이 EABI의 탄생배경이며 근본적인 문제해결인 것 같다. 
  2. 2번의 경우 구조체의 packed의 문제가 뭔지 모르겠다. e.g.  __attribute__((packed, aligned(4)))
  3. 3번의 경우 binutil과 gcc에서 호환성을 의미하는 것 같다. 
  4. 4번의 syscall convention 변화 (syscall 의 규칙)
  http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=3105/4

  • ARM EABI와 OABI 비교사항 
  http://jake.dothome.co.kr/abi/


  • Android ABI(EABI) 관련내용 
Android에서 EABI를 사용한다고 하면 Kernel Config에서 다음을 설정한다고 한다.
  1. CONFIG_AEABI
  2. CONFIG_OABI_COMPAT
  https://developer.android.com/ndk/guides/abis?hl=ko
  https://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget/ko


2. 많이 이용되어지는 Prebuilt Toolchain for Linux 

  1. CodeSourcery  (SoC의 BSP/SDK와 함께 배포)
  2. Free Electrons (최근 bootlin 변경됨)
  3. Linaro (ARM) 

SoC와 함께 많이 제공해주던 곳이 CodeSourcery 이며, 이전에 OdroidX2를 가지고 놀때, Linaro도 같이 이용을 했지만 Linaro Version을 좀더 자세히 알고자 한다.

참고자료 및 경험
  https://elinux.org/Toolchains
  https://gcc.gnu.org/install/binaries.html


2.1 Free Electrons (Bootlin)

리눅스 관련된 최신문서가 잘 정리된 사이트이며, Tool chain도 Architecture 및 Library에 별로 다양하게 제공을 할 뿐더러
본인이 원하는 GCC의 내부구성 정보도 잘 보여준다.

uclibc의 경우는 오래전에 uclinux (ARM7, PowerPC) 할때 빼고는 거의 사용한 기억이없는것 같다.
uclibc를 가지고 opensource를 porting할 때마다 제한적이어서 고생한 기억만 나서 그런지,
참고로 uclinux의 경우 오랜전에 MMU가  없이도 가능 부팅이 가능(ARM7)하며, Power PC인 경우는 linux를 최적화하기위해서 사용했었다.

  • GNU Toolchain Download 
  https://toolchains.free-electrons.com
  https://toolchains.bootlin.com/


2.2 Mentor (CodeSourcery)

SoC와 같이 대부분 오래전부터 배포진행했으며, mentor사가 인수하여 지속적으로 배포를 하고 있다.
이전에는 montavista에서도 제공을 했던거 사용했는데 요즘은 어떻게 되었는지 잘모르겠다.

이전에 사용한 version
  https://ahyuo79.blogspot.com/2015/11/arm-tool-chain.html 

각 기본정보를 확인
  https://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/

  • GNU Toolchain Download (정보 확인가능)
  https://sourcery.mentor.com/GNUToolchain/release1294
  https://sourcery.mentor.com/GNUToolchain/release2635
  https://sourcery.mentor.com/GNUToolchain/release2032

Mentor(CodeSourcery) 역시 보면 아래의 Linaro Version 처럼 EABI로 인해 나누어져 배포한다.

2.3 Linaro 

Linaro도 SoC와 함께 배포되어 Download하기가 쉽고 Ubuntu에서 설치가 쉬워서 요즘 많이 이용되어지는 것 같다.

  • Linaro 회사정보
  https://ko.wikipedia.org/wiki/%EB%A6%AC%EB%82%98%EB%A1%9C


  • GNU ToolChain Download
  https://www.linaro.org/downloads/
  https://releases.linaro.org/components/toolchain/
  https://releases.linaro.org/components/toolchain/binaries/latest-5/
  https://releases.linaro.org/components/toolchain/binaries/5.2-2015.11-2/


  • linaro 전체 release site 및 Git 
  http://releases.linaro.org/
  https://web.archive.org/web/20121031094507/http://git.linaro.org/gitweb


  • Tool Chain 관련전체문의  (컴파일러 옵션설명)
  https://wiki.linaro.org/WorkingGroups/ToolChain/FAQ

  • 컴파일러 Prefix의 의미 ( A-B-C)
A 는 target architecture 의미한다고 한다. 
(e.g. arm for AArch32 little-endian, aarch64 for AArch64 little-endian)

B 는 vendor 의미이며, 사용여부는 옵션 (배포한 Vendor) (none or unknown for generic)
일반적으로는 거의 사용하지 않는다고 하며, 아래에도 사용하지 않음 (e.g  not present in arm-linux-gnueabihf)

C 는 사용중인 ABI 의미를 말하며 관련 system(OS)도 기술한다.   
(e.g linux-gnu* for Linux, linux-android* for Android, elf or eabi for ELF based bare-metal).

Bare Metal ABI는 New Lib를 사용하고 NonOS용으로 사용한다고 한다   

  • 컴파일러 기능요약
본인이 Download or 설치한 컴파일러의 옵션의 지원여부를 정확히 알자. 
  1. hw fpu 지원/미지원
  2. little / big endian 
  3. glibc / newlib 사용 ( bare-metal : newlib 사용 (NonOS용) or glibc 이용)


e.g
arm-linux-gnueabihf -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=vfpv4
-mcpu=cortex-a7 -mfpu=vfpv4 -mfloat-abi=softfp|hard
-mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp|hard


  • ARMv7
arm-linux-gnueabihf
 Toolchains for little-endian, hard-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems

arm-linux-gnueabi
Toolchains for little-endian, soft-float, 32-bit ARMv7 (and earlier) for GNU/Linux systems

arm-none-eabi
Toolchains for little-endian, soft-float, 32-bit ARMv7 (and earlier) for bare-metal systems

armv8l-linux-gnueabihf
Toolchains for little-endian, 32-bit ARMv8 for GNU/Linux systems


  • ARMv8
aarch64-linux-gnu
Toolchains for little-endian, 64-bit ARMv8 for GNU/Linux systems

aarch64-none-elf
Toolchains for little-endian, 64-bit ARMv8 for bare-metal systems

aarch64_be-linux-gnu
Toolchains for big-endian, 64-bit ARMv8 for GNU/Linux systems

aarch64_be-none-elf
Toolchains for big-endian, 64-bit ARMv8 for bare-metal systems



2.3.1. Linaro의 Ubuntu Package 지원

상위에서 linaro version에 대해 알았으니, Ubuntu에서 쉽게 설치하는 법을 알아보자

  • Ubuntu APT Package 사용법
  https://ahyuo79.blogspot.com/2015/07/ubuntu.html


  • Ubuntu Toolchain 지원확인  
본인의 Ubuntu에서 지원되는 Toolchain을 찾아보자

$ sudo apt-cache search gcc-arm*  //현재 지원되는 Package를 찾아보자 
gcc-arm-linux-gnueabihf - The GNU C compiler for armhf architecture
gcc-arm-linux-androideabi - cross toolchain and binutils for Android/Bionic on ARM
gcc-arm-none-eabi - GCC cross compiler for ARM Cortex-A/R/M processors
gcc-arm-linux-gnueabi - The GNU C compiler for armel architecture

  • Ubuntu Toolchain 설치 
나의 선택은 당연히 hw float point가 지원되는 기능으로 선택했지만, androideabi와 차이는 아직 잘모르겠다.

$ sudo apt-get install gcc-arm-linux-gnueabihf
$ sudo find / -name arm-linux-gnueabihf* 
/usr/bin/xxxx //binutils , gprof gcov, gcc 설치 
/usr/share/man/man1/xxx
/usr/lib/gcc-cross/arm-linux-gnueabihf 
/usr/arm-linux-gnueabihf
/usr/x86_64-linux-gnu/arm-linux-gnueabihf
...  
 

기존의 TI의 am335x/am437x bsp에도 이미 동일한 이름으로 이미 설치가 되어있네요(arago project)
다음부터 가급적 Download해서 사용하고 PATH를 정하고 사용해야겠네요.

  https://blog.thinkbee.kr/linux/crosscompile-arm/
  https://blog.thinkbee.kr/linux/linux-update-alternatives/


3. Prebuilt Toolchain for Window

오래전에, Cygwin용을 자주 사용했는데, 개발환경의 제약으로 인해 점점 사용하지 않게되었다.
다시 사용할 일이 있다면 다음아래의 사이트에서 Download하자

Cygwin용
  http://cygwin.com/

Mingw 용
  https://mingw-w64.org/doku.php


4. Eclipse GCC 사용 

아직 적용을 해보지 못했으며, 궁극적으로 모든것을 Eclipse 기반으로 하고 싶은 생각을 가지고 있다.
매번 Terminal에서 make와 shell script를 이용하여 하고 싶지 않으며, 이용하더라도 Eclipse에서 편하게 사용하는 방법을 찾고자 한다.

Eclipse와 함께사용
  https://www.codeguru.com/cpp/cpp/getting-started-with-c-for-eclipse.html

9/23/2018

Android 관련 정보

Android 개발 Manual

Android 내부관련 문서로 설명이 잘 되어있으며, 각 IPC 및 동작원리도 간단히 설명하고 있다.

  https://bootlin.com/doc/training/android/android-slides.pdf
  https://bootlin.com/doc/training/android/
  https://bootlin.com/pub/conferences/2012/captronic/android/android-captronic.pdf

최근 free-electrons.com 에서 bootlin으로 변경됨
Embedded Linux 와 Kernel 및 Android 관련 자료가 설명이 잘되어있음
  https://free-electrons.com/docs/
  https://bootlin.com/

Android Source 구조 

Google 자료

구글 Android 와 AOSP의 차이
  https://blog.lgcns.com/571


AOSP의 운영유지방법 및 준비사항 과 빌드방법 (HiKey960 정보)
  https://source.android.com/setup
  https://source.android.com/setup/build/devices

Android의 구조 및 Framework
  https://source.android.com/compatibility

Android의 보안
  https://source.android.com/security

Android의 개발 Audio / Camera 및 기타
  https://source.android.com/devices/audio
  https://source.android.com/devices/camera
  https://source.android.com/devices/tech/connect
  https://source.android.com/devices/graphics
  https://source.android.com/devices/input
  https://source.android.com/devices/media

  https://developer.android.com/guide/topics/media/
  https://developer.android.com/training/camera/
  https://developer.android.com/guide/topics/sensors/

Android Platform API
  https://developer.android.com/reference/packages

Android HAL (legacy)
  https://source.android.com/reference/hal
  https://source.android.com/reference/hidl

Android의 Dalvik
  https://source.android.com/devices/tech/dalvik

Android Doc
  https://developer.android.com/docs/

Android Sample
  https://developer.android.com/samples/


  https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads/8-3-2019-03

Android 리버스 엔지니어링
  https://academy.realm.io/kr/posts/jon-reeve-reverse-engineering-is-not-just-for-hackers-android/

Android 이미지 Loading Library
  https://d2.naver.com/helloworld/429368

Android 앱 메모리 최적화
  https://d2.naver.com/helloworld/539525

Android Studio
  https://d2.naver.com/helloworld/5736059


Android Meetup
  https://d2.naver.com/news/4483716


8/27/2018

ST MIPI DSI(Display Serial Interface)

1. LCD Interface 확인 



ST LCD Interface 와 MIPI Interface 설명 

  • Intel8080/68K/SPI
이전에 설명했듯이 CPU/MPU Interface 와 SPI Interface이며, 주로 내부에 GRAM이 존재하여, 별도의 Fram Buffer가 필요가 없다. 

  • RGB Interface
아래 그림과 같이 SoC에 Frame Buffer가 존재하며, RGB Interface로 붙어 각 Timing을 설정해준다. 

1.1 LCD Interface 와 MIPI Interface의 이해 

ST기반의 LCD와 MIPI Interface를 이해해보자. 
  1. DBI (Display Bus Interface): CPU/MPU Interface 와 SPI Interface without Frame Buffer
  2. DPI(Display Pixel Interface): RGB Interface with Frame Buffer
  3. DCS(Display Command Set): MIPI-DBI Interface 지원하는 Command들 


  • DBI 구조 (CPU/SPI Interface로 Frame Buffer가 필요 없는 Type)



  • DPI 구조 (RGB Interface로 내부에 Frame Buffer가 존재)



  • MIPI-DSI Host 구조 
DPI 와 DBI 기반으로 MIPI DSI Host(Display Serial Interface) 구축하고, PPI(PHY Protocol Interface)를 이용하여 D-PHY와 통신하여,
이를 MIPI LCD에게 전달해준다.  


DPI와 상위 MIPI-DSI Interfce 

MIPI-DSI 를 보면 이전의 LCD Interface로 연결이 되어 이를 Host로 생성한 후 이를 MIPI-DSI로 연결하는 방식이다. 
어떻게 보면 예전의 LVDS와 다르지 않게 느껴진다. 

2. MIPI-DSI Host 기본구조 

MIPI(Mobile Industry Processor Interface)의 DSI는 LCD Interface를 고속 Serial Interface를  이번기회에 정리하고자 한다.  

MIPI(Mobile Industry Processor Interface)

MIPI-DSI(Display Serial Interface)

  • MIPI DSI Host 와 LCD Dispaly 구조 
Lane은 0~3도 가능하며, PHY는 중 1개의 Lane은 양방향통신을 진행한다.
  1. HS(High Speed) Mode
  2. LP(Low Power) Mode

상위 D-PHY기반의 PHY Protocol Interface (PPI) 말하며, 용어만 알아두도록하자. 
상위 Lane들을 구조를 좀 자세히 보면 3개 중 2개 HS Mode(단방향)만 사용하며, 나머지 1개만 HS Mode 와 LP 모드(양방향)형식으로 데이타 전송이 이루어 지고 있음을 알수 있다.  

즉 Host에서 상위 DCS(Display Command Set)을 LP 모드로 전송하고 DATA는 HS Mode로 전송함을 짐작할 수 있다. 


  • DPI 기반의 MIPI-DSI Host 구조 
아래의 경우는 상위 설명의 DPI(RGB Interface) 기반으로 동작되는 것을 MIPI-DSI Host로 연결한 구조이다. 


기존의 RGB Interface와 거의 유사하며, 다만 실제 영상데이타는 PPS(HS)로 전송되며 나머지는 LP로 되어지는 것으로 보인다. 


  1. HSA (Hsync active)
  2. HBP (horizontal back porch)
  3. HFP (horizontal front porch)
  4. VSA (Vsync active)
  5. VBP (Vertical back porch)
  6. VFP (Vertical front porch)
  7. VSS (Vsync Start)
  8. VSE (Vsync end)
  9. HSS (Hsync Start)
  10. HSE (Hsync end)
  11. PPS (Packed Pixel Stream)으로 16/24/32 등 RGB/YUV를 비롯하여 다양하다 

Tegra의 DRM 의  RGB Interface 설정 


2.1  MIPI 의 PHY의 동작방식  

상위그림은 현재 D-PHY를 사용하고 있으며, PHY 내부의 Protocol을 조금 더 알아보자.

  • PHY 의 모드와 속도 


  • DSI PHY Signal Mode에서는 두가지 모드로 통신 구성
  1. HS (High Speed) Mode: 빠른 모드로 최대 1.5Gb/s 라고 하며, 상위 글을 보면 각 PHY마다 다른것으로 파악 (200mV)
  2. LP (Low Power) Mode: 저전력모드로 아래 그림과 같이 differtial 이 아니며, Level과 속도도 10Mb/s 밖에 되지 않는다. (1.2V)


각 Lane의 각 HS 와 LP로 State Code가 존재하며, 이를 이 기반으로 통신을 진행한다. 


  • Data lane의 Operating Mode/ State Code 
  1. Control Mode: Reset 후 LP-11인 상태이며, 다른모드가 종료후 이모드임 
  2. HS Mode:  뒤에 설명 
  3. Escape Mode: 뒤에 설명  

2.2  Data lane 의 HS Mode

Control Mode 진입 후 HS Mode로 진입하여 데이타 통신을 진행하므로 반드시 알아야함
  • 일반적인 HS Mode 동작 

  • SoT (Start of Transmission) 
LP-11 (Stop), LP-01 (HS-Rqst), LP-00( Bridge) 받는 즉시 HS Mode로 진입하고 DSI Host는 HS-0과 함께 시작하며, 상위 Sync Sequence를 보낸다.

  • EoT(End of Transmission)
HS모드로 Data 전송후 Host는 Trailing sequence를 보내는데, 마지막 data의 반대 값 HS-0/1
LP-11모드로 진입



2개의 Lane사용시의 Data 전송되는 방식이며, 4개도 동일하다. 


2.3 Data lane의 Escape Mode

Escape Mode는 접해보지 못한것으로 아래의 Command들도 제공을 해주며, 이 부분 추후에 더 보강을 하자. 


Escape Mode Command 



3. PHY의 세부 동작 


  • 상위 Data Lane 중 양방향 통신방식을 보면 아래와 같이 동작 


  • Clock-lane의 Power Mode
  1. LP(Low Power) Mode
  2. HS(High Speed) Mode
  3. ULPS(Ultra-low-power state)


3. MIPI Spec


CCI 

8/26/2018

JAVA와 JDK 관련지식

1. Java 

Java는 썬 마이크로 시스템즈가 개발한 객체지향 언어이며, 현재 썬 마이크로 시스템즈 오라클에 인수되어져 있다.

Java의 장점은 Source 코드를 중간코드(Java Bytecode)로 변환하여 JVM(Java Virtual Machine)에서 실행할수 있어 높은 호환성을 가지고 있다.
물론 다른 언어처럼 완전 Compiler 기능을 가지고 있지만 이를 이용시 JVM은 이용을 못한다.

  • Java의 Platform 분류 
  1. Java SE(Standard Edition) 
  2. Java EE(Enterprise Edition)
  3. Java ME(Micro Edition)
  4. 이외 

나의 관심은 Java SE으로만으로도 충분한 것 같어 더 자세한 내용은 JDK 에서 찾자.
아래의 Wiki에서 구글과 오라클 소송에 관한 이야기도 흥미로운것 같다.

  https://namu.wiki/w/Java
  https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)

1.1 Java Development Kit 의 구성 

JDK를 설치하면 아래의 사항들이 전부 설치가 되며, 각 구성의 용어를 알아보자.
  1. JDK(Java Development Kit) : 자바의 개발 도구 이며, JRE 와 JVM을 포함하고 있다. 
  2. JRE(Java Runtime Environment) : 자바의 실행환경이며, JVM과 관련 Library를 포함하고 있다고 한다. 
  3. JVM(Java Virtual Machine) :  Java Bytecode (*.class, *.jar)를 실행시간에 동작하는 interpreter 기능

아래의 정보에서 잘 설명해주고 있다.
  1. JDK = JRE + Development/debugging tools
  2. JRE = JVM + Java Packages Classes(like util, math, lang, awt,swing etc)+runtime libraries.
  3. JVM = Class loader system + runtime data area + Execution Engine.



출처
  https://www.quora.com/What-is-JDK

  • JDK SE 5.0 JDK 구조 




  • JAVA SE JDK 구조 

출처
  http://javacodedepot.com/java/java-jre-vs-jdk
  http://www.cs.mun.ca/java-api-1.5/
  https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre



상위의 Tools 정보를 보면 아래와 같이 볼수 있다.
  • Java의 개발 Tools 
  1. appletviewer: Run and debug applets without a web browser.
  2. extcheck: Utility to detect Jar conflicts.
  3. jar: Create and manage Java Archive (JAR) files.
  4. java: The launcher for Java applications.
  5. javac: The compiler for the Java programming language.
  6. javadoc: API documentation generator.
  7. javah: C header and stub generator. Used to write native methods.
  8. javap: Class file disassembler
  9. jdb: The Java Debugger.

JDK 1.7.0의 구조
  https://programmingmitra.blogspot.com/2016/05/jdk-and-jre-file-structure.html
  http://www.tech-faq.com/jdk.html

  • 일반적인 JAVA 사용법  
  1. 개발툴 java : *.java -> *.class (Java byte code)
  2. 개발툴 jar   :  *.class -> *.jar (생성)
  3. JVM에서  *.class/*.jar  실행 

Bytecode
  https://en.wikipedia.org/wiki/Bytecode

JAR(Java ARchive)
  https://en.wikipedia.org/wiki/JAR_(file_format)

  • Oracle JDK vs Open JDK
이전에는 Sun JDK이었으나, Oracle이 Sun을 인수 했기에  Oracle 과 Open JDK로 구분되어지겠다.

Oracle JDK
  https://www.oracle.com/technetwork/java/javase/downloads/index.html

Open JDK
  https://openjdk.java.net/projects/jdk/11/
  https://openjdk.java.net/projects/jdk7/
  http://openjdk.java.net/projects/jdk6/



1.2 Ubuntu 에서 JDK 의 Version 별 관리 

Ubuntu에서 아래와 같이 여러 Version JDK를 설치 후 각 Tool을 Version별로 설정하여 사용이 가능하다. 


$ sudo apt-get install openjdk-6-jdk 
$ sudo apt-get install openjdk-7-jdk

$ sudo update-alternatives --list java   // 설치확인 

$ sudo update-alternatives --config java   // Android Version에 따라 변경 
대체 항목 java에 대해 (/usr/bin/java 제공) 2개 선택이 있습니다.

  선택       경로                                          우선순ꡬ태
------------------------------------------------------------
* 0            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      자동 모드
  1            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      수동 모드
  2            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      수동 모드

$ sudo update-alternatives --config javac   // Android Version에 따라 변경 
대체 항목 javac에 대해 (/usr/bin/javac 제공) 2개 선택이 있습니다.

  선택       경로                                       우선순ꡬ태
------------------------------------------------------------
* 0            /usr/lib/jvm/java-7-openjdk-amd64/bin/javac   1071      자동 모드
  1            /usr/lib/jvm/java-6-openjdk-amd64/bin/javac   1061      수동 모드
  2            /usr/lib/jvm/java-7-openjdk-amd64/bin/javac   1071      수동 모드

$ sudo update-alternatives --config jar  // Android Version에 따라 변경 
대체 항목 jar에 대해 (/usr/bin/jar 제공) 3개 선택이 있습니다.

  선택       경로                                     우선순ꡬ태
------------------------------------------------------------
* 0            /usr/lib/jvm/java-7-openjdk-amd64/bin/jar   1071      자동 모드
  1            /usr/bin/fastjar                            100       수동 모드
  2            /usr/lib/jvm/java-6-openjdk-amd64/bin/jar   1061      수동 모드
  3            /usr/lib/jvm/java-7-openjdk-amd64/bin/jar   1071      수동 모드

$ sudo update-alternatives --config javah    // Android Version에 따라 변경 
대체 항목 javah에 대해 (/usr/bin/javah 제공) 2개 선택이 있습니다.

  선택       경로                                       우선순ꡬ태
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-openjdk-amd64/bin/javah   1071      자동 모드
* 1            /usr/lib/jvm/java-6-openjdk-amd64/bin/javah   1061      수동 모드
  2            /usr/lib/jvm/java-7-openjdk-amd64/bin/javah   1071      수동 모드



2. Android의 Java 와 VM(Virtual Machine) 

Google에서는 라이센스 문제로 JVM을 사용하지 못하고 대신에 DVM(Dalvik Virtual Machine)을 사용한다. 흔히 Dalvik이라고 말한다.
하지만 Android의 Virtual Machine 인 Dalvik은 Android 5.0 "Lollipop" 부터 DVM 대신  ART(Android_Runtime)만 사용하고 있다고 한다.

ART(Android_Runtime)는 Dalvik 이후로 나온 Android의 Virtual Machine이며, 실행시간에 dex file을 실행할수있으나, Dalvik 에서 동작하는 일부 기술은 ART에서 동작이 되지 않는 다고 한다.


  • DEX(Dalvik Executable)
Android에서는 독자적인 Virtual Machine을 가지고 있어서 Java의 기존 *.class(bytecode) 사용할수 없기 때문에 독자적인 파일 포맷을 가지고 있다.
  1. .dex  ( Dalvik EXecutable ) 
  2. .odex ( Optimized Dalvik EXecutable ) 

Dalvik 관련자료

ART and Dalvik


  • Android JAVA 사용법 
  1. 개발툴 java : *.java -> *.class (Java byte code)
  2. 개발툴 jar   :  *.class -> *.jar (생성)
  3. dx             :  *.jar/*.class -> *.dex
  4. VM            : *.class/*.jar  실행 
Android에서 JAVA 사용법은 dx라는 tool을 이용하여 한단계가 더 걸치고 dx tool은 Java의 *.class file을 *.dex file로 변환을 한다고 한다. (상위 wiki 설명)


1.1 File CLASS 와 File DEX

안드로이드에서 dx를 통하여 File format *.class를  *.dex로 변경된 후 간단히 비교해보자. 참고로 File format Class와 OOP의 Class를 혼동하지 말자.



세부내역은 아래의 사이트에서 확인

CLASS 와 DEX 구조
  https://xsolve.software/blog/differences-between-class-and-dex-files-in-java-android/

CLASS (Java bytecode)의 구조
  https://en.wikipedia.org/wiki/Java_class_file

DEX FORMAT
  https://source.android.com/devices/tech/dalvik/dex-format


1.2 File APK의 구성 

Android의 Package 구성이며, 이를 기존의 Java Archive인 JAR와 비교를 해보자.

  • JAR의 구성 vs APK의 구성 
일반적은 JAR를 보면 *.class file로 구성된 Java Archive 파일이며, APK에 내에는 1개의 Dex가 존재한다.
1개의 Dex 크기에 제한 64K로 제한이 되어있어 만약 사이즈가 문제가 된다면 MultiDex를 지원한다고 한다.


출처
  https://stackoverflow.com/questions/8210173/what-is-the-difference-between-class-and-dex-files

MultiDex지원 (64K 이상의 Dex file)
  https://developer.android.com/studio/build/multidex?hl=ko

JIT
  https://source.android.com/devices/tech/dalvik/jit-compiler

Packetyzer

Wireshark(이전 Ethereal)을 주욱 사용해오다가, 한번 다른 윈도우 스니퍼 프로그램 발견하여 이를 설치해보고 테스트를 해보는 중이지만,
아쉽게도 나의 Window WIFI Network Adapter를 인식못하지만 유선랜과 나의 Virtual Box Network 부분은 인식한다.

추후 이 부분을 다시 테스트 할 기회가 있다면 해보도록 하자.


Packetyzer
  https://sourceforge.net/projects/packetyzer/files/


아직 밑에 있는 프로그램은 설치를 해보지 못했다.

  • NetworkMiner packet analyzer

  https://sourceforge.net/projects/networkminer/