IT관련 지식들 2010. 6. 19. 15:39
커널 소스 분석을 할 때, ctag 만을 이용한다.

ctags 도 수많은 명령어 들이 있지만, 아래의 네가지 command 만 익히면 source insight 가 생각에서 지워질 것이다

1. ctrl + ] => tag 자동 찾기
2. ctrl + t => 이전으로 복귀
3. ex mode) : tj 함수명 or 구조체 명 => 지정한 함수 또는 구조체로 jump
4. ex mode) : sts 함수명 or 구조체 명 => tj(tag jump) 와 동일하지만 기존화면을 수평으로 split 하여 보여준다. 현재 창과 보고 싶은 tag를 동시에 보려고 할때 유용함.

tag 명령을 사용하기 위해서는  우선 source file 들을 indexing 해야한다.
인덱스 파일을 만드는 방법은 source tree 의 root directory 로 가서 "ctags -R ./" 하면 된다.
위 명령을 수행하면 tags 파일이 생성될 것이다.

vi 에서 ctag 명령을 사용하기 위해서는  ~/.vimrc 에 아래 문장을 추가하면 된다.
set tags += "path to tag file" path to tag file 위치에 tags 파일의 full path를 적어주면 된다.

posted by 동글동글82
:
IT관련 지식들 2010. 6. 14. 19:46

2008-05-17_223026

Fedora 9의 스크린샷 [이미지 출처: 리눅스 갖고 놀기]


USB 메모리에 레드햇의 커뮤니티 배포판인 페도라 9 리눅스를 설치하는 방법입니다. 라이브 CD 이미지만을 이용해 간단히 설치 할 수 있으며, USB 드라이브이기 때문에 언제 어디서나 사용 할 수 있고, 라이브 CD와는 다르게 읽고 쓰기가 가능해서 데이터와 설정이 저장되는 장점이 있습니다.

물론 우분투 같은 다른 배포판을 이용해 USB 드라이브에 설치하는 것도 가능하지만, 설치 과정이 제법 까다롭고 주의도 많이 요구되는데요. 반면 페도라 9의 경우엔 liveusb-creator 소프트웨어를 이용해서 쉽고 직관적으로 설치 할 수 있으며, GNOME과 함께 KDE 데스크탑 관리자의 최신 버전이 탑재되어 KDE를 선호하시는 분들에게 더욱 좋습니다. USB 드라이브의 용량은 2GB 이상을 추천합니다.


liveusb-creator


먼저 liveusb-creator를 다운로드하고, 압축을 푼뒤 liveusb-creator.exe 파일을 실행합니다.

상단 Use existing Live CD의 Browse 버튼을 눌러 라이브 CD 이미지를 선택합니다. 라이브 CD 이미지는 여기서 받을수 있습니다. 그리고 Target Device 부분은 USB 드라이브를 지정해 주시면 되는데, 다른 파일이 있어도 여유 공간만 있으면 건드리지 않고서 작업을 진행하니 걱정 안해도 됩니다.

Persistent Overlay 부분은 USB 드라이브 안에서 파일과 세팅을 저장하는데 사용되는 공간인데요. USB 드라이브의 크기에 따라 본인이 적당히 설정하시면 됩니다. 오버레이 바깥에 있는 파일이라 하더라도 USB로 부팅하고 접근 할 수 있기때문에, 무조건 크게 설정하지는 않으셔도 됩니다.

설정을 끝마쳤으면 Create Live USB 버튼을 눌러 작업을 진행하면 됩니다. 작업이 끝나면 이제 USB를 이용해 부팅 할 수 있습니다.


만약 USB로 부팅하는 도중에 "No partition active"라는 에러 메시지를 받는다면, 윈도우의 시작 - 실행에서 diskpart를 입력하고 엔터를 누릅니다. 그리고 다음 명령어를 실행해 주세요.

list disk (USB 드라이브의 디스크 번호를 알아낼수 있습니다. 보통은 1번)

select disk 1 (디스크 번호가 1일경우.. 다른 번호면 다르게 넣어주시고요.)

list partition (USB 드라이브의 파티션을 여러개로 나누었을 경우 여기서 부팅하는 파티션을 고르세요. 보통은 1번)

select partion 1 (파티션 번호가 1일경우.. 마찬가지로 다른 번호면 다르게 입력)

active

exit 


