2016년 11월 24일 목요일

파워포인트 2013 (2016도) 에서 한글과 붙은 영어 끝 글자가 사라지는 문제.

출처 : http://answers.microsoft.com/ko-kr/msoffice/forum/msoffice_powerpoint-mso_winother/powerpoint-2013%EC%97%90%EC%84%9C/9278511d-d623-4240-af2e-9154870414bf

현재 해당 기능의 경우 PowerPoint의 "추천 단어"의 기능에 의해서 발생되는 문제로 확인되었습니다. 따라서 문제가 해결될 때까지 해당 기능은 종료하고 사용하시기를 권장 드립니다.
사용에 불편을 드려서 죄송합니다.
  1. Powerpoint 2013을 실행합니다.
  2. [파일 - 옵션]을 클릭합니다.
  3. [언어 교정 – 자동 고침 옵션 – 자동 고침 – 자동으로 맞춤법 검사기의 추천 단어를 사용]체크를 해제합니다.

2016년 11월 1일 화요일

[Scala] Chisel 2.2 Tutorial {02}

3. Functional Abstraction

반복되는 로직을 function으로 정의할 수 있다.
예)
def clb(a: UInt, b: UInt, c: UInt, d: UInt): UInt = (a & b) | (~c & d)

위 function 사용. UInt argument 네 개를 받고 return type은 UInt 이다.
예)
val out = clb(a, b, c, d)

4. Bundles and Vecs

Aggregates of other types. Bundle은 구조체라고 생각하면 되고, Vec은 배열로 생각하면 된다.

Class MyFloat extends Bundle {
    val sign = Bool()
    val exponent = UInt(width = 8)
    val significant = UInt(width = 23)
}

val x = new MyFloat()
val xs = x.sign

width는 type의 bit수를 나타낸다.

Vecs는 indexable vector를 만든다.

// Vector of 5 23-bit signed integers.
val myVec = Vec.fill(5){ SInt(width = 23) }

// Connect to one element of vector
val reg3 = myVec(3)

primitive class들(SInt, UInt, Bool)이나 aggregate class들(Bundles, vecs)은 모두 Data라는 superclass를 상속받는다. hardware design에서 Data를 상속받는 object는 모두 bit vector로 나타낼 수 있다.

Bundle과 Vec은 nested 구조를 가질 수 있다.

class BigBundle extends Bundle {
    // Vector of 5 23-bit signed integers.
    val myVec = Vec.fill(5) { SInt(width = 23) }
    val flag = Bool()
    // Previously defined bundle.
    val f = new MyFloat()
}

5. Ports

Ports는 hardware components에 대한 인터페이스이다.
Construction time에 object에 direction(input or output)을 추가하는 것을 제공한다. 다음은 port declaration의 예이다.

class Decouple extends Bundle {
    val ready = Bool(OUTPUT)
    val data = UInt(INPUT, 32)
    val valid = Bool(INPUT)
}

Instantation time에도 object의 direction이 정해질 수 있다.

class ScalaIO extends Bundle {
    val in = new MyFloat().asInput
    val out = new MyFloat().asOutput
}

asInput 과 asOutput method는 direction을 가지게 하는 method이다.

2016년 10월 27일 목요일

[영어공부] 전치사 on

날짜(요일, 기념일)

on Tuesday 화요일에
on Wednesday 수요일에
on August 8th 8월 8일에
on November 11th 11월11일에
on the first day 첫째날에
on the second day 둘째날에
on my birthday 내 생일날에
on my wedding day 내 결혼식날에
on Christmas 크리스마스날에
on a fine day 화창한 날에
on a rainy day 비 오는 날에

장소(접촉, 바깥면 같은 느낌)

on the desk 책상 위에
on the shelf 선반 위에
on the floor 바닥에
on the ground 땅 위에
on the couch 소파 위에
on the door 문에
on the wall 벽에
on the ceiling 천장에
on my shirt 내 셔츠에
on my finger 내 손가락에
on the water 물 표면에
on the plane 비행기에 (탑승)
on the subway 지하철에 (탑승)
on the bus 버스에 (탑승)
on the elevator 엘리베이터에


수단

on the internet 인터넷으로
on the cell phone 핸드폰으로
on the radio 라디오로
on the phone 전화로
on TV 텔레비전으로
on SNS SNS로

[영어공부] 전치사 at

시간 관련

at seven 7시에
at seven thirty 7시30분에
at seventeen 17살에
at the age of seventeen 17살에
at twenty eight 28살에

at noon 정오에
at night 밤에
at midnight 자정에
at that time 그때에
at the last minute 마지막 순간에
at Christmas 크리스마스 때
at Halloween 할로윈 때

at dinner time 저녁 식사 때
at lunch time 점심 식사 때
at breakfast time 아침 식사 때
at my age 내 나이 때
at your age 네 나이 때
at her/his age 그녀(그)의 나이 때
at their age 그들의 나이 때


장소 관련

at home 집에
at school 학교에
at work 직장에
at the bottom 하단에
at the desk 책상에
at the table 테이블에
at the door 문에
at the window 창문에
at the corner 모퉁이에
at the library 도서관에
at the station 역에
at the airport 공항에
at the mall 백화점에
at the store 가게에
at the beach 해변에
at the party 파티에


2016년 10월 22일 토요일

[Bash] 배시 기본 {05} - 히스토리 확장, 이벤트 지정자, 워드 지정자, 한정자

이벤트 지정자(event designator)


$ !!
마지막 명령을 다시 실행한다.

$ !string
string 으로 시작하는 최근 명령을 다시 실행한다.

$ !n
n째 명령행을 실행한다.

$ !?string
string을 포함하는 명령행 중 마지막 명령행

$ ^string1^string2
string1을 string2로 바꾸어 마지막 명령 반복. 문자를 잘못 입력했을 때 쓰면 편한다.

워드 지정자


이전에 내린 명령행에서 특정 워드를 가리킬 수 있다. 이벤트 지정자 뒤에 콜론(:)을 덧붙여서 사용한다.

$ ls -al
$ !!:0
ls 실행 (-al 옵션 떼고)

