Objective-C 프로그래밍을 경험해 봤다면 어색하게 느껴지지 않겠지만, 그렇지 않은 사람들에게는 IBOutlet과 IBAction이 무슨 역할을 하며 왜 필요한지에 대해서 의아해 할 것이다. 간단해 보이지만, 아이폰 프로그래밍에 있어서 없어서는 안될 중요한 존재이다. 이것들이 없다면 아무리 멋지게 프로그램을 작성하여도 연결선이 끊어진 조이스틱을 두드리는 것과 마찬가지가 되는 것이다.




아웃렛(IBOutlet)
아웃렛은 IBOutlet 키워드를 사용하여 선언하는 인스턴스 변수들이다. 아웃렛이 하는 역할은 정말로 단순하다. 컨트롤러 헤더 파일에 선언한 객체를 인터페이스 빌더가 알아 볼 수 있도록 해준다. xib파일 안의 객체와 연결을 하고자 하는 모든 인스턴스 변수들은 IBOutlet 키워드로 다음과 같은 형식으로 선언이 되어야 한다.

@property (nonatomic, retain) IBOutlet UILabel *newLabel;

아웃렛으로 선언된 인스턴스 변수는 프로젝트가 빌드되면서 가장 먼저 전처리기에서 번역되고, 그것이 xib 파일과 연결된 객체라는 사실이 컴파일러에게 전달된다. 프로젝트의 실행과 관련된 컴파일에서는 아무런 영향을 미치지 않는것이다. 하지만, 이것이 없다면 인터페이스 빌더는 어떻게 객채들과 연결해야 할지 모른체 빌드를 실행하게 될 것이다. 마치 지금 당장 전화를 걸어야 하는 상황에서 어떤 전화기를 가지고 어디로 전화를 해야 할찌 모르는 상황과 비슷하다고 할 수 있다.


액션(IBAction)
액션은 IBOutlet과 마찬가지로 컨트롤러 헤더파일에서 하나의 메소드 형태로 선언되어 그 역할을 하게 된다. IBAction이 선언되면 이 메소드가 액션 메소드라는 것을 인터페이스 빌더에게 알려주게 되며, 컨트롤러를 통해서 호출이 가능해 진다. 액션 메소드는 헤더파일에서 다음과 같은 형식으로 선언된다.

 - (IBAction)newAction:(id)sender;

메소드의 형식을 갖는 IBAction는 void를 리턴 타입으로 가진다. 액션 메소드는 변수값을 리턴하지 않는다는 것이다. 액션 메소드는 하나의 인자값을 갖게 되는데, 이것은 sender라는 이름의 id 타입으로 정의되고, 포인터 값이 전달된다. 이것은 똑같은 액션 메소드를 호출하는데 있어서 어떤 액션을 통해서 메소드를 호출하였는지 구분하는 구분자의 역할을 하게 된다. 만약 버튼이 하나밖에 없는 것 처럼, 액션의 구분이 필요하지 않다면 뒷부분의 '(id)sender' 를 제거하고 작성하면 가능하다. 하지만 버튼이 여러게 있는데 '(id)sender' 를 제거하면 모든 버튼이 동일한 역할만을 하게 될 것이다.


생성자와 변경자를 자동으로 생성해주는 @property를 선언하자!
C++ 나 JAVA같은 객체지향 언어를 다루다 보면, 기능을 모듈화 하고, 데이터를 보호하기 위해 하나의 객체에 생성자와 변경자를 만드는 것을 보게 된다. 생성하는 클래스나 객체가 적을때는 그리 어렵지 않겠지만, 늘어나는 클래스 객체의 getter(생성자 메소드)와 setter(변경자 메소드)를 일일이 생성하는 것은 매우 지루한 일이 될 수 있다. Objective-C에서의 프로퍼티는 이러한 Getter 와 Setter를 자동으로 생성해 주어 개발자의 수고를 조금이나마 덜어준다. 오브젝티브 C의 프로퍼티에는 몇가지 속성들이 있는데 retain, nonatomic 의 두가지의 속성은 아이폰 애플리케이션을 작성하는데 있어서 많이 사용되는 속성이다.