그럼 유용하게 쓰시길.. ^^;


[via Lifehacker]

posted by 동글동글82
:
IT관련 지식들 2010. 3. 11. 23:48
ARM에서 cmp를 사용하여 같은 수를 비교하였을때 과연 Carry와 oVerflow는 어떻게 설정이 될까에서 시작된 의문으로 언제 Carry가 발생하고 언제 oVerflow가 발생하는지 찾아보았습니다. (Overflow라고 쓰지 않은 이유는 보통 overflow를 V flag로 설정하기 때문)

먼저 ARM architecture reference guide에서

C Is set in one of four ways:
• For an addition, including the comparison instruction CMN, C is set to 1 if the addition produced a carry (that is, an unsigned overflow), and to 0 otherwise.
• For a subtraction, including the comparison instruction CMP, C is set to 0 if the subtraction produced a borrow (that is, an unsigned underflow), and to 1 otherwise.
• For non-addition/subtractions that incorporate a shift operation, C is set to the last bit shifted out of the value by the shifter.
• For other non-addition/subtractions, C is normally left unchanged (but see the individual instruction descriptions for any special cases).

덧셈 (CMN 명령 포함), 뺄셈(CMP 명령 포함), shift 연산, 특별한 경우 Carry가 발생합니다.


V Is set in one of two ways:
• For an addition or subtraction, V is set to 1 if signed overflow occurred, regarding the operands and result as two's complement signed integers.
• For non-addition/subtractions, V is normally left unchanged (but see the individual instruction descriptions for any special cases).

2's complement 방식으로 signed integers끼리의 덧셈과 뺄셈 연산과 특별한 경우에 발생을 합니다.


그래서 AVR instruction Set에서도 찾아보았습니다.

 C : Carry flag in status register
 V : Two's complement overflow indicator

 조심스럽게 결론을 내려보면

우선 Carry는 덧셈, 뺄셈, 곱셈, 나눗셈들에서 32bit (혹은 8bit)연산 도중에 그것을 초과할 경우 Carry가 발생한 것을 저장하기 위한 공간입니다.

oVerflow는 2의 보수 표현의 정수 연산에서 부호비트가 변한 것을 보여주기 위한 결과입니다.

Zero, Negative 등의 경우는 직관적으로 알 수 있기에 생략했습니다.





'IT관련 지식들' 카테고리의 다른 글

ctags사용법 - 소스분석  (0) 2010.06.19
USB로 부팅하기  (0) 2010.06.14
ARM Architecture / ARM Core / ARM Processor  (1) 2010.03.11
Big endian / little endian  (0) 2010.03.11
Harvard architecture / Von-Neumann architecture  (0) 2010.03.11
posted by 동글동글82
:
IT관련 지식들 2010. 3. 11. 13:21

코어(Core)와 시피유(CPU) 차이점이뭘까요?

뭘 알아야 이해를 하지

코어(Core)와 시피유(CPU) 차이점이 뭘까요? 
두 개의 차이점을 설명드리기 전에 엠시유(MCU)에 대해 잠시 살펴보죠.
코어와 엠시유는 사장님과 회사라고 할 수 있습니다. 한 회사는 많은 사람들로 구성되어 있습니다. 그 중에서 가장 중요한 사람이 바로 사장님이죠.  회사에 따라 사장님이 두 명 이상이기도 하죠. 
여기서 사장님이 바로 코어라고 보면 되구요 회사가 엠시유라고 보시면 됩니다. 회사가 잘 운영되기 위해서는 가장 중요한 역할을 하는 사장님 말을 잘 들어야 되는 것처럼 엠시유가 잘 동작하기 위해서는 코어의 눈치를 잘 살피고 때에 따라서 열심히 일을 해야 하기도 합니다. 
최근에는 하나의 엠시유에 두 개 이상의 코어가 들어있는 칩셋들이 있으며, 점점 증가하고 있는 추세랍니다. 그럼 앞에서 언급한 것처럼 사장님이 두 분이 되는 거죠. 사장님이 두 분이면 회사 업무 처리를 나누어서 할 수 있으니 효율적이겠죠. 어쨌든 한개의 코어보다는 빠르지 않을까요? ㅎㅎ
그럼 시피유(CPU)는 뭘까요? 
시피유안에는 코어, 코프로세서, 엠엠유, 캐시 메모리 등으로 구성되어 있어요. 흔히 시피유 또는 프로세서라고 불리는데 만약 암코어가 들어 있으면 암프로세서라고 부르죠. 하나의 엠시유안에 코어가 두 개면 시피유가 두 개인 셈이죠.