$ ls -al
$ !!:0-1
0부터 1까지 실행. 즉 ls -al 모두 실행. 순서는 첫번째가 아닌 0번째 부터다.

$ ls -al
$ !!:0-$
0부터 마지막까지 실행

$ !!:x*
x-$와 같다.

$ !!:*
1-$와 같다.

한정자(modifier)

한정자도 콜론(:)을 붙여서 사용한다.

$ ls -al /some/path/to/your/file.txt
$ ls -l !!:$:h
ls -al /some/path/to/your
h는 제일 뒤의 경로명을 삭제한다.

$ ls -al /some/path/to/your/file.txt
$ ls -al:$:t
ls -al file.txt
t는 가장 뒷 부분을 남겨놓고 앞 부분의 경로명을 모두 삭제한다.

$ ls -al /some/path/to/your/file.txt
$ ls -al !!:$:r
ls -al /some/path/to/your/file
r은 서픽스(.txt)를 삭제한다.

$ ls -al /some/path/to/your/file.txt
$ !!:s/ls -al/cat/
ls -al  명령을 cat으로 바꿔서 실행한다.

$ cp /etc/password /backup/password.bak
$ !!:gs/password/passwd/
cp /etc/passwd /backup/passwd.bak
만약 passwd 파일을 백업해야 하는데 password 로 잘못 썼다면 gs를 이용해서 password 문자를 모두 passwd로 바꿀 수 있다. s만 쓰면 앞의 password만 passwd로 바뀐다.

$ tar cvf password.tar password
$ !!:g&
&는 마지막 substitution을 한 번 더 실행한다. 마지막 substitution이 s/password/passwd 이므로 tar cvf passwd.tar passwd로 명령이 바뀌어서 실행된다.

$ tar cvf tar-file.tar file1 file2 file3
$ tar cvfz new-tar-file.tar !tar:3-$:p
tar cvfz new-tar-file.tar file1 file2 file3
p는 실제로 실행하지 않고 수정한 명령행을 화면에 출력한다. 의도한 명령행과 같다면 :p를 지우고 실행하면 된다.



[Bash] 배시 기본 {04} - fc, wc

fc 명령

셸의 히스토리 구조를 사용할 수 있다. 명령을 다시 실행시키거나 비슷한 명령을 실행시키고 싶을 때 사용한다.

$ fc -l
마지막 16개 명령행을 표시한다.

$ fc -l number number2
number과 number2 사이의 명령행을 표시한다.

$ fc -l v
v로 시작하는 최근의 명령행으로 부터 이 명령행 이후의 모든 명령행을 표시한다.

$ fc -ln
n 옵션은 번호를 생략한다.

$ fc -e vim line_number
$ fc -e vim characters
-e 옵션은 에디터(vim)를 이용해서 편집모드로 들어가게 해준다. line_number를 쓰면 해당 명령행을, characters를 쓰면 해당 문자로 시작하는 명령행을 vim으로 편집할 수 있고, 편집이 끝나고 에디터를 종료하면 바뀐 명령행이 실행된다.

$ fc -s
마지막으로 실행한 명령행을 다시 실행

$ fc -s characters
characters로 시작하는 최근의 명령행을 실행

$ fc -s vim=vi vim
vim으로 시작하는 최근의 명령행을 실행하는데 vim이라는 모든 단어를 vi로 바꿔서 실행


wc 명령


wc 명령은 파일 내의 라인, 단어, 문자의 수를 출력한다.

$ wc file
라인수, 단어수, 문자수 순으로 출력된다.

$ wc -c file
$ wc -l file
$ wc -w file
c옵션은 문자수, l옵션은 라인수, w옵션은 단어수이다.

예) $ ls -l | wc -l
디렉토리 리스트(ls -l)의 라인수를 출력한다. 디렉토리내 파일의 개수+1개를 얻을 수 있다.

2016년 10월 20일 목요일

[Linux] SSH 설치와 실행

설치, 실행

$ sudo apt-get install ssh
$ sudo /etc/init.d/ssh start

시작프로그램 등록

$ sudo vim /etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# start ssh server
/etc/init.d/ssh start
exit 0


포트 변경하기

변경하지 않아도 된다. SSH의 기본 포트는 22번이고 변경할 필요가 있다면
$ sudo vim /etc/ssh/sshd_config

port 22 라고 되어있는 것을 원하는 포트로 바꿔준다. 예) port 2200

[Bash] 배시 기본 {03} - 역슬래시, Ctrl

특수 문자와 인용부호

< > | & * ? [ ] 문자 같은 것 들은 특수 문자이다. 특수 문자를 특수 문자로 사용하지 않고 보통 문자로 표현하려면 인용부호(quoting)를 사용한다.

$ echo 2 * 3 > 5 is a valid inequality

위 명령을 실행하면 5 라는 새 파일이 만들어지고, 이 파일 안에는 2, 현재 디렉토리의 모든 파일(*) 그리고 3 is a valid inequality가 씌여진다. 이 경우 * 와 > 를 작은따옴표로 감싸주면 된다.

$ echo '2 * 3 > 5 is a valid inequality'

혹은

$ echo 2 '* 3 >' 5 is a valid inequality

역슬래시-이스케이프 제어

특수 문자 앞에 역슬래시(\ or \) 문자를 입력하는 방법도 있다. 이를 역슬래시 이스케이프 제어(backslash-escaping)라고 한다.

$ echo 2 \* 3 \> 5 is a valid inequality

인용부호로 묶었을 때 와일드카드 문자를 그대로 인식하는 명령어들이 있다. 예를 들면 find 명령의 경우

$ find . -name '*.c'

현재 디렉토리와 그 하위 디렉토리(.)에서 .c로 끝나는 모든 파일을 찾는다. 와일드카드 문자가 포함된 파일 이름을 찾으려면 역슬래시를 사용한다.

$ find . -name '*\*.c'

위 명령은 *.c로 끝나는 모든 파일을 찾는다.

한 줄이 넘는 명령 입력하기

역슬래시나 인용문자(작은따옴표)를 이용한다.