retain : 리테인은 메모리에 할당된 특정 객체를 참조하는 것을 의미한다. 각 객체는 리테인 카운트라는 데이터를 가지게 되는데, 객체가 호출될때마다 카운트 값을 증가시키고, 릴리즈 될때에는 카운트 값을 하나 감소시키면서 그 객체가 사용되고 있는지의 여부를 판단하게 된다. 이것은 메모리를 효율적으로 관리하기 위한 하나의 수단으로 이용된다.

nonatomic : 접근자와 변경자 메소드가 생성되는 방법을 바꾼다. 이 옵션에 대해 디폴트로 설정되어 있는 atomic의 경우 멀티 스레딩이 가능한 코드들을 추가로 생성하게 된다. 하지만 명시적으로 nonatomic을 설정함으로 멀티 스레딩의 가능성을 줄이고, 불필요한 것들로 인한 오버헤드를 상당부분 줄일 수 있다. 어느정도 자원 사용에 있어서 한계가 있는 아이폰 프로그래밍의 경우, 메모리에 사용에 대한 치밀한 접근이 필요하다.



아웃렛, 액션, 프로퍼티는 아이폰 프로그래밍을 하는데 있어서 필수적인 요소들이다. 어렵지 않은 역할을 가지고 있지만, 그 기본을 탄탄히 함으로써 좀더 규모있는 애플리케이션을 다루게 될때 당황하지 않고 적절하게 대응할 수 있는 것이다.


출 처 : http://devist.tistory.com/39

자료형

사용하는 데이터 종류 및 범위

String

문자열

Array<T>

배열, 제너릭으로 사용하기 위해 T(임의의 자료형을 말한다)으로 표기했다.

Dictionary<T,S>

사전형, T형으로 된 키와 S형으로 된 값을 갖고 있다.

Int8

정수형이며, -128 ~ 127까지의 정수값을 저장한다.

Int16

정수형이며, -32,768 ~ 32,767까지의 정수값을 저장한다.

Int32

정수형이며, -2,147,483,648 ~ 2,147,483,647까지의 정수값을 저장한다.

Int64

정수형이며, -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 까지의 정수값을 저장한다. 보통 Int라고 사용하면 Int64를 의미한다. 그 이유는 현재 swift가 실행되는 운영체제가 64bit 운영체제이기 때문이다.

Uint8

정수형이며, 0부터 255까지의 양수 값만을 갖는다.

Uint16

정수형이며, 0부터 65,535까지의 양수 값만을 갖는다.

Uint32

정수형이며, 0부터 4,294,967,295까지의 양수 값만을 갖는다.

Uint64

정수형이며, 0부터 18,446,744,073,709,551,615까지의 양수 값만을 갖는다.

Float32

비트의 부동소수점 데이터를 가지며 Double 형의 정밀도가 필요하지 않는 경우에 주로 사용한다.

Double64

비트의 부동소수점 데이터를 가지며 소수점 이하의 값을 정밀하게 표현하는 경우에 사용한다.

Bool

Truefalse 값 중 하나를 표현하는 경우에 사용한다.


http://finalcut-pro.tistory.com/183




아래의 링크에서 확인 가능함..


http://blog.cahg.org/wp/?p=271




Notice : 본 일련의 vim tips 시리즈를 보려면 category 에서 vim-tips 를 눌러 보면 된다.

1. TAGS 사용하기

http://orchistro.tistory.com/entry/vim-tips

2. Playing with make

http://orchistro.tistory.com/entry/vim-tips-2-make

3. Playing with grep

3-1. cscope 와 grep

앞선 section 들에서는 ctags 를 이용해서 소스 파일을 분석하고 따라 가는 방법과, make 를 이용해서 작업 능률을 한층 높이는 방법에 대해서 기록하였다.

그런데, 아직 뭔가 아쉬운 것이 있다. ctags 를 vim 과 함께 쓰면, 함수나 변수의 정의되어 있는 곳으로는 쉽사리 뛰어 갈 수 있는데, 그 역이 되는 일, 즉, 특정 함수를 호출하거나 특정 변수 (전역변수) 를 사용하는 곳을 찾는 방법은 없어 보인다.

여태껏 해 왔던 대로, shell 로 나가서 grep 을 한 다음 그 결과를 눈섭을 찡그리면서 읽고, 다시 vim 에서 해당 파일을 열어서 확인하는 과정을 거쳐야만 할까?