암프로세서를 가지고 엠시유를 만드는 회사가 많이 있습니다.
대표적으로 삼성(Samsung), 티아이(TI), 에스티(ST), 컬컴(Qualcomm) 등이 있습니다. 일반적으로 SoC(System on Chip)를 만드는 업체라고 합니다. Soc 업체들은 암프로세서를 가지고 엠시유를 만들며 각 회사마다 고유의 이름을 붙여서 엠시유 이름을 짓는 답니다.
그럼 엠시유는 암프로세서만 넣어서 만들까요? 당근 아니겠죠??
회사가 만들어질 때 최소한 몇 개의 부서를 만들어 운영을 하듯 엠시유 만들 때도 몇 개의 부서를 만든답니다.  회사의 동력은 사람이니 사람을 관리하는 HR부서가 있듯이 엠시유의 동력인 파워매니져먼트 부서가 있답니다. 이렇듯 엠시유는 메모리컨트롤러(Memory Controll), 지피아이오(GPIO),  엘시디(LCD), 사운드(Sound) 등과 같이 여러 부서로 만들어 지죠.
엠시유에 부서가 많다고 해서 무작정 좋기만 할까요? 물론 많으면 많을 수록 좋지만 단가가 비싸진 다는 것을 잊으시면 안됩니다요~~!!

이와 같이 여러 부서로 만들어지고 나면 각 부서에서 어떤 일을 해야 될지에 대한 자세한 업무 가이드를 만들 듯이 엠시유 소개를 담은 엠시유 데이타 시트를 만든답니다. 개발자들은 엠시유 데이터 시트를 보고 엠시유의 성능을 판단하거나 프로그램을 만들 때 참고하게 됩니다.  
엠시유를 만드는 회사들은 암프로세서를 하나 이상 넣을 수가 있다고 했는데, 이와 마찬가지로 각종 컨트롤러도 두 개 이상을 만들 수가 있답니다. 예를 들어, 폴더형 핸드폰은 대부분 엘시디가 메인, 서브로 나누어져서 두 개가 있어요. 그렇다면 폴더형 핸드폰을 만든다면 여러 회사의 엠시유를 검토하면서 그 중에서 당연히 엘시디 컨트롤러가 두 개를 가진 엠시유를 선택해야겠죠.
 

아래 그림 참조…


===================================================================================================================

<그림 1>
<그림 2>

 우선 그림 2의 그림이 코어입니다. 그림 1에서도 위에 core부분이라 정해진 부분이 코어입니다. 

코어는 데이터를 처리하는 방식을 조합해놓은 구조를 말합니다.

프로세서는 코어에 cache, MMU등의 장치를 더한 core에 더한 부품입니다. 

아키텍쳐는 명령어, 레지스트리 구조, 처리되는 데이터 크기등을 정의해 놓은 중심입니다.


'IT관련 지식들' 카테고리의 다른 글

USB로 부팅하기  (0) 2010.06.14
Carry 와 oVerflow  (2) 2010.03.11
Big endian / little endian  (0) 2010.03.11
Harvard architecture / Von-Neumann architecture  (0) 2010.03.11
CISC / RISC  (0) 2010.03.11
posted by 동글동글82
:
IT관련 지식들 2010. 3. 11. 12:14
Byte order 

사용자 삽입 이미지











Big endian 은 그림에서 보는 바와 같이 낮은 주소에 값의 높은 자리가 저장된다. 
개념상으로는 Big endian 이 쉽다. 사람이 쓰는 순서대로 큰 단위가 먼저 온다.
Little endian 은 반대의 순서를 갖는다. 


어느 것이 더 좋은가 ? 

결론은 둘 다 장단점이 있다.
Big endian 은 임의 정수 타입의 부호를 알고 싶다면 타입의 크기에 관계 없이 첫 비트만 보면 된다.
그리고 수가 출력되는 순서대로 저장 되어 있다.

Little endian 은 하위 바이트만의 계산이 필요할 때 더 편하다고 한다. 

관련 자료 : 
http://www.cs.umass.edu/~verts/cs32/endian.html