$ echo hello ildelusion \
> virtualization \
> sleepy.

$ echo 'hello ildelusion
> virtualization
> sleepy.'

컨트롤(Ctrl) 키

일종의 특수문자로 Ctrl 키와 다른 키를 동시에 눌러서 실행시킨다.

Ctrl-M : 엔터
Ctrl-C : 현재 명령 중지
Ctrl-D : 입력의 끝
Ctrl-\ : Ctrl-C가 동작하지 않을 경우 현재 명령 중지. Ctrl-C 먼저 사용해야 파일이나 다른 자원의 상태에 문작 발생하지 않는다.
Ctrl-S : 화면 출력 정지
Ctrl-Q : 화면 출력 다시 시작
Ctrl-? : 지운 문자를 다시 되돌린다.
Ctrl-U : 전체 명령행 삭제
Ctrl-Z : 현재 명령 일시 중단


2016년 10월 19일 수요일

[Bash] 배시 기본 {02} - 입출력 방향 재지정, 파이프라인, 백그라운드 작업

쉘(Shell)을 처음배우는 입장에서 표준입력이니 출력이니 하는 말들을 먼저 익히는 것보다 일단 따라해보고 감을 익히는게 좋다고 생각한다. 표준입력은 키보드, 표준출력은 모니터라고 생각하면 된다. 일단 따라해보자.

입출력 방향 재지정

command < filename    # command에 해당하는 명령은 터미널이 아닌 파일에서 표준 입력을 받는다.
command > filename    # command 명령의 표준 출력 방향을 해당하는 파일명으로 재지정한다.

예) $ date > now    # 현재 날짜와 시간을 now 파일에 저장한다.
예) $ cat < file1 > file2    # file1의 내용을 입력으로 받아서 file2에 쓴다.
예) 위 명령은 다음과 같은 명령이다. $ cp file1 file2

파이프라인

다른 명령의 입력으로 어떤 명령의 출력 방향을 재지정하는 것이 파이프(pipe)이다. 파이프로 연결된 명령이 두 개 이상 있는 명령행을 파이프라인(pipeline)이라고 한다.

예) $ sort < file1 | more    # file1을 sorting하여 한 화면씩 출력한다. 스페이스바를 누르면 다음 화면으로 엔터를 누르면 다음 행으로 간다.
예) $ cut -d: -f1 < /etc/passwd | sort    # cut 명령은 콜론으로 구별하는 필드 중에서(-d:) 첫째 필드(-f1)를 추려낸다. /etc/passwd의 내용에서 첫째 필드를 추려내어 sorting한다.

백그라운드 작업

쉘에서는 오래 걸리는 작업을 백그라운드에서 진행시키고, 원하는 일을 포그라운드에서 할 수 있다. 예를 들어 아래와 같이

$ tar -xvf file1.tar &

명령어 뒤에 앰퍼샌드(&) 문자를 붙여주면

[1] 1009

같이 뜨고 프롬프트가 뜬다.

$

프롬프트에 다음 명령을 입력하면 된다.

$ jobs

jobs 명령어는 현재 실행 중인 백그라운드 작업을 확인하는 명령이다.
diff 유틸리티는 파일명을 인자로 받아서 두 가지 파일을 검사한다.

$ diff file1 file2 &

처럼 쓰면 터미널에 결과가 출력된다. 하지만 현재 작업하고 있는 내용과 diff 유틸리티의 결과를 잘 못 볼 수 있다. 이럴 때 출력을 파일로 바꿔준다.

$ diff file1 file2 > result_file &

[FPGA] Rocket Chip Generator

This document refer to this github link.

1. Background


각 repository가 무엇을 하고 있는지
1) rocket-chip
Rocket chip generator. RISC-V Rocket core를 만든다.

2) riscv-tools
RISC-V GCC/Newlib toolchain, RISC-V-LINUX Installation

3) fpga-zynq
Zynq FPGA boards에서 RISC-V rocket chip을 돌리는데 필요한 파일 들. Vivado 2016.2가 필요하다. prebuilt image들이 git submodule들로 이용가능하다.

발표할 것
1) Generate rocket core
2) Download rocket core to FPGA
3) Tool chain (중간 중간)
4) 로켓칩 파라미터 바꾸기. How can I parameterize my Rocket chip?


2. Rocket chip generator repository에 어떤 것들이 있는지?

Berkeley의 chip-building project는 git submodule 을 이용한다.

1) The Submodules

  • chisel3: RTL을 Chisel로 작성하였다.
  • firrtl: chisel3 컴파일러가 만들어내는 intermediate format
  • hardfloat: floating-point units 들을 위한 repository
  • context-dependent-environments: 이걸 이용해서 Chisel code의 parameter들을 바꾼다.
  • riscv-tools: riscv-tools 임.
  • torture: test code - randomized intruction streams which are then run as code on the rocket core(s)
2) The Sub Packages
Rocket-chip Chisel code base는 Scala package들로 나뉘어진다. 각 패키지에 대한 설명을 하겠다.

  • rocket: Rocket core, L1 cache source code
  • uncore: uncore logic, L2 coherence hub, coherent interfaces between tiles (tilelink), debug interface
  • junctions: bus protocols and interfaces
  • groundtest: uncore 쪽 테스트할 수 있는 패키지. rocket core 쪽은 instruction stream generator로 대체한다.
  • coreplex: rocket tiles, L1-to-L2 network, L2 coherence agents, boot ROM이나 debug unit 같은 internal devices를 잇는 역할을 한다.
  • rocketchip: Top level package. Instantiate the coreplex
synopsys의 vcs가 있다면 Verilog simulation 도 할 수 있다.
없다면 vsim을 make할 수 없다.

더불어 rocket-chip/emulator의 Makefile을 바꿀 필요가 있다.
아래 두 줄

rm -rf $@.vcd && mkfifo $@.vc
vcd2vpd $@.vcd $@ > /dev/null &

앞에 #를 써서 주석처리를 하도록 하자.

3. GTKWAVE를 사용해보자.