물론, 함수를 호출하는 부분들을 쉽사리 찾아가는 방법이 존재한다. 바로 cscope 를 이용하는 것인데, 내가 사용해 본 바로는, cscope 는 소스의 양이 많아지면 db 생성하는 데만도 수십초씩 걸렸다. 게다가, 인터페이스도 그다지 마음에 들지 않았다. 만약 수십명이 공동으로 작업해서 빠르게 변하는 소스 트리에서 작업한다면, 매번 소스 repository 에서 업데이트를 받을 때 마다 cscope DB 를 새로 빌드해 주어야 하는 귀찮음(!)을 감수해야만 할 것이다. 게다가 한번 DB 를 갱신하는데에 걸리는 시간이란!

그래서 나는 그냥 이전에 하는 대로 grep 을 이용하는 것을 선호하는 편이다.

여담인데, grep 이 왜 grep 인지 혹시 알고 있는가?

'g/re/p'

라는 ed 명령어가 그 이름의 기원이다. 믿거나 말거나... (vim 의 help 페이지에서 본 내용이다.)

혹시라도 이거, 정말 그런지 직접 해 보실 분은, 해 보시도록... grep 의 출력과 매우 흡사한 출력이 나온다.

$ ed foo.c
3456
g/foo/p
.
.
.
q
$

3-2. vimgrep vs. gnu-grep

방금 grep 을 언급했으니 당연히 앞 절의 make 처럼 grep 도 vim 에서 편리하게 쓰는 방법이 존재할 것이라는 눈치를 다들 챘을 것이다.

vim 에서 쓸 수 있는 grep 의 종류는 크게 두 가지이다. 

먼저, vim 7 부터 추가된 vim 의 내장 grep 과, 외부의 grep 프로그램이 그것인데, 먼저, 내장 grep 은 좀 느리고, 무엇보다 내가 써 보지 않았기 때문에 별로 권하고 싶지 않다. 그러면, external grep 을 쓰라는 이야기인데, 좋은 grep 프로그램으로 GNU grep 쓰기를 권한다 (아니, gnu grep 을 써야 앞으로 설명할 기능들을 사용할 수 있다.) 내가 알기로 현재 최신 버젼은 2.5.3 인데, -i 옵션에 버그가 (가끔 무한루프 -_-) 있는 것 처럼 보이긴 하지만, 가장 강력한 기능을 지원 (특히 --exclude-dir option) 하므로 그 버젼을 쓰기 바란다 (2.5.1 을 써도 기능 사용에 문제는 없다). 자신의 시스템에 grep 이 없다면, 간단하다. ftp://ftp.gnu.org 에서 소스를 받아서 컴파일해서 설치하면 된다. 컴파일이 귀찮은 분들은 아래 자료를 참조하시라 :

Solaris : http://www.sunfreeware.com
HP-UX : http://hpux.connect.org.uk
AIX : 알아서 설치하세요. -_-;;;
ubuntu : 8.04 부터였던가... 아마 기본으로 깔린 grep 이 GNU grep 2.5.3 이었던 것 같다.
OSX (Leopard) : 2.5.1 이 깔려 있긴 한데, 그냥 위의 ftp 에서 받은 다음에 ./configure;make;make install 하면 문제 없이 잘 깔린다.
windows : cygwin 을 설치하면 grep 도 깔리더라....;;; 써 본 지가 하도 오래 되어서.. ( '-')

3-2. 설치

이제, grep 프로그램이 준비되었으므로 vim 과 grep 의 연결 작업을 해 줄 차례이다. 그러자면, vim 의 grep plugin 을 설치해야 한다. 뭐가 이렇게 복잡하냐고? grep 처럼 강력한 프로그램을 vim 에 통합(?) 시키는데, 이정도의 수고는 해 주어야 하지 않겠는가...;

사실, 별도의 vim plugin 설치 과정은 필요가 없기도 하다. 그렇지만, plugin 설치하는 방법도 알아 보고, 또, 무엇보다, grep plugin 을 쓰는 게 vim 의 grepprg 변수를 세팅해서 쓰는 것보다 편하니 plugin 을 설치하는 방법을 설명하겠다. 물론, 별도의 plugin 없이 사용하는 방법도 이 글 말미에 적어 놓도록 하겠다. 