다음 링크에는 이런 것들뿐만 아니라 bi endian, middle endian 도 설명한다.
(영문 버전이 더 자세히 설명되어 있는 것 같다 - 안 읽어 봤음 -_-)
http://ko.wikipedia.org/wiki/%EC%97%94%EB%94%94%EC%96%B8


-------------------------------------------------------------------------------------------------
다음은 kldp 사이트에서 endian에 대한 질문과 답변중에서 발췌한 것입니다.

>>
1 byte짜리 char의 배열은 어떤 엔디안에서건 똑같이 저장됩니다. 2 byte나 4byte짜리를 어떤 순서로 넣느냐가 endian 문제죠.

>>

big endian little endian은 multiple byte number type에만 적용됩니다.

0x89ABCDEF는 숫자이고 "89ABCDEF"는 문자열인건 당연히 아시죠? 문자열엔 endian 적용이 안됩니다.

<<

multiple byte number 에만 endian 문제가 있는 이유가?  string 그러니깐 배열은 문제가 없는데 mutiple byte number (int 같은) 것만 인가라 질문 이었습니다... 위 글을 읽어보면 .. cpu에서 int 값을 조작하고 return 할때 메모리에 그렇게 놓기 때문이라 이해 했

습니다. 머 배열 같은 경우 메모리에 상주하고 있어 endian 문제가 없지 않나 생각 되어집니다. ^^....

>>

아마 마이크로 프로세서가 개발되는 초창기까지 거슬러 올라가야겠군요.

CPU가 16bit register를 메모리에 저장할 때, 어떤 순서로 저장할지의 문제와 밀접한 것입니다. CPU의 저장 방식에 따라서, C의 데이터 형이 내부처리되니까요.

>>

'배열'인 것이 중요한 게 아니라 'char' 란 게 중요한 거죠. :-) 배열이라 문제가 없는 게 아니라 char 타입이 1 byte 짜리라 문제가
없는 겁니다. 메모리 상주는 전혀 관계가 없다고 생각합니다. 다른 변수라고 메모리에 상주하지 않나요.

만일 int 의 배열이었다면 역시 엔디안 문제는 발생합니다. 물론 배열 전체의 순서가 달라지는 것이 아니라 배열의 각 원소 내에서 바이트 순서가 바뀌는것이지만...

(아 물론, char 가 2 byte 이고 int 가 1 byte 만 사용하는 랭귀지라면 char 에만 endian 문제가 있고 int 에는 없었겠죠)

>>

이 문제의 요점은 배열이 아닙니다.

char a[] = {1, 2, 3};
short b[] = {1, 2, 3};
두개의 배열이 메모리에 어떻게 들어가는지 보면..
a[] 는 01 02 03 순서로 메모리에 들어가고
b[] 는 01 00 02 00 03 00 순서로 메모리에 들어가게 됩니다.
b[]경우를 눈여겨 보시면... short 형 1은 0001이지만... 0100으로 메모리에 들어가는걸 보실 수 있을껍니다.

이 문제의 요점은 배열이 아니고...CPU에서 한번에 액세스하는 데이터의 크기가 중요한 것입니다.

Intel CPU의 경우라면 AX, BX, CX, DX등의 16비트 레지스터를 통해 short형을 다루게 되는데 mov [...], AX 라는 명령이 있으면 AX레지스터의 내용을 메모리 ...에 넣게 되는데.. AX레지스터의 데이터의 크기가 16비트이기 때문에 16비트 데이터가 메모리에 들어갈 때 값의 순서가 바이트 단위로 역으로 바뀌게 됩니다.

그러니까.. 배열 이냐 아니냐는 아무런 상관이 없고...
char, short, int 등의 데이터 형이 문제가 되는 것입니다.

>>

덧붙여서 말씀드린다면, little endian, big endian은 하드웨어 차원의 문제입니다.
맨 처음 '하하'님께서 AIX, Solaris와 Linux 에서 다른 결과가 나온다고 하셨는데 잘못된 문제 제기라 할 수 있지요.
AIX나 Solaris라서가 아니라 거기서 사용하는 하드웨어(CPU)가 어떠한 방식으로 multi-byte data를 access하느냐에 따라서 little endian, big endian이 결정되는 것입니다.