gtkwave를 통해서 디버깅을 시각적으로 할 수 있다.
* gtkwave 컴파일 방법
1) gtkwave 다운로드
2) ./configure --enable-local-libz
3) make
4) make install

* 사용법
gtkwave OutputFileName.vcd

4. Rocket chip의 파라미터를 변경해보자.

rocket-chip repository에 로켓칩 파라미터를 변경하는 내용이 있지만, 최신 코드와는 맞지 않는 부분이 있다.
현재 파라미터를 조정하는 부분은 내가 파악하기로,
rocket-chip/src/main/scala/rocketchip/configs.scala
rocket-chip/src/main/scala/coreplex/Configs.scala
groundtest와 unittest쪽에도 있는데 나중에 보기로 하고, 먼저 위 두 Configs.scala 파일에 집중하자.

coreplex/Configs.scala의 BaseCoreplexConfig에서 L1 cache의 set, way 개수를 변경 가능.

대표적인 config 소개
DefaultFPGAConfig - Default
DefaultFPGASmallConfig - small cache sizes, disables the FPU, turns off the fast early-out multiplier and divider, reduces the number of TLB entries --> For Zybo FPGA board(smallest ZYNQ)



2016년 10월 18일 화요일

[Scala] Chisel 2.2 Tutorial {01}

본 문서의 레퍼런스: https://chisel.eecs.berkeley.edu/latest/chisel-tutorial.pdf

Rocket chip generator에서 Chisel 언어를 사용한다. Chisel은 Constructing Hardware In a Scala Embedded Language의 약자이다. Rocket chip generator의 소스코드를 보면 .scala 파일인 것을 확인할 수 있다.

본 문서는 Scala 언어를 몰라도 볼 수 있다(고 써있긴 한데, 물론 알면 좋다).

1. Datatypes

Bits - raw collection of bits (1011 이런 것들)
SInt, UInt - signed and unsigned integers
Bool - boolean values
Bundle - struct 같은 것
Vecs - indexable collections of values. 배열같은 것인 듯

* 문서에서 literal value를 lit 이라고 표현한 듯
* Underscore는 string에 쓰일 수 있는데, 가독성을 위해서 쓰일 뿐 무시된다.

val - is used to name variables that have values that won't change (헷갈린다. 찾아보니, the internal state of a val can be changed but the object referred to by a val cannot. A val is not a constant. 즉, val sel = a | b 일 경우 a, b의 값에 따라 sel이 바뀔 수 있지만, sel = a | b 라는 것은 바뀔 수 없다는 뜻 인 듯. 다른 말로 sel = a & b 로 바뀔 수 없다는 뜻인 것 같다.)

2. Builtin Operators

Scala language. === for equality and =/= for inequality


x86 Address Translation Basics

x86 Address Translation Basics

AMD-V의 Nested Paging을 이해하기 위해서 먼저 x86 Address translation에 대해 알아보자.

Virtual address는 프로그램에서 instruction과 data에 접근하기 위해 사용하는 주소이다. 이 주소로 실제 메모리 주소인 physical address에 접근하려면 먼저 address translation 과정을 거쳐야 한다. Page table walker라는 것이 page table을 이용해서 virtual address를 physical address로 바꿔준다. Page table walker는 processor hardware에 (CPU에) 구현되어 있다.

Figure 1은 long mode에서의 page table walk를 보여주고 있다. 먼저 CR3 레지스터를 보고 Page-map level-4 base address를 확인한다. 47-39 bit, 38 - 30 bit, 29 - 21 bit을 타고 타고 20 - 12 bit의 Page-table offset으로 4KB 페이지를 특정 짓고 11-0 bit 의 physical-page offset으로 정확한 physical address를 가리키고 있다.
OS는 context switch를 할때 page table's base pointer (CR3)를 업데이트 한다.

AMD-V Nested Page Tables (NPT)

 gPT는 guest virtual address를 guest physical address로 맵핑하고 nPT는 guest physical address를 system physical address(machine address)로 맵핑한다.

2016년 10월 13일 목요일

[TMUX] TMUX 명령어 정리

글쓴이가 주로 쓰는 TMUX 명령어들만 모아서 정리를 해보았다. TMUX 카피는 이 링크를 참고하자.

tmux new -s [세션이름]
Ctrl-b : : 명령행으로 들어간다.
명령행에서 rename-session [new name]
Ctrl-b d : detach (tmux를 백그라운드로)
tmux ls : 생성되어 있는 세션 목록을 본다.
tmux attach -t 세션이름 : 세션 불러오기

Ctrl-b c : 새창(윈도우)을 생성합니다.
Ctrl-b d : 현재 클라이언트에서 떨어집니다.
Ctrl-b l : 이전에 선택한 윈도우로 이동합니다.
Ctrl-b n : 다음 윈도우로 이동합니다.
Ctrl-b p : 이전 윈도우로 이동합니다.
Ctrl-b w : 윈도우의 리스트를 보여주고 번호를 입력하면 이동합니다.
Ctrl-b 윈도우번호 : 해당 윈도우로 이동합니다.
Ctrl-b & : 현재 윈도우를 종료합니다.
Ctrl-b , : 현재 윈도우의 이름을 바꿉니다.

Ctrl-b % : 세로로 2개의 팬 // 많이 쓴다.
Ctrl-b " : 가로로 2개의 팬
Ctrl-b q : 팬 번호를 보여준다.
Ctrl-b { : 왼쪽 팬을 이동(교체)
Ctrl-b } : 오른쪽 팬을 이동(교체)
Ctrl-b 방향키(위아래) : 팬 이동
Ctrl-b 누른채로 방향키(좌우) : 현재 팬의 사이즈를 조정한다.
Ctrl-b o : 다음 팬으로 이동 // Ctrl-b 를 누른채로 o를 누르면 팬 위치가 바뀐다.(swap)
exit 입력 or Ctrl-d : 팬 종료

exit : 세션도 종료 가능