우선, 아래의 파일을 다운로드 해서 여러분의 홈 디렉토리의 .vim/plugin/grep.vim 이라는 이름의 파일로 저장하도록 하자. 디렉토리가 존재하지 않는다면 만들자 : (심심하면 그리 어렵지 않으니 스크립트를 한번쯤 읽어 보는 것도 좋겠다. 내가 수정한 부분은s:RunGrepRecursive() 함수이다.)


이 플러그인은, 소스에도 나와 있지만, Yegappan Lakshmanan 씨의 스크립트를 약간 수정한 것이다.http://www.vim.org/scripts/script.php?script_id=311 에서 다운로드 받을 수 있다. Yegappan 씨의 스크립트는 gnu 버젼의 find 까지 요구하기 때문에 gnu-find-util 까지 설치해야 하는 부담이 따른다. 물론 여러분이 사용하는 운영체제가 리눅스라면 당연히 gnu-find 가 설치되어 있겠지만, 그 외의 운영체제에서는 find-util 을 또 깔아 주어야 하는 불편함이 있다. 

그래서 위에 리스팅 된 스크립트는 내가 find 에 의존하지 않도록 스크립트를 약간 손본 것이다. 

만약 여러분이 리눅스에서만 작업을 하신다면, 혹은 GNU find-util 이 설치되어 있는 환경에서만 작업을 하신다면 Yegappan 씨의 스크립트를 그대로 사용해도 좋겠다. Yegappan 씨의 스크립트를 사용하면서 유용한 옵션 중의 하나만 소개하도록 하겠다. 자세한 내용은 스크립트를 읽어 보거나 해당 홈페이지를 방문해서 알아 보도록 하자. :

let g:Grep_Skip_Dirs='.svn'

그리고 아래의 내용을 ${HOME}/.vimrc 에 넣어 두자.

"내가 설치한 gnu grep 이 있는 경로. 일반적으로 /usr/local/bin/ 에 설치되므로 이와 같이 해 두었다.
let Grep_Path = '/usr/local/bin/grep' 
let Grep_OpenQuickfixWindow = 1
let Grep_Default_Options = '-rn'

이왕지사 .vimrc 를 손대는 것, 아예, 키보드 매핑까지 해 두자. 아래의 라인도 ${HOME}/.vimrc 에 추가하자 :

nnoremap <silent> <F9> :Rgrep<CR>

플러그인을 어떻게 설치하는지 설명하는 것을 깜빡 잊어버렸으나, 앞에서 이미 넌지시 설명해 버렸다. 간단하다. pluginname.vim파일을 ${HOME}/.vim/plugin/ 디렉토리에 복사해 넣어 주면 된다. 그럼 다음번 vim 을 시작할 때, vim 은 플러그인을 읽어들이게 될 것이다. 


3-3. 활용

이제 활용을 위한 모든 준비는 끝났다. vim 을 열고 위에서 키맵을 해 둔 것처럼 <F9> 키를 눌러 보자.
아래와 같이 어떤 패턴을 찾을 것이냐는 질문이 화면 아래쪽에 나올 것이다 :