따라서 운영체제에 따라서 결과가 틀려지는게 아닙니다. 만약 같은 하드웨어(intel CPU)에서 다른 운영체제(linux, windows 기타 등등)를 사용한다고 하더라도 동일한 endian 방식을 갖습니다.
반대로 동일한 linux라 하더라도 다른 방식의 하드웨어(intel 계열은 little endian, 모토롤라 계열은 big endian이죠)를 쓴다면 각기 다른 endian이 되어서 '하하'님께서 맨 처음 사용한 예제는 각기 다르게 나오겠죠.

다시 말씀드리면 endian 문제는 static이냐 heap, stack같은 메모리 사용방식이나 또는 운영체제에 따라 달라지는 것이 아니라 하드웨어 레벨에서 사용하는 multi byte order 방식입니다.

>>

multi byte일 때 byte단위로 addressing을 할 때, 시작이 어디인가가 문제입니다.

big-endian 계열의 경우 상위 byte가 하위 address로 저장되는 방식. 
즉 address가 커지면서 하위 byte 데이터가 저장됩니다. 
일반적으로 배열을 생각하시면 됩니다. a[0]보다는 a[1]의 address가 커지겠죠. 그래서 long 형에 저장된 순서나 char [4]에 저장된 순서가 같게 됩니다.

little-endian 계열의 경우는 상위 byte가 상위 address로 저장되는 방식.
즉 byte단위로 하위 byte 부터 address가 커지면서 상위 byte로 저장됩니다.
그래서 long형에 저장된 순서나 char[4]에 저장된 순서가 바뀌게 됩니다.

둘다 논리적인 설명으로는 타당한데, little-endian의 경우 intel에서 8bit에서 16bit로 넘어 오면서 8bit code를 재컴파일 없이 수행하기 위한 꽁수역활이 큰듯합니다. network byte order가 big-endian이죠 :)

little-endian의 경우 address를 읽을 때, 한 byte만 읽으면, 원래 저장되어 있던 값이 8bit이건 16bit이건 32bit이건 가장 최하위의 8bit값을 읽을 수 있습니다. big-endian의 경우는 address 부분이 항상 최상위 byte를 가르키고 있으므로 최하위 8bit가 필요한 경우 항상 계산이 필요하죠..

>>byte ordering 문제에서, intel 계열의 cpu들은 inverted word라는 표현을 사용합니다.

데이터를 word 단위로 다루게 되는 경우, 이 데이터를 register에서 memory로 적재하게 되면 또는 그 반대로 memory에서 register로 읽어 들이는 경우, 하위 byte와 상위 byte의 순서가 바뀌게 되어 inverted word라는 말을 사용했다고 합니다.

이는 intel 계열 assembly 관련 책자들의 앞 부분에서 항상 다루는 내용들입니다.


'IT관련 지식들' 카테고리의 다른 글

Carry 와 oVerflow  (2) 2010.03.11
ARM Architecture / ARM Core / ARM Processor  (1) 2010.03.11
Harvard architecture / Von-Neumann architecture  (0) 2010.03.11
CISC / RISC  (0) 2010.03.11
LDM, STM  (0) 2010.03.06
posted by 동글동글82
:
IT관련 지식들 2010. 3. 11. 10:39
하버드 아키텍처(Harvard architecture)는 본래 명령용 버스와 데이터용 버스로 물리적으로 분할한 컴퓨터 아키텍처를 나타내는 용어이다.
 범용 마이크로 콘트롤러의 상당수는 하버드 아키텍처에 기반을 두고 있다. 마이크로칩 테크놀로지사의 PIC 마이크로 콘트롤러 등이 그 예이다. 이러한 프로세서는 프로그램과 데이터를 저장하는 작은 메모리를 내장하고 있는 것이 특징이다. 그 때문에 RISC와 하버드 아키텍처를 활용해 1 머신 사이클로 1 명령을 실행할 수 있게 되는 것이다.

폰 노이만 구조는 존 폰 노이만이 고안한 내장 메모리 순차처리 방식이다. 데이터 메모리와 프로그램 메모리가 구분되어 있지 않고 하나의 버스를 가지고 있는 구조를 말한다

'IT관련 지식들' 카테고리의 다른 글