tmux는 터미널 프로그램의 스크롤은 먹지 않습니다.
스크롤은 Ctrl-b [ 를 사용하시면(여는 대괄호입니다) 우측 상단에 페이징 표시가 되고
페이지 업/다운이나 위/아래 화살표로 이동할 수 있습니다. q누르면 빠져나옵니다.

2016년 10월 10일 월요일

[TMUX] TMUX copy tutorial

TMUX 카피에 대해서 알아보겠다. TMUX 카피는 TMUX 터미널에 띄어져 있는 텍스트들을 복사하고 붙여넣을 수 있는 기능이다. (TMUX 카피 모드라고도 하는 듯)

1. 먼저 configuration 파일을 만들자.
$ cd ~
$ vim .tmux.conf

2. .tmux.conf에 아래 내용을 추가한다.
# Remap prefix from 'C-b' to 'C-a'
# TMUX에서는 Ctrl + b를 먼저 눌러서 커맨드를 입력하는데 Ctrl 키에서 b가 멀어서 a로 맵핑하는 설정. 아래 세 줄
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix

# vi mode 이용
setw -g mode-keys vi

# vi 에 익숙한 사람을 위한 키 리맵핑
unbind [
bind Escape copy-mode
unbind p
bind p paste-buffer
bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection
3. .tmux.conf 파일을 종료한다.

4. tmux를 켜고 복사 & 붙여넣기를 해보자.

Ctrl + a
Esc
# 카피 모드에 들어왔다. 커서를 복사를 시작할 곳으로 옮기자. hjkl 키를 이용한다.
v
# 복사를 끝낼 곳으로 커서를 옮기자. y를 누르면 복사가 된다.
y
# 붙여넣을 곳으로 이동해서 붙여넣기를 하자. vi의 경우 편집모드로 변환한 뒤에 붙여넣기를 하자.
Ctrl + a
p

2016년 10월 7일 금요일

[FPGA] Zedboard에 rocketchip (RISC-V) 올리기

0. 환경설정

리눅스의 config option에 CONFIG_USB_SERIAL과 CONFIG_USB_SERIAL_CYPRESS_M8 이 y 로 되어있어야 한다. m 으로 되어있다면 y로 바꿔주고 리눅스를 재컴파일하자. 내 리눅스 배포판은 우분투 14.04-4 이다. 커널은 3.18.30을 올렸다.

Vivado 2016-2 설치


로켓칩 설치


위 github 의 quick instructions 를 따라해보자.

1. Quick instructions


1) $ make fetch-images

2) $ make fetch-riscv-linux

3) SD카드에 이미지 카피
$ make load-sd SD=path_to_mounted_sdcard
나의 경우 $ make load-sd SD=/media/jsim/6910-C05B

4) minicom 실행

미니컴이 없다면 apt-get 으로 설치한다.

$ dmesg | grep tty
ttyACM0 가 있음을 확인

$ sudo minicom -s

serial port setup에서 A를 눌러서 Serial Device 이름을 /dev/ttyACM0 로 바꿔준다. serial port setup이 안보인다면 Ctrl-A Z 를 눌러서 커맨드 창을 불러와서 O를 누른다.

5) SD카드를 빼서 보드에 끼고 전원을 올린다.

시리얼 포트로 통신한다.


6) 부팅 시키기
zynq-uboot> boot

id 와 password는 root / root 이다.

7) fesvr-zynq 프로그램으로 소프트코어에서 프로그램을 돌릴 수 있다.
./fesvr-zynq pk hello

8) Mounting the SD Card on the Board

root@zynq:~# mkdir /sdcard
root@zynq:~# mount /dev/mmcblk0p1 /sdcard

할 일을 끝냈으면 unmount 한다.

root@zynq:~# umount /sdcard


Building Everthing from scratch

먼저 JDK와 SBT가 필요하다.

JDK 는 알아서 다운로드, SBT는 다음과 같이 다운로드한다.

echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
sudo apt-get update
sudo apt-get install sbt


아래 포스트는 무시할 것. 쓰다가 날라가서 내용이 정확하지 않습니다.
2. Pushing Your Rocket Modifications to the FPGA


1) Setting Up Workspace

rocket 카피가 없다면 다음 명령어로 클론한다.
$ cd [fpga-zynq dir]/zedboard
$ make init-rocket-submodule

쓴게 날라갔다.현재 https://github.com/riscv/riscv-tools#linuxman 에서

3.14.79 linux curl 까지 하고 집에 감.

Configuring the Linux Kernel 부터 해볼 것.

Linux configure 시에
$ make ARCH=riscv menuconfig
/ HTIF 의 다섯번째 옵션 HTIF_RFB 는 n으로 할 것

주의! busybox make menuconfig 시에
  • CONFIG_STATIC=y, listed as "Build BusyBox as a static binary (no shared libs)" in BusyBox Settings → Build Options
  • CONFIG_CROSS_COMPILER_PREFIX=riscv-linux-, listed as "Cross Compiler prefix" in BusyBox Settings → Build Options --> riscv64-unknown-linux-gnu- 로 바꿀 것.
  • CONFIG_FEATURE_INSTALLER=y, listed as "Support --install [-s] to install applet links at runtime" in BusyBox Settings → General Configuration
  • CONFIG_INIT=y, listed as "init" in Init utilities
  • CONFIG_ASH=y, listed as "ash" in Shells
  • CONFIG_ASH_JOB_CONTROL=n, listed as "Ash → Job control" in Shells
  • CONFIG_MOUNT=y, listed as "mount" in Linux System Utilities

2016년 9월 13일 화요일

[FPGA] Altera DE2 보드에 LEON3 프로세서 로드(성공), 리눅스 돌리기(아직 성공 못함)

LEON3 는 open source soft-core processor 이다. SPARC V8 아키텍처에 기반하고 있다.
연구실에 있는 DE2 보드에 LEON3 프로세서를 로드하는데 성공했지만, 임베디드 리눅스를 돌리는 작업은 실패하였다.
이 블로그를 참고하였다.

0. 환경설정

리눅스의 config option에 CONFIG_USB_SERIAL과 CONFIG_USB_SERIAL_CYPRESS_M8 이 y 로 되어있어야 한다. m 으로 되어있다면 y로 바꿔주고 리눅스를 재컴파일하자.

1. LEON3 프로세서 로드

1) LEON3 프로세서 소스코드 다운로드

먼저 http://gaisler.com/index.php/downloads/leongrlib 에서 LEON3/GRLIB source code 와 GRFPU netlists for Xilinx and Altera 를 다운로드한다. grlib-netlists-gpl-1.5.0.tar.gz는 grlib-gpl-1.5.0-b4164 디렉토리 안에 압축을 푼다.

$tar -xzvf grlib-gpl-1.4.1-b4156.tar.gz
$cd grlib-gpl-1.4.1-b4156
$tar -xzvf ../grlib-netlists-gpl-1.4.1.tar.gz

designs 디렉토리는 개발 보드별 개발 환경을 담고 있다. DE2 보드의 경우 /home/jsim/fpga/grlib-gpl-1.5.0-b4164/designs/leon3-altera-de2-ep2c35 에서 LEON3 프로세서 소스코드를 컴파일 할 수 있다. 환경 설정과 합성 방법에 대한 설명은 동일 디렉토리의 README.txt를 참고하자. 내가 한 방법은 아래에 쓸 것이다.

2) Quartus II 13.0sp1 다운받기.

DE2 보드에 프로세서를 로드하기 위해서는 Altera에서 제공하는 Quartus 툴이 필요하다.
make를 하기 전에 quartus ii를 받아야 한다. DE2보드를 서포트하는 마지막 quartus ii 버전인 13.0sp1 버전을 다운 받자. 리눅스를 선택하고 Individual Files에서 Quartus II Software (includes Nios II EDS) 와 device support 파일인 Cyclone II, Cyclone III, Cyclone IV device support (includes all variations) 를 다운 받도록 한다. .run 파일이 받아질텐데 chmod로 실행권한을 주고 실행시킨다.

$chmod +x QuartusSetupWeb-13.0.1.232.run
$./QuartusSetup-13.0.1.232.run

3) PATH 설정

quartus bin과 linux 를 PATH 환경변수에 추가해야 make를 할 수 있다. /home/jsim (사용자 홈디렉토리)의 .bashrc 파일의 제일 아래에 다음을 추가한다.

QUARTUS_HOME=/home/jsim/altera/13.0sp1/quartus
PATH=$PATH:$QUARTUS_HOME/bin:$QUARTUS_HOME/linux

터미널을 종료하고 새로 켜서 바뀐 .bashrc를 적용시킨다.

4) make and synthesis

$cd /home/jsim/fpga/grlib-gpl-1.5.0-b4164/designs/leon3-altera-de2-ep2c35
$make xconfig

LEON3MP Design Configuration 창이 뜨면 Processor 버튼을 누르고, MMU 버튼을 눌러서 Enable MMU를 y로 바꿔준다. 그 후에 Save and Exit 버튼을 누르면 config.vhd 파일이 만들어진다.

$make quartus
기기 연결
$cd /home/jsim/altera/13.0sp1/quartus/bin
$sudo su
$./jtagd
$exit
$cd /home/jsim/fpga/grlib-gpl-1.5.0-b4164/designs/leon3-altera-de2-ep2c35
$make quartus-prog-fpga

를 하면 LEON3 프로세서(.sof 파일)가 DE2 보드에 올라가게 된다.

2. 리눅스 로드

grmon은 이용하여 리눅스 이미지를 올릴 것이다. grmon은 일종의 디버깅 툴로 LEON3에 접속해 LEON3의 상태를 확인하거나 리눅스 이미지를 올리고 실행할 수 있다.

1) grmon 설치

$wget http://www.gaisler.com/anonftp/grmon/grmon-eval-2.0.77.tar.gz
$tar -xzvf grmon-eval-2.0.77.tar.gz

2) PATH 설정

.bashrc에서 PATH 환경변수를 변경하자.

GRMON_HOME=/home/jsim/fpga/grmon-eval-2.0.77/linux
PATH=$PATH:$GRMON_HOME/share:$GRMON_HOME/lib

3) 리눅스 이미지를 다운

$wget http://gaisler.com/anonftp/linux/linux-2.6/old/2.6.21/images/gr_xc3s_1500/image.dsu

4) grmon 실행

$cd /home/jsim/fpga/grmon-eval-2.0.65/linux/bin
PATH 설정이 잘 안되었는지 quartus  linux 설정을 다시 해주고 grmon을 실행하였다.
$export LD_LIBRARY_PATH=/home/jsim/altera/13.0sp1/quartus/linux
필요한 패키지들도 설치해주었다. (32비트용 패키지)
$sudo apt-get install libnspr4:i386
$sudo apt-get install libusb-0.1-4:i386
이외에도 패키지가 더 필요하다고 하면 알맞는 패키지를 깔아주면 된다.
$./grmon -altjtag -nb -u
grmon2>
이라는 쉘이 뜬다. 다운로드 받은 리눅스 이미지를 로드해준다.
grmon2> load /home/jsim/fpga/image.dsu
grmon2> run

만약 debugging mode가 아니라고 뜬다면 DE2 보드의 KEY1 을 눌러주고 다시 실행시켜본다. KEY1을 누르면 디버깅 모드가 된다.

나의 경우

grmon2> run
Booting Linux
Booting Linux...
PROMLIB: Sun Boot Prom Version 0 Revision 0
Linux version 2.6.21.1 (daniel@neptune) (gcc version 3.4.4) #81 Thu Dec 6 10:27:29 CET 2007
ARCH: LEON
             Vendors         Slaves
Ahb masters:
 0( 1:  3| 0):   VENDOR_GAISLER    GAISLER_LEON3 
 1( 1: 1c| 0):   VENDOR_GAISLER  GAISLER_AHBJTAG 
Ahb slaves:
 0( 4:  f| 0):       VENDOR_ESA        ESA_MCTRL 
 +0: 0x0 (raw:0x3e002)
 +1: 0x0 (raw:0x20000002)
 +2: 0x0 (raw:0x40030002)
 1( 1:  6| 0):   VENDOR_GAISLER   GAISLER_APBMST 
 +0: 0x80000000 (raw:0x8000fff2)
 2( 1:  4| 0):   VENDOR_GAISLER GAISLER_LEON3DSU 
 +0: 0x90000000 (raw:0x9000f002)
 3( 1:  9| 0):   VENDOR_GAISLER   GAISLER_SDCTRL 
 +0: 0x40000000 (raw:0x4003ff82)
 +1: 0xfff00100 (raw:0x10fff3)
Apb slaves:
 0( 4:  f| 0):       VENDOR_ESA        ESA_MCTRL 
 + 0: 0x80000000 (raw:0xfff1) 
 1( 1:  c| 2):   VENDOR_GAISLER  GAISLER_APBUART 
 + 0: 0x80000100 (raw:0x10fff1) 
 2( 1:  d| 0):   VENDOR_GAISLER    GAISLER_IRQMP 
 + 0: 0x80000200 (raw:0x20fff1) 
 3( 1: 11| 8):   VENDOR_GAISLER  GAISLER_GPTIMER 
 + 0: 0x80000300 (raw:0x30fff1) 
 4( 1: 6c| 0):   VENDOR_GAISLER Unknown device 6c 
 + 0: 0x80000400 (raw:0x40fff1) 
 5( 1: 60| 5):   VENDOR_GAISLER      GAISLER_KBD 
 + 0: 0x80000500 (raw:0x50fff1) 
 6( 1: 61| 0):   VENDOR_GAISLER      GAISLER_VGA 
 + 0: 0x80000600 (raw:0x60fff1) 
 7( 1: 1a| 0):   VENDOR_GAISLER  GAISLER_PIOPORT 
 + 0: 0x80000900 (raw:0x90fff1) 
 8( 1: 1a| 0):   VENDOR_GAISLER  GAISLER_PIOPORT 
 + 0: 0x80000a00 (raw:0xa0fff1) 
 9( 1: 52| 1):   VENDOR_GAISLER Unknown device 52 
 + 0: 0x80000f00 (raw:0xf0fff1) 
TYPE: Leon2/3 System-on-a-Chip
Ethernet address: 0:0:0:0:0:0
CACHE: direct mapped cache, set size 4k
CACHE: not flushing on every context switch
Boot time fixup v1.6. 4/Mar/98 Jakub Jelinek (jj@ultra.linux.cz). Patching kernel for srmmu[Leon2]/iommu
node 2: /cpu00 (type:cpu) (props:.node device_type mid mmu-nctx clock-frequency uart1_baud uart2_baud )
PROM: Built device tree from rootnode 1 with 918 bytes of memory.
DEBUG: psr.impl = 0xf  fsr.vers = 0x7
Built 1 zonelists.  Total pages: 1207
Kernel command line: console=ttyS0,38400 rdinit=/sbin/init 
PID hash table entries: 32 (order: 5, 128 bytes)
Todo: init master_l10_counter
Attaching grlib apbuart serial drivers (clk:50hz):
Console: colour dummy device 80x25
Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Memory: 4296k/8192k available (1536k kernel code, 3896k reserved, 180k data, 1440k init, 0k highmem)
Mount-cache hash table entries: 512
NET: Registered protocol family 16
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 512 (order: 0, 4096 bytes)
TCP bind hash table entries: 512 (order: -1, 2048 bytes)
TCP: Hash tables configured (established 512 bind 512)
TCP reno registered

라고 뜬 뒤 깜깜 무소식이다.리눅스 이미지가 커서 더 작게 만들어야 하는것인지 확인을 해봐야 할 듯 싶다. 바쁜 일을 마무리하고 다음주나 다다음주 쯤에 한 번 더 시도해볼 듯 하다.



2016년 7월 10일 일요일

[파이썬] 인트로

파이썬을 이용해서 게임을 만들어보자. 저자는 파이썬을 거의 써본 적이 없음을 밝힌다. 이 프로젝트를 진행하면서 배우려 한다. 다음 책을 참고하였다. 헬로! 파이썬 프로그래밍

파이썬은 2.7.3 버전을 사용한다. 파이썬 3 버전은 단순히 기존 버전을 업그레이드한 버전이 아니다. 파이썬 3 사용시 파이썬 2의 코드가 제대로 동작하지 않을 수 있다.

몇 가지 기억할 것
1. 파이썬은 대소문자를 구분한다.
2. 제곱은 다음과 같이 한다. 3 ** 5 = 3*3*3*3*3 정수가 아닌 수로도 제곱할 수 있다. e.g., 3 ** 5.5
3. 나머지를 구하려면 % 기호를 쓴다. 7%2 = 1
4. 자료형 변환
    1) float()는 문자열이나 정수로부터 새로운 실수를 만든다.
    2) int()는 문자열이나 실수로부터 새로운 정수를 만든다. (항상 버림을 한다.)
    3) str()은 숫자로부터 새로운 문자열을 만든다.
    4) type()은 변수의 자료형이 무엇인지 알려준다.
5.  comma를 사용하면 print문을 한 줄로 만들 수 있다.
6. 기다리는 함수 time.sleep(1)    // 1초 기다린다.
7. 주석은 # 를 이용.
8. 전역변수를 함수 안에서 사용해도 함수 밖에서 전역변수는 변하지 않는다. 이름은 왠만하면 재사용하지 마라.
9. 함수 내에서 global 키워드를 이용하면 전역변수를 사용한다.
10. pass 키워드는 코드를 채우는 용도로 사용할 수 있다. (나중에 구현할 함수 내용에 pass 라고 써놓으면 된다.)

입력받기
raw_input()
e.g, someName = raw_input("Enter your name: ")
사용자가 문자열로 입력한 내용이 someName에 할당된다.

실수 입력받기
e.g., fahrenheit = float(raw_input())

헷갈리지 않기 위해 input 대신 raw_input 함수를 권장한다. input은 숫자를 받는 함수이다.

반복하기
e.g, for looper in range (1,5):    // 4번 반복 [1, 2, 3, 4]
e.g., for i in range(5):    // 5번 반복 [0, 1, 2, 3, 4]
e.g., for i in range(1, 10, 2):    // 2간격을 두고 반복함. [1, 3, 5, 7, 9]
e.g., for i in range(10, 1, -1):    // 1씩 감소해서 2까지. [10, 9, 8, 7, 6, 5, 4, 3, 2]
e.g., for i in range(0, numStars)

e.g., while someInput == '3':
break 와 continue를 이용하여 반복문에서 벗어난다. continue는 다음 반복으로 건너뛴다.

리스트와 딕셔너리
1. 리스트
리스트에 항목추가하기
>>> friends = []    # 빈 리스트를 새로 만듦
>>> friends.append('David')    # 리스트에 "David" 항목 추가
>>> print friends[0]    # 리스트에서 인데그 0번 항목 가져오기

리스트 자르기
>>> print friends[1:4]    # 1, 2, 3인덱스를 가져온다. 복사한 것이지 실제로 자른 것은 아님.
축약형
>>> friends[:2]    # 0, 1 인덱스 가져옴
>>> friends[2:]    # 2부터 끝까지 가져옴
>>> friends[:]    # 전체 리스트의 사본 만들기
리스트에 항목추가
1. append() 끝에 하나 추가
2. extend() 끝에 여러 개 추가
3. insert() 특정 위치에 항목 추가. 특정 위치의 내용부터 끝까지 한 칸 씩 밀린다.

리스트에서 삭제하기
1. remove() 선택한 항목을 삭제하고 버림.
2. del() 인덱스를 이용하여 삭제
3. pop() 마지막 항목을 가져와 돌려줌. 특정 인덱스를 지정하여 가져올 수도 있음.

리스트에서 찾기
in 키워드 이용
e.g., if 'a' in letters:
index() 함수 이용: 해당 항목이 어느 위치에 있는지 확인
>>> letters = ['a', 'b', 'c', 'd', 'e']
>>> print letters.index('d')
리스트에 값이 발견되지 않으면 오류가 발생하므로 다음과 같이 사용한다.
if 'd' in letters:
    print letters.index('d)

리스트 정렬
letters.sort() 이 메서드는 리스트 자체를 수정한다.
letters.reverse() 역순 정렬
letter.sort(reverse = True) 역순 정렬
newer = sorted(original) 원본 리스트는 그대로 두고 정렬함.

불변 리스트 - 튜플
변경 불가능한 리스트가 튜플이다.
my_tuple = ("red", "green", "blud")    # 대괄호 대신 중괄호를 사용한다.

2. 딕셔너리
딕셔너리는 두 개의 항목을 서로 연관 시키는 방법이다. 두 항목은 key, value이다.
딕셔너리를 만들자.
>>> phoneNumbers = {}
항목 추가
>>> phoneNumbers["John"] = "555-1234"
혹은
>>> phoneNumvers = {"John": "555-1234"
항목 찾기
>>> print phoneNumbers["John"]
리스트와 달리 딕셔너리는 항목간에 정해진 순서가 없다. 딕셔너리 내의 항목은 키를 통해 접근한다.

키, 값의 리스트 보기
>>> phoneNumbers.keys()
>>> phoneNumbers.values()

항목 삭제
>>> del phoneNumbers["John"]

모든 항목 삭제
>>> phoneNumbers.clear()

in 키워드를 이용해 특정 키가 존재하는지 확인
>>> "Bob" in phoneNumbers
True or False

함수
def printMyAddress(myName):    # 함수 정의
    print myName
    print "Warren Sande"
    print "Main Street"
    return myName

printMyAddress("jsim")    # 함수 호출

객체
함수와 데이터를 함께 묶는다. class

모듈
모듈을 import 해서 사용. 사용 시에 구체적으로 어떤 모듈인지 알려줘야 한다.
e.g., Animal.Animal(1, "jsim")

import Animal

from을 이용해 가져올 수도 있다.
from Animal import Animal    # 이렇게 하면 Animal. 을 넣지 않고도 Animal 클래스를 이요할 수 있다.

표준모듈
time 모듈 - sleep()
random 모듈 - 난수를 만들어낼 떄 사용 random.randint(0,100)

2016년 4월 18일 월요일

[Bash] 배시 기본 {01}

참고문헌: Learning the bash shell. 캐머런 뉴햄, 빌 로젠블랫 저, 배장렬 역 O'Reilly, 한빛미디어

명령을 입력하면 몇 가지 이벤트 계층(event layer)이 발생하여 명령을 처리하지만 여기서는 최상위 계층인 셸(shell)만을 다룬다.  셸이란 운영체제의 사용자 인터페이스로서 사용자가 입력한 명령(command line)을 운영체제가 이해할 수 있는 명령(instructions)으로 바꾸고 운영체제가 처리한 결과를 사용자에게 돌려주는 일종의 프로그램이다. 셸 자체는 리눅스(유닉스)가 아니라 사용자 인터페이스이다. 유닉스는 사용자 인터페이스와 운영체제가 분리된 최초의 운영체제다.

자신의 셸이 무엇인지 확인하고 싶다면 다음을 입력한다.
$ echo $SHELL

배시가 시스템의 어느 디렉토리에 있는지 알고 싶다면 다음을 입력한다.
$ whereis bash


--- TIP ---
$ cd -
// 이전 디렉토리로 돌아간다.
-----------

ls 명령

duchess 파일이 있을 때 ls duchess를 치면 duchess만 표시된다.
-l 옵션을 사용하면 해당 파일의 소유자, 크기, 마지막 수정 날짜와 같은 정보를 출력하고  -a 옵션을 사용하면 숨긴파일을 표시한다.
셸이 제공하는 와일드카드를 이용하면 특정 파일명을 한 번에 지정할 수 있다.

? : 문자 하나
* : 문자 여러 개
[set] : set에 있는 임의 문자
[!set] : set에 없는 임의 문자

set에는 문자 리스트 [abc] or [-_ ] or [!0-9]나 어떤 범위 [a-z]를 말한다. 느낌표 자체를 의미하고 싶으면 역슬래시를 입력한다.(\!) 대소문자를 섞어서 사용하는 것은 아무런 의미도 없다. [a-Z], [A-z]