쉽다. 여기에 원하는 패턴을 입력해 주고 엔터키를 치면 된다. 어디 한번 해 보자. (( 너무 친절하게 설명해 주는 것 같다 -_-;;;; 

그리고, 아래 그림에서 보듯이, 원하는 단어 위에서 <F9> 키를 누르면 일일이 찾고자 하는 패턴을 입력할 필요 없이 커서가 위치해 있던 단어가 "Search for pattern: " 에 입력되어 나온다 :




화면에서 볼 수 있듯이 커서가 있던 자리의 단어가 <F9> 를 눌렀을 때 자동으로 표시된다.

찾고자 하는 패턴을 입력하고 엔터키를 치면 검색을 시작할 디렉토리를 묻는데, current working directory 가 기본으로 세팅되어서 나온다. tab 키로 자동완성이 된다.

디렉토리를 입력한 후에는 

Search in files matching pattern: *

이라고 나오는데, 이것은, 검색을 실시할 파일명의 패턴을 입력하라는 것이다. 만약 여러분이 *.c 파일에서만 검색을 하고자 한다면 .c 를 입력해서 아래처럼 보이게 만들어 주면 된다 :

Search in files matching pattern: *.c

그리고 엔터키를 입력하면, grep option 을 입력하라는 메뉴가 뜬다.

Grep options: -rn

만약 위쪽에서 내가 추천한 것 처럼 자신의 .vimrc 파일에 아래의 라인을 입력해 둔 분이라면 -rn 이 기본으로 나타나게 될 것이고, 그렇지 않으면 그냥 공란으로 나올 것이다. 이 곳에 grep 에 줄 option 을 적어 주면 된다.

let Grep_Default_Options = '-rn'

주의할 것은, -n 옵션이 빠져서는 안된다는 것이다. 
왜냐하면, vim 이 grep 의 -n 옵션으로 출력되는, 파일에서 패턴이 발견된 라인의 정보를 보고서 해당 파일을 자동으로 열어 주고, 그 라인으로 점프해 가기 때문에 -n 옵션을 주어야만 grep+vim 을 편리하게 사용할 수 있기 때문이다.

여기서 잠깐, 유용한 grep option 두가지를 알아보고 넘어가자:

-i : 대/소문자 구분을 하지 않는다.

-w : 정규표현식 < > 로 패턴을 둘러싼 것과 같은 효과가 난다. 즉, 예를 들어서 main 을 -w 옵션을 주고서 grep 했다면 main 만 grep 에 걸리고, main2, main_function 등은 걸리지 않는다.

필요에 따라 "Grep options: " 라고 묻는 라인의 뒤에 옵션 추가만 해 주면 된다 :





필요에 따라서 옵션을 추가했으면 엔터키를 누르자.

뭔가를 한참 뒤진(?) 후에 아래처럼 quick fix 윈도우가 화면에 나타나게 된다 :




화면을 자세히 보면, 패턴 정보가 나오고, 그 아랫줄에 검색에 사용된 명령어가 나온다.

검색되어 나온 결과 사이를 왔다갔다 하는 방법은 앞전의 Playing with make 게시물에 잘 나와 있으니 그 게시물을 참조하기 바란다.


3-4. GNU grep 사용 팁 약간

언제나 그렇듯, 가장 좋은 사용 설명서는 man page 이다. 수시로 man command 를 해서 심심할 때 마다, 잠이 오지 않을 때 마다 읽어 보도록 하자.

일단, quick start 로 몇가지 것들만 정리해 주겠다.

3-4-1. 환경변수 GREP_OPTIONS

그렇다. gnu grep 은 환경변수 GREP_OPTIONS 에 세팅되어 있는 값을 grep 을 실행할 때마다 옵션에 자동으로 붙여 주는 일을 해 준다. 

나는 주로 아래와 같은 값으로 세팅해 두고 생활하고 있다 :

shawn.castepo:~/Sources/httpd-2.2.4/srclib/apr/strings$ echo ${GREP_OPTIONS} 
--exclude-dir=.svn -I --color

음.. grep tip 을 이야기하겠다고 section 까지 만들었건만, 더 이상 할 이야기가 없다. -ㅅ-;; 
r, n, w, i 는 이미 앞에서 설명해 버렸고...

아무튼, grep plugin 과 gnu grep 을 이용해서 보다 편안한 개발자의 일상을 누리시길 바란다.

good luck!


4. quickfix window

5. navigating through source file(s)

6. help


출 처 : http://orchistro.tistory.com/106


$ git config [...] : 환경설정

───────────────────────────────────────────────

git help [...] : 명령어 도움말( ※ 명령어 사용전에 이걸로 사용법 확인하자 )

   ex > $git help config : config 도움말 

───────────────────────────────────────────────

$ git init : 기존 디렉토리를 Git 저장소로 만들기

───────────────────────────────────────────────

$ git clone [url] : 다른 프로젝트 또는 git 저장소 복사

   ex> $ git clone git://github.com/schacon/grit.git​

───────────────────────────────────────────────

$ git status : 현재 저장소의 파일 및 상태 표시​

───────────────────────────────────────────────

​$ git add [directory or file] : 현재 저장소에 파일 추가

───────────────────────────────────────────────

​$ cat .gitignore : 파일 무시하기

───────────────────────────────────────────────

​​$ git diff : 수정했지만 아직 staged상태가 아닌 파일 비교 (Working Directory 와 Staging Area 파일 비교 )

   ex > $​git diff --cached :  저장소 와 statging Area 비교 ( --staged도 같음 ) 

───────────────────────────────────────────────

​$ git commit : 로컬 저장소에 저장한다.

   ex > $ git commit -a -m '코멘트' : add + 코멘트 한번에 commit 한다.

   ex > $ git commit --amend : 커밋 수정하기​ ( 파일을 빼먹거나 추가 수정이 있을 때 )

───────────────────────────────────────────────

$ git rm ​[file] : 파일 삭제 (삭제하면 staged상태가 된다. 여기서 commit까지해야 지워짐 )

───────────────────────────────────────────────

$ git mv [BeforeFileName] [AfterFileName]: 파일 이름 변경​

───────────────────────────────────────────────

​$ git log [...] : 커밋 히스토리 조회

───────────────────────────────────────────────

$ ​git reset HEAD [file] : 해당파일을 unstage 상태로 변경

───────────────────────────────────────────────

​$ git checkout -- [file] : 해당 파일을 수정전( 최근 commit된 버전 )으로  되돌리기

​───────────────────────────────────────────────

​$ git remote : 리모트 저장소 확인하기

  ex > $ git remote -v : 저장소의 단축이름과 url 보기​

  ex > $ git ​remote add [단축이름] [url] : 리모트 저장소 추가하기

  ex > $ git remote rename [Before] [After]​ : 리모트 저장소 이름 변경

  ex > $ git remote rm [단축이름]​ : 리모트 저장소 삭제

  ex > $ git remote show [단축이름] : 저장소 상태 보기

───────────────────────────────────────────────

$ git​ fetch [단축이름 or url] : 리모트 저장소에서 데이터 가져오기 (자동 머지X)

$ git​ pull [단축이름 or url] : 리모트 저장소에서 데이터 가져오기 (자동 머지O)​

───────────────────────────────────────────────

$ git push [단축 이름] [브랜치 이름]​

   ex > git push origin master​ : master 브랜치를 origin 서버에 push

───────────────────────────────────────────────

$ git last : 최근 커밋 내용 확인​

───────────────────────────────────────────────

$ git checkout [...] : 위에 파일을 수정전으로 돌리는 일외에도 브랜치 이동 관련 명령어로 쓰임

   ex > $ git checkout -b [브랜치 이름]​ : 브랜치 생성과 동시에 Checkout 

───────────────────────────────────────────────

$ git ​merge [합칠 브랜치 이름] : 변경된 내용 현재 브랜치에 적용하기

  ex > $ git checkout master

         ​$ git merge hotfix  : master브랜치에 hotfix 내용을 적용한다.

───────────────────────────────────────────────

$ git branch [...]​ : 브랜치 관련 작업

───────────────────────────────────────────────


출 처 : http://blog.naver.com/kjyong86/220004773927

ARM 프로세서에는 특이하게 7개의 모드가 존재한다.
동작모드는 프로세서가 어떤 권한을 가지고 무슨 일을 처리하는지 나타내는 프로세서의 동작상태를 일컷는다.
이 7개의 Mode서, 각 모드가 따로 SP(Stack Point)를 갖고 있는다. 
(User와 System은 갖은 Stack 사용, 즉 6개의 Stack이 사용된다.)

 

Mode

Description

CPSR M[4:0]

User

User Task나 Application을 수행할때의 동작모드로 모든 동작모드중유일하게 비특권 모드이다. User Mode는 메모리, I/O장치와 같은 시스템 자원을 사용하는데 제한을 두어 사용자의 실수를 방지한다. 다른 모드(SVC)로 이동하기 위한 방법으로는 소프트웨어 인터럽트를 발생시킨다.

10000b

FIQ

(Fast IRQ)

2개의 인터럽트 소스중 아주 빠르게 인터럽트를 처리할 수 있도록 구성된 모드. 빠른 처리를 위해서 Exception Vector에서도 최하단에 존재하고 별도의 레지스터를 소유한다.

10001b

IRQ

(Interrupt Request)

일반적으로 사용되는 인터럽트로 외부 장치에서 요청되는 하드웨어적인 IRQ의 발생에 의해 ARM 코어는 IRQ모드로 전환하고 인터럽트를 처리한다.

10010b

SVC

(Superviser)

대부분의 시스템 자원을 자유롭게 관리할 수 있는 동작모드로 주로 커널이나 디바이스 드라이버를 처리할 때(System Call) 동작되는 모드이다.
Reset신호가 입력되거나 SWI가 발생하면 SVC모드로 전환된다.

10011b

Abort

메모리에서 명령을 읽거나 데이터를 읽거나 쓸 때 오류가 발생할 때 Abort Mode로 전환하여 오류를 처리한다.

10111b

Undefined

명령어를 읽어 실행하고자 하나 읽어온 명령이 디코더에 정의되어 있지 않은 명령인 경우 발생되는 오류를 처리하는 모드이다.

11011b

System

User 모드와 동일한 Register를 사용하고 동일한 용도로 사용된다. User 모드와의 차이점은 특권을 갖고 있다는 것이다. 
(ex : OS Kernel)

11111b

 

위 표에서 우측의 5bit짜리 정보는 CPSR이라는 상태 Register내에 저장된 정보이다. CPSR은 현재 모드의 상태를 저장하고 있는데, 그중 우측 0~4bit 총 5bit는 각 모드의 정보를 담고 있다. 32bit중 나머지 bit는 N,Z,C,V로 컨디션 코드 및 기타 정보로 사용된다. (Register 부분에서 언급예정)

인터럽트나 에러 또는 프로그래머에 의하여 모드가 변경될 수 있다.
다음에는 Exception에 대해 알아 볼 것인데 Exception에 의해서 모드가 변경되기 때문에 각 모드의 특징에 대해 알고 있어야 한다.

System/User/SVC Mode가 은근히 헷갈리고 명확히 정의내리기 애매했었다.
System과 User는 같은 Stack을 이용하여 거의 비슷하나, User Mode에서는 Device등의 자원을 사용하는데 제한이 주어진다. SVC Mode는 처음 Reset되었을 때 접근하는 Mode로 시스템 자원을 자유롭게 관리가 가능하며 별도의 Stack을 이용한다.
User Mode는 OS상에 올라가는 Application으로 생각하고,
OS는 기본적으로 System Mode,
OS나 Application이 시스템 자원(I/O등)을 사용할때는 SVC모드로 바뀐후 사용한다고 보면 된다.

이때, SVC모드로 바뀌어서 시스템 자원을 사용할 권한을 획득하는 것을 System Call이라고 지칭한다. (추후 자세히)


※ 이러한 모드가 눈에 보이는 것이 아니라, 개념적이고 추상적인 부분이라 정의를 명확히 해야한다. 현재 모드를 확인하려면 CPSR의 5bit를 출력해 봐야 비로소 눈으로 확인이 가능하다 -.,-; (가끔 헷갈려서 필자도 몇번 레지스터를 출력해보았다^_^)


출 처 : http://shinluckyarchive.tistory.com/270



:windo se scrollbind




1. 개요

    이 문서는 GNU 어셈블러 문법에서 지시자로 사용되는 의사 명령어를 간단히 정리 한 문서이다. 
    더 많은 참조를 원한다면 다음 사이트를 방문한다.
    
        http://tigcc.ticalc.org/doc/gnuasm.html#SEC70
    
2. 데이터 지시자 

    .byte   <byte1> {,<byte2>} ...      : 8  비트 데이터 
    .hword  <short1> {,<short2>} ...    : 16 비트 데이터 
    .word   <word1> {, <word2>} ...     : 32 비트 데이터 
    .ascii  "<string>"                  : 문자열 
    .asciz  "<string>"                  : 문자열 : 마지막에 자동으로 NUL 문자인 0을 추가 한다. 
    .space  size[, fill]                : 주어진 바이트 수를 할당한다. 바이트들은 0 이나 fill 값으로 채워져 있다. 

3. 상수 또는 심볼릭 관련 지시자 

    .equ <symbol name>, <value>                 : 심볼값을 정의 한다. 
    <register_name> .req <register_name>        : 레지스터의 이름을 짓는다. 
    .global <symbol>                            : 심볼을 외부 참조가 가능하게 한다 
    .set <variable_name>, <variable_value>      : 변수 값 설정
    

4. 코드 블럭 관련 지시자 
    
    .code <number_of_bits>    : 명령어 폭을 비트로 설정한다.

                                                Thumb 어셈블리에서는 16을, ARM 어셈블리에서는 32를 사용한다. 
    .section name[, "flags"]  : 새로운 코드 섹션 또는 데이터 섹션을 지정한다. 
                                섹션 명은 링크 디스크립터에 정의 되어 있어야 한다. 일반적으로 다음항목을 사용한다.
                                   .text : 코드 섹션
                                   .data : 초기화된 데이터 섹션
                                   .bss  : 초기화되지 않은 데이터 섹션. 
                                flags 는 ELF 포멧에서 
                                   a     : 섹션 할당
                                   w     : 쓰기 가능한 섹션
                                   x     : 실행 가능한 섹션


    .align alignment[, [fill][, max]]    : 주소를 2^n 바이트 단위로  정렬한다. 
                                           어셈블러는 fill나 적절한 디폴트 값을 추가하여 정렬을 맞춘다. 
                                           만약 max보다 더 많은 fill 바이트가 필요하다면 정렬되지 않는다.
                                                  
     .rept count                         : count 만큼 코드 블록을 반복한다. .endr로 끝난다.
    .endr                                : 반복 루프를 끝낸다. 

5. 매크로 

    .macro name [macargs...]       : name 이름의 어셈블러 매크로를 정의한다. 매크로 정의는 .endm으로 끝난다. 
    .endm                          : 매크로 정의를 끝낸다. 
    .exitm                         : 매크로를 빠져나온다. armasm에서의  유사하다.

6. 조건 컴파일 

    .if absolute_expression        : 컴파일 조건문 시작 .endif를 사용하여 끝낸다. 
    .ifdef symbol                  : symbol 이 정의되어 컴파일 대상에 포함되는 시작 .endif를 사용하여 끝낸다. 
    .else                          : .if와 .endif와 예외 조건이다. 
    .elseif                        : else 와 if 를 합친 것이다. 
    .endif                         : 조건부 컴파일 지정을 끝낸다(.if, .ifdef, .ifndef 참고). 
    .err                           : 에러가 있으면 어셈블리를 정지시킨다.

7. 기타 

    .include "<filename>"          : 지정한 소스 파일을 포함한다

8. GNU ASM 과 ARM ASM 의 대치표

    .ascii      : DCB
    .byte       : DCB
    .hword      : DCW
    .word       : DCD
    .space      : SPACE
    .set        : SETA
    
    .equ        : EQU
    .req        : RN
    
    .code       : CODE16,CODE32
    .sectoin    : AREA
    .balign     : ALAIN
    
    .macro      : MACRO
    .endm       : MEND
    .exitm      : MEXIT
    
    .if         : IF     
    .else       : ELSE
    .endif      : ENDIF
    .include    : INCLUDE


출 처 : http://forum.falinux.com/zbxe/index.php?document_srl=550700&mid=lecture_tip


간혹 맥에서(리눅스도 마찬가지) 권한 없다고 Operation not permitted 메시지를 마구 뿌려대는 경우를 만날 수 있습니다. 짜증나죠... 그래서 root로 로그인하거나 sudo로 명령을 날려보죠 다음처럼요.

 

sudo mv vssver2.scc vssver2.scc.test
Password:
mv: rename vssver2.scc to vssver2.scc.test: Operation not permitted


이 경우 파일의 플래그 설정에 문제가 있어서 발생하는 문제입니다. 해결은 다음처럼 find 명령으로 찾아서 일괄 변경하거나 직접 chflags 명령을 사용해서 하시면 됩니다.

 

변경 방지를 위해 잠겨있는 파일 찾기 (현재 디렉토리 기준)

 find . -flags +uchg

 

변경 방지를 위해 잠겨있는 파일 찾기 (경로 지정)

find /Volume/My\ Passport/ -flags +uchg

 

검색된 파일을 잠금 해제하는 방법

 $ find . -flags +uchg -exec chflags nouchg {} \;

or

find . -flags +uchg -print0 | xargs -0 chflags nouchg


출 처 : http://kiros33.blog.me/130178919560









+ Recent posts