ARM Architecture / ARM Core / ARM Processor  (1) 2010.03.11
Big endian / little endian  (0) 2010.03.11
CISC / RISC  (0) 2010.03.11
LDM, STM  (0) 2010.03.06
compile assembly code  (0) 2010.03.06
posted by 동글동글82
:
IT관련 지식들 2010. 3. 11. 10:25
우선 둘간의 차이점을 비교해 보면
-------------------------------------------------------
CISC(Complex Instruction Set Computer)
-복잡한 명령어를 가진 컴퓨터
 >명령어의 갯수가 많고 복잡하다
 >모든 고급언어 문장들에 대해 각각 기계 명령어가 대응되도록 하는것
 >명령어의 사이클이 일정하지 않다.
 >많은 명령어를 집적하여서 트랜지스터의 집적도가 높다.
  >>RISC에 비해 가격이 비싸지고 발열이 많고 전력소모가 많다.
-고급언어 컴파일러의 간단한 번역과정.
-호환성이 절대적으로 필요한 PC 환경에 사용
-386, 486, Pentium 등 PC용 CPU

RISC(Reduced Instruction Set Computer)
-줄어든 명령어를 가진 컴퓨터
 >명령어의 갯수가 적다
 >CISC의 많은 명령어중 주로 쓰이는것만을 추려서 하드웨어로 구현하는 것
 >필요한 명령어만을 구현, 트랜지스터의 집적도가 낮아져서 레지스터의 용량을 늘릴 수 있다.
-명령어의 사이클이 일정하다. (한 사이클에 한개의 명령어)
 >파이프라인으로 구현이 용이
-이것은 하위 컴퓨터의 표준이 될만한 호환 명령어라는 개념이 없고 프로세서의 단계에 따라 최적의 명령어가 정해져 있다.
 >처리 비트 단위가 변하거나 CPU의 구조가 조금만 바뀌어도 하위 프로세서와의 호환성이 떨어지므로 문제가 발생한다. 
-용도에 최적화가 요구되는 환경에 사용
-IBM System/6000, 임베디드(MIPS, ARM계열 등), 매킨토시, 서버, 워크스테이션 등을 위한 특수목적 CPU

-------------------------------------------------------

=== 프로그램을 하는 사람이 가장 쉽게 느낄 수 있는 예제 ===

X=(A+B)*(C+D)

이러한 기능을 수행하는 코드를 각 머신으로 작성한다고 했을때

(CISC)ADD R1,A,B   R1<- M[A]+M[B]ADD R2,C,D   R2<- M[C]+M[D]MUL X,R1,R2  M[X]<- R1 * R2(RISC)LOAD R1,A    R1<-M[A]LOAD R2,B    R2<-M[B]LOAD R3,C    R3<-M[C]LOAD R4,D    R4<-M[D]ADD R1,R1,R2 R1<-R1+R2ADD R3,R3,R4 R3<-R3+R4MUL R1,R1,R3 R1<-R1*R3STORE X,R1   M[X]<-R1
-> RISC의 가장 큰 특징은 LOAD, STORE 명령어라고 본적이 있습니다.
 



 RISC가 나중에 나온 구조이고 RISC가 정착하지 못한 이유에 대한 어떤 분의 해석

RISC의 장점에도 불구하고, RISC 칩은 실제 시장에서 확고한 입지를 마련하기 까지 10년이 넘게 걸렸다이것은 소프트웨어의 부재에 기인한다.

 

 비록 애플사의 파워 매킨토시가 RISC 기반한 컴퓨터이고윈도NT RISC에 호환되긴 하지만윈도3.x, 윈도9x는 기본적으로 CISC 프로세서용으로 설계되었다많은 회사들이 최근 개발된 RISC 기술을 채용하는 것에 꺼려하는 이유도 여기에 있다고 할 수 있다많은 상업적인 이익없이 프로세서 개발자들은 RISC가 가격 경쟁력을 갖을 정도의 많은 수량의 칩을 생산할 수 없다.

 

 다른 중요한 장애 중에 하나는 인텔이다비록 인텔의 CISC 칩들이 점점 다루기 어려워지고 있지만 인텔은 개발에 필요한 많은 리소스를 가지고 있고보다 강력한 프로세서들을 만들고 있다. RISC 칩들이 특정 영역에서 인텔의 칩들을 능가한다 하더라고 그 차이는 바이어들이 새로운 기술로 마음을 돌리게 할 만큼 크지 않다.


 하지만 다른 분들의 자료를 잘 찾아보니 호환성이란 문제가 남아 있었던 듯 합니다.

요즘은 둘을 혼용해서 쓴다고 하니 양쪽다 장점과 단점이 있었고, 둘의 장점을 혼합해서 나은 방향으로 발전한것같습니다.



참고사이트 : 네이버 블로그 ( http://blog.naver.com/maxuper/30015489886 )
posted by 동글동글82
:
IT관련 지식들 2010. 3. 6. 10:47
병일이가 물어본 질문에 대한 답.

- STM r0!, {r1-r12}
- LDM r0!, {r1-r12}


저장을 1~12순서로 해 놓으면 마지막에 스택 포인터는 12에 가 있다.

그런데 LOAD에서도 1~12 순서로 로드를 하면 거꾸로 로드가 되지 않을까?

그런데 잘 생각해보니, ARM에서는 스택을 사용하지 않는다. 아니 그거 하고는 상관없을지도 모른다. 그냥 저장할 공간의 수를 보고, 그 숫자에 맞춰서 시작 주소와 끝 주소를 계산해서 저장하고 불러오기 때문에 그렇지 않을까 막연히 생각만 했다.

ARM Architecture reference manual중에서 

--- LDM
<registers>
Is a list of registers, separated by commas and surrounded by { and }. It specifies the set of registers to be loaded by the LDM instruction. The registers are loaded in sequence, the lowest-numbered register from the lowest memory address (start_address), through to the highest-numbered register from the highest memory address (end_address). If the PC is specified in the register list (opcode bit[15] is set), the instruction causes a branch to the address (data) loaded into the PC. For each of i=0 to 15, bit[i] in the register_list field of the instruction is 1 if Ri is in the list and 0 otherwise. If bits[15:0] are all zero, the result is UNPREDICTABLE.

Operation
MemoryAccess(B-bit, E-bit)
if ConditionPassed(cond) then
address = start_address
for i = 0 to 14
if register_list[i] == 1 then
Ri = Memory[address,4]
address = address + 4

if register_list[15] == 1 then
value = Memory[address,4]
if (architecture version 5 or above) then
pc = value AND 0xFFFFFFFE
T Bit = value[0]
else
pc = value AND 0xFFFFFFFC
address = address + 4
assert end_address == address - 4

STM
<registers> Is a list of registers, separated by commas and surrounded by { and }. It specifies the set of registers to be stored by the STM instruction. The registers are stored in sequence, the lowest-numbered register to the lowest memory address (start_address), through to the highest-numbered register to the highest memory address (end_address). For each of i=0 to 15, bit[i] in the register_list field of the instruction is 1 if Ri is in the list and 0 otherwise. If bits[15:0] are all zero, the result is UNPREDICTABLE. If R15 is specified in <registers>, the value stored is IMPLEMENTATION DEFINED. For more details, see Reading the program counter on page A2-9.

Operation
MemoryAccess(B-bit, E-bit)
processor_id = ExecutingProcessor()
if ConditionPassed(cond) then
address = start_address
for i = 0 to 15
if register_list[i] == 1 then
Memory[address,4] = Ri
address = address + 4
if Shared(address) then /* from ARMv6 */
physical_address = TLB(address)
ClearExclusiveByAddress(physical_address,processor_id,4)
/* See Summary of operation on page A2-49 */
assert end_address == address - 4

내 생각이 맞았던것같다. 스택 포인터로 계산하는게 아니라 시작주소를 미리 계산해서 address변수에 넣고 4씩 증가시키면서 저장하고 불러들인다.
posted by 동글동글82
:
IT관련 지식들 2010. 3. 6. 09:49
armcc , armasm, armlink가 있으면 arm 32bit명령어 컴파일이 가능

--- main.c

#include <stdio.h>

int square(int i) ;

int main ()
{
int i ;
for (i=0 ; i < 10 ; i++)
{
printf ("Square of %d is %d\n", i, square(i));
}
exit (0);
}

--- square.s

AREA |.text|, CODE, READONLY

EXPORT square

; int square (int i)
square
MUL r1, r0, r0 ; r1 = r0 * r0
MOV r0, r1 ; r0 = r1
MOR pc, lr ; r0를 리턴
END

---compile
armcc -c main1.c
armasm square.s
armlink -o main.axf main1.o square.o

만약 Thumb 코드라면

--- square.s

AREA |.text|, CODE, READONLY

EXPORT square

; int square (int i)
square
MUL r1, r0, r0 ; r1 = r0 * r0
MOV r0, r1 ; r0 = r1
BX lr ; r0를 리턴
END

--- complie

tcc -c main1.c
armasm -apcs / interwork square2.s
armlink -o main2.axf main1.o square2.o


posted by 동글동글82
:
IT관련 지식들 2010. 2. 25. 20:54
폴더 (Folder) 

사전적 의미 : 서류철

수평적 관계, 상호 포함이 가능하다.

윈도우에서 바로가기 개념으로 쓰는 것 같다. 서류철을 뽑으면 그 안에 다른 서류철이 들어가도 되고 다른 서류철이 들어가도 되고. 예전에 도스를 쓸때는 MS에서도 디렉토리란 말을 썼던것같은데, 요즘 새폴더 만들기라고 하는 걸 보면 폴더 개념으로 데이터 저장방식이 바뀐것같다.



디렉토리 (Directory) 

사전적 의미 : (이름, 주소 관련 정보를 보통 알파벳순으로 나열한)안내 책자

트리 개념으로 같은 공간을 둘이 가리킬 수 없다.

 리눅스에서 사용하는 개념으로 트리구조를 가진다. 안내 책자를 보면 같은 이름을 가진 다른 것들을 지칭할때 어떻게든 다른 점을 나열한다. a,b를 붙이던지 1,2를 붙이던지. ISBN넘버가 다를 수도 있고, 만들사람으로 구분할 수도 있다. 
 Index개념으로 서로가 서로를 포함할 수 없다는 것도 어느 정도 이해가 간다.


커널 (Kernel)

사전적 의미 :  (견과류. 씨앗의) 알맹이 / (사상.주체의)핵심

O/S의 중요한 공간. Kernel의 바로 밖을 shell(껍데기)라고 하는 것을 보면 보호를 해야할 중요한 공간이란 것을 알 수 있다. 그래서 user level과  kernel level을 구분해서 이런 저런 프로세스를 수행하는 것 같다.
O/S의 가장 중요한 일이라면 역시 자원관리, 하드디스크, 메모리 그리고 태스크 관리. 모든 일을 진행하는 곳이 Kernel이다.


쉘 (Shell)

사전적 의미 : (달걀 견과류등의 단단한) 껍데기 [껍질]

 누군가 외부와 커널 사이의 번역기라는 이야기를 했다. 우선 kernel을 보호하기 위한 곳이란 것을 알 수 있다. 사용자가 직접적으로 커널을 건드릴 경우 일어날 불상사를 미리 방지하는 역할과 커널을 직접 조작하는 어려움을 감소시키기 위한 Layer로 생각할 수 있다.
 

터미널 (Terminal)

사전적의미 : (버스)종점, (기차) 종착역, (컴퓨터) 단말기

 <컴퓨터중앙에 있는 컴퓨터와 통신망으로 연결되어 데이터를 입력하거나 처리 결과출력하는 장치금융 기관 업무좌석 예약 따위의 특정한 업무에 맞도록 만들어진 전용(단말기와 일반적인 입출력 업무에 사용하는 범용(단말기가 있다. ‘끝 장치 순화. ≒단말(단말 장치·터미널.

 끝장치란 말을 잘 생각해보면 사용자와 직접적으로 연결된 부분이라고 생각하면된다. 버스터미널에 가 보면 깔끔하고 깨끗하고 편안한 곳과, 불편하고 북적거리고 지저분한 곳이 있듯이 사용자가 사용하는 터미널에도 깨끗하고 보기 좋은 환경과 사용하기 짜증나고 화가나는 환경이 있다. 마찬가지로 사용자의 환경도 좋은 환경 나쁜 환경이 있다. 


커널, 쉘, 터미널

-터미널에서 작성한 사용자의 요구사항을 쉘을 통해서 커널에 전달하면 커널이 처리한다.

'IT관련 지식들' 카테고리의 다른 글

Big endian / little endian  (0) 2010.03.11
Harvard architecture / Von-Neumann architecture  (0) 2010.03.11
CISC / RISC  (0) 2010.03.11
LDM, STM  (0) 2010.03.06
compile assembly code  (0) 2010.03.06
posted by 동글동글82
: