'Embedded Lab/linux, x86'에 해당되는 글 108건

  1. 2012.09.13 [JTAG & UART]
  2. 2012.09.12 [Flash Memory(NOR / NAND)]
  3. 2012.09.05 [fork에 대한 그림 설명]
  4. 2012.08.30 [vim에서 여러 줄에 주석 달고 해제하기]
  5. 2012.08.30 [bashrc에 shell 칼라 설정]
  6. 2012.06.07 [nask NASM 어셈블러 문법]
  7. 2012.06.02 [NASM과 MASM]
  8. 2012.05.26 [CPU스케쥴러]
  9. 2012.05.04 [캐리지리턴(\r)]
  10. 2012.05.01 [vi편집기 자동정렬]

JTAG [Joint Test Action Group]의 약자로 임베디드 시스템 개발시 디버깅하기 위한 장비이다. 
또, JTAG은 임베디드 시스템을 개발하기 위해 통합한 회로로 사용되는 IEEE 1149.1의 일반적인 이름이지만, 
보통 디버거를 가리킨다.
하드웨어상 발생하는 인터럽트나 시그널을 발생 및 조작하며 세세한 디버깅이 가능해진다.
다른용도로는 임베디드 시스템의 ROM(NOR Flash일 경우 등), NAND Flash등의 내용을 기록하거나 읽어 낼 수 있다. 
JTAG Port와 Cable을 이용하여 JTAG장비를 타켓시스템과 호스트시스템과 연결한후, 디버깅 및 레지스터값을 실시간으로 스텝단위로 실행 및 알아낼 수 있다.

SANYO Electric Co.,Ltd.|CA6|Normal program|Pattern|1/15sec|F/3.5|0.00 EV|6.3mm|ISO-100|Off Compulsory

위 타젯보드의 위 가운데 하늘색 선이 JTAG Port이다.

SANYO Electric Co.,Ltd.|CA6|Normal program|Pattern|1/16sec|F/3.5|0.00 EV|6.3mm|ISO-100|Off Compulsory

사진에서 하얀색 사각형의 장비, JTAG Cable로 연결된 장비가 TRACE32이다.
제공되는 기능이 워낙많아 자주 사용해보지 않으면, 그냥 Memory에 Download 기능만 수행하는 애물단지로 변신한다.
몇 천만원정도의 비싼 장비인데, 그 이유는 역시 하드웨어 런타입 Debugging이 가능하기 때문이라고 한다.

UART (Universal Asynchronous Receiver/Transmitter-범용비동기화 송수신기)는 컴퓨터에 부착된 직렬장치들로 향하는 인터페이스를 제어하는 프로그램이 들어 있는 마이크로칩이다. 
UART는 컴퓨터에게 
RS-232C DTE인터페이스를 제공함으로써, 모뎀이나 기타 다른 직렬장치들과 통신하거나 데이터를 주고받을 수 있게 한다. 이 인터페이스의 일부로서, UART는 또한 다음과 같은 일을 수행한다.

Serial 케이블을 이용해 호스트시스템과 연결하며, 연결된 통신내용은 콘솔창을 통해 확인이 가능하다.
즉 타겟 시스템의 다운로드된 프로그램이 잘돌아가는지 호스트시스템에서 확인이 가능하다.
이때 호스트 시스템상에서 마우스와 키보드 인터럽트를 캐치할 수 있다. 
진보된 UART들은 일정량의 데이터 버퍼링을 제공함으로써, 컴퓨터와 직렬 장치들의 데이터 스트림이 대등하도록 맞추어준다. 즉 컴퓨터의 동작속도를 장치의 속도와 동등하게 맞추도록 요구하는 장치를 관리할 수 있다.

SONY|DCR-TRV520|Normal program|1/100sec|F/1.6|0.00 EV|Flash did not fire

위의 처음 사진에서 타겟보드의 우측 상단의 케이블이 RS232 Serial Port이다. 이 포트를 이용하여 UART 통신이 가능해진다.

Posted by cyj4369
,



컴퓨터에 사용되는 메모리에는 여러가지가 있다.
Register부터 시작해서 Cache, RAM, ROM, 하드디스크 등 외부메모리를 포함해서 다양한 것이 있다.

여기서 말하고 싶은 것은 FLASH Memory라고 하는 반도체 메모리이다.
이는 ROM(Read Only Memory)의 일종으로 전원이 공급되지 않더라도 기억된 내용이 보존되는 비휘발성으로, 전기적으로 데이터를 지우고 다시 기록할 수 있다.


점점 FLASH Memory는 발전되고 다양한 기기에서 사용되고 있는데, 이에 대해 알아보자. 
(필자가 사용한 보드에서는 NAND Flash Memory가 사용되었음.)
가장 많이 알고 있는 사용용도는 USB드라이브가 있고, 그 외에 휴대 전화나 디지털 카메라 임베디드 보드등에서 자주 사용된다.

ROM의 일종이기 때문에 ROM을 대처한 비휘발성 메모리로 사용된다. 
ROM에 대해 간단히 알아보면 비휘발성 메모리로 전원이 공급되지 않더라도 내용이 없어지지 않고 기억을 한다. 단 RAM에 비해서 엑세스 시간은 느리다. 그 종류로는 크게

Mask ROM : 제조시 공장에서 내용 기입, 대량 생산용
PROM(Programmable ROM) : 사용자에 의해 1회 프로그래밍 가능, 이후 수정 불가능
EPROM(Erasable Programmable ROM) : 메모리 속에 저장된 내용을 지우고 재사용할 수 있는 PROM자외선을 비추면 ROM 내의 내용이 삭제, 롬 라이터 같은 장비로 내용 기입이 가능하다.
EEPROM(Electrically Erasable Programmable ROM) : 정상보더 더 높은 전압을 이용하여 반복적으로 지우거나 다시 프로그램이 가능, On-Board 상태에서 자유롭게 읽고 쓰기 가능, 단 수명이 10만회 미만으로 제한, 일부 내용 수정시에는 전체내용을 지우고 다시 프로그램 해야 함.



FLASH Memory : 
1984년 도시바에서 근무중인 마스오카 후지오 박사의 발명
읽기 속도가 빠르며, 하드 디스크보다 충격에 강하다. 블록단위로 내용을 쓰고 지울 수 있다. 무엇보다 EEPROM보다 비용이 덜 들기 때문에 여러 분야에서 사용된다. (EEPROM은 바이트 레벨에서 R/W, 플래쉬 메모리가 일반 램처럼 사용하지 못하는 이유는 RAM은 블록이 아닌 바이트 단위로 주소 지정이 가능해야 하기 때문이다.)

블록 내에서 특정 단위로 읽고 쓸 수 있지만, 블록 단위로 지워야 한다. 덮어 쓸 수 없기 때문에 모든 블록을 지우기 전까지는 해당 자료를 변경할 수 없다.


또한 백만번 정도로 지우기 횟수가 제한되어 있다.
내부적으로는 NAND와 NOR가 존재한다.

NOR
- 지우기, 쓰기 시간이 긴 대신 어떤 위치에도 임의로 접근이 가능. 그러나 덮어 쓰기와 지우기는 임의 접근이 불가능하다.
- 업데이트되지 않는 프로그램 코드를 저장

NAND
- 페이지 단위로 읽기/쓰기가 가능하지만 해당 페이지를 덮어 쓰거나 지우려면 모든 블록을 지워야 한다. 
- 블록을 여러 페이지로 나누어 사용한다.
- NOR 플래쉬 메모리에 비해 지우기와 쓰기 시간이 좀더 빠르다.
- 비트당 제작비가 NOR비해 낮다.
- 내구성이 훨신 강하다.
- 순차적인 접근만을 지원하다. (그래서 대용량 저장장치로 이용된다.)

NOR상에서는 부트코드로 부팅이 가능하나, NAND상에서는 불가능하다. 그렇기 때문에 NAND Flash Memory를 사용하게 되면 NAND의 내용을 RAM상으로 복사한후 부팅이 이루어 져야 한다.
(ROM이나 NOR Flash Memory 사용시 XIP기법-Excute in Place, ROM상에서 바로 실행)

Posted by cyj4369
,





'Embedded Lab > linux, x86' 카테고리의 다른 글

[JTAG & UART]  (0) 2012.09.13
[Flash Memory(NOR / NAND)]  (0) 2012.09.12
[vim에서 여러 줄에 주석 달고 해제하기]  (0) 2012.08.30
[bashrc에 shell 칼라 설정]  (0) 2012.08.30
[nask NASM 어셈블러 문법]  (0) 2012.06.07
Posted by cyj4369
,

명령 모드에서
V를 누르게 되면 하단에 Visual이라는 메세지가 출력됨 그 상태에서 주석 처리할 줄을 선택한 후에

:norm i#
-> # : 추가할 문자 


주석 지울 시에는 V를 눌러 Visual로 전환후 주석 제거할 줄 선택 후 
:norm 2x
-> 2는 선택된 줄의 왼쪽으로 부터 몇번째 문자 
-> x는 삭제를 의미


1v, 2v 이런식으로 v명령어 앞에 숫자를 붙여서 사용할수도 있으며 
1v 는 20줄 선택 2v는 40줄 선택 이런식으로 20줄씩 증가

'Embedded Lab > linux, x86' 카테고리의 다른 글

[Flash Memory(NOR / NAND)]  (0) 2012.09.12
[fork에 대한 그림 설명]  (0) 2012.09.05
[bashrc에 shell 칼라 설정]  (0) 2012.08.30
[nask NASM 어셈블러 문법]  (0) 2012.06.07
[NASM과 MASM]  (0) 2012.06.02
Posted by cyj4369
,

*내가 한 설정!

(줄바꿈은 가독성을 위해 한것, 실제로는 ~/.bashrc에 한 줄에 입력해야함_55번째줄쯤else아래)


[

\[\033[34m\]

\D{%Y-%m-%d %H:%M:%S}

\[\033[00m\]

]

\[\033[32m\]

\u

\[\033[00m\]

@

\h

\[\033[31m\]

:

\[\033[00m\]

\w

\[\033[31m\]

\$

\[\033[00m\]


[결과]

[2012-08-30 18:21:27]cyj4369@ubuntu:~/Desktop$


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

[글 1]

프롬프트 변경이 가능하니 이제 컬러를 입혀 보도록 하겠습니다.
색깔은 안시 컬러를 이용하는데 형식은 다음과 같습니다.


    ₩[₩e[속성m₩] 또는 ₩[₩e[색코드m₩]


속성은 볼드체, 역상, 점멸 등을 나타내며 색코드는 글자의 색깔을 결정합니다.
속성과 색코드는 각각 하나만 사용해도 되고 같이 사용할 수도 있습니다.

예를 들어 붉은색 프롬프트를 사용하고 싶다면 색코드 31을 이용하면 됩니다.
(편의상 속성은 사용하지 않습니다.)

    $ PS1="₩[₩e[31m₩]붉은색 프롬프트: "
    붉은색 프롬프트:
    붉은색 프롬프트: ls

일단 붉은색으로 프롬프트가 바뀌면 이후로 타이핑되는 글자 또한 모두 붉은색으로 표현되므로 보기 좋지 않습니다.
프롬프트 색을 지정하더라도 타이핑되는 글자는 기본값으로 복구시켜 주는 것이 좋습니다.

기본 색코드 0 을 마지막에 추가하여 원상 복귀시켜 줍니다. 

    $ PS1="₩[₩e[31m₩]붉은색 프롬프트: ₩[₩e[0m₩]"
    붉은색 프롬프트: ls


색깔별로 여러개를 혼합해서 사용하는 것도 가능합니다.

    $ PS1="₩[₩e[31m₩]우₩[₩35m₩]분₩[₩e[33m₩]투₩[₩e[34m₩]짱₩[₩e[0m₩]:"
    :
    :
    :ls


여러가지 색을 이용한 프롬프트도 가능한데 가독성이 좋지 않으므로 한 두가지 색상만 사용하는 것이 좋습니다.
속성은 기본값과 볼드체, 역상을 주로 사용하는 데 터미널에 따라 속성 적용에 제한이 있으므로 자주 사용하지는 않습니다. 


다음은 속성과 색코드 표입니다.


    속성

    0 = 기본값--- 1 = 볼드체--- 4 = 밑줄--- 5 = 점멸--- 7 = 역상


    색코드

    31 = 빨강--- 32 = 초록---33 = 오렌지 
    34 = 파랑--- 35 = 자주---36 = 청록 ---37 = 회색
    90 = 진회색 ---91 = 연빨강--- 92 = 연두--- 93 = 노랑
    94 = 연한 파랑
    95 = 연한 자주
    96 = 하늘색

    40 = 검정 배경--- 41 = 빨강 배경
    42 = 초록 배경--- 43 = 오렌지 배경
    44 = 파랑 배경--- 45 = 자주 배경
    46 = 청록 배경--- 47 = 회색 배경
    100 = 진회색 배경--- 101 = 연한 빨강 배경
    102 = 연두 배경--- 103 = 노랑 배경
    104 = 연한 파랑 배경--- 105 = 연한 자주 배경
    106 = 하늘색 배경


나만의 멋진 프롬프트를 만들어 보세요 !

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

[글 2]




* 목차
1. ANSI color
1.1 ANSI escape code
1.2 ANSI color 예제
2. Linux prompt
2.1 프롬프트 변수
2.2 프롬프트에 색상 넣기



1. ANSI color
ANSI 컬러는 ANSI escape code의 기능중 하나이다. 원래 ANSI escape code는 터미널의 텍스트 포맷을 제어하기 위해서 만들어진 코드이며 현재 ISO/IEC-6429 표준으로 제정되어있다. 따라서 대부분의 UNIX, Linux, DOS, Windows 등은 터미널에서 ANSI escape code를 지원한다.(일부 기능은 지원하지 않을 수도 있다.)

여기서는 리눅스(or 유닉스 계열)의 사용자를 기준으로 설명할 것이며 DOS/Windows 사용자들은 어차피 이 기능을 잘 안쓰므로 알아봐야 별 의미가 없을수도 있다.(즉 윈도우 사용자들에게는 별 도움이 안되는 글이다.)

1.1 ANSI escape code
ANSI escape code를 사용하기 위해서는 ANSI escape code를 지원하는 터미널이 필요하다.
그러나 안심하라. 현재 대부분의 리눅스/유닉스의 터미널은 ANSI escape code를 지원한다.
(지원하지 않는 기능을 굳이 설명할 이유도 없는것 아닌가?)

이제 터미널을 하나 열고 echo -e "\e[33m"를 타이핑 해보자.

[sunyzero@dev1 ~]$ echo -e "\e[33m"
$[sunyzero@dev1 ~]$
echo 문이 실행된 후에는 프롬프트 색상이 모두 노란색으로 바뀌어 있음을 알 수 있다. 이 후 타이핑하는 모든 글자는 다 노랗게 보일 것이다. 원상복귀를 위해 echo -e "\e[m"명령을 타이핑 해두자.

앞서 예제의 "\e[33m"과 같은 형태를 ANSI escape sequence라고 부르는데, echo문에서 이를 출력하여 실행하려면 ANSI escape code를 인식하는 옵션인 -e를 같이 넣어줘야 한다. 넣지 않으면 그냥 문자열로 인식해서 단순출력해버린다.

또한 ANSI escape sequence에서 시작문자인"\e["는 CSI(Control Sequence Introducer)라고 부르며 뒤의 33m, m 같은 것이 ANSI escape sequence의 코드 내용 부분이 되겠다.

CSI의 \e는 ASCII코드의 ESC키를 의미하므로 ESC의 ASCII값인 8진수 033(=decimal 27)을 사용하여 \033으로 표기할 수도 있다. 따라서 위의 "\e[33m"는 "\033[33m"으로 써도 된다.
ANSI Escape sequence = CSI + n [;+ ...] + letter
CSI = \e[ = \033[
CSI 다음에 나오는 n은 숫자이며 복수개가 나올때는 세미콜론(;)으로 구분한다. 마지막의 영문자 1개는 ANSI escape sequence의 명령(command)에 해당한다. 예를 들어 T는 스크롤 다운, m은 색상 변경등의 기능을 가진다. 색상 변경은 SGR(Select Graphic Rendition)이라고 부른다.

여기서는 ANSI Escape code 중 색상만 다루므로 m 명령만 다루도록 할 것이다. 그 외 명령어는 하단의 [1]의 링크를 참고하라.



1.2 ANSI color 예제
ANSI의 색상에서 사용 가능한 색상 밑 기능 테이블은 다음과 같다. [1]
Intensity012345679
NormalBlackRedGreenYellowBlueMagentaCyanWhitereset
BrightBlackRedGreenYellowBlueMagentaCyanWhite
색상은 0부터 7까지 사용가능한데, 그냥 사용하는게 아니라 뒤의 30, 40, 90, 100을 더해서 사용한다. 즉 normal yellow는 33이 된다. 40을 더해서 43을 만들면 Bright 옵션이 켜지게 된다. 그러면 이제 30~, 40~ 따위의 코드를 정리해보자.
CodeEffectNote
0Reset / Normalall attributes off
1Intensity: Bold
2Intensity: Faintnot widely supported
3Italic: onnot widely supported. Sometimes treated as inverse.
4Underline: Single
5Blink: Slowless than 150 per minute
6Blink: RapidMS-DOS ANSI.SYS; 150 per minute or more
7Image: Negativeinverse or reverse; swap foreground and background
8Concealnot widely supported
21Underline: Doublenot widely supported
22Intensity: Normalnot bold and not faint
24Underline: None
25Blink: off
27Image: Positive
28Revealconceal off
30–39Set foreground color, normal intensity3x, where x is from the color table above
40–49Set background color, normal intensity4x, where x is from the color table above
90–99Set foreground color, high intensityaixterm
100–109set background color, high intensityaixterm
(위의 Table은 하단 레퍼런스에 있는 위키[1]에서 인용했다.)

이제부터 예제를 보면서 실습하자. 가장 간단한 Hello world부터 시작해보자.
[sunyzero@dev1 ~]$ echo -e "\e[31mHello World\e[m"
Hello World
항상 마지막에 나오는 \e[m은 숫자가 생략되었으므로 \e[0m과 같다. 즉 Reset이다. 이렇게 하지 않으면 변경된 색상이 계속 적용되어 프롬프트 색이 이상하게 나오기 때문이다. 앞으로 ANSI 색상을 쓸 때는 마지막에 Reset을 넣는 것을 잊지말자. 그 외의 것은 설명할 것이 없으니 이번에는 여러 속성을 넣어본 것을 실습해보자.
[sunyzero@dev1 ~]$ echo -e "\e[96mHello \e[0;4;93mWorld\e[m"
HelloWorld
96에서 십자릿수의 90번대(90-99)는 위의 표에서 "90-99 Set foreground color, high intensity"라고 나온다. 일자릿수의 6번과 조합해보면 Bright Cyan색이 된다. 두번째 ANSI escape sequence는 0;4;93이 연달아 나오므로 0은 Reset, 즉 앞에서 설정된 bright cyan색을 우선 해제하고, 4는 underline, 93에서 십자릿수의 90번대(90-99)는 high inensity색상이며 그 중 3번은 Yellow계열이므로 진노랑색이 나온다.

* 참고: high intensity 글자를 쓰기 위해서 90-99번대의 숫자를 사용하는 방법외에도 코드 1번(bold, intensity)를 넣어도 결과는 같다. 즉 93m이나 1;33m 은 같은 결과이므로 편한대로 쓰면 된다.

그렇다면 이번에는 배경색까지 지정하는 연습으로 high intensity yellow 배경에 normal green색 글씨로 Hellow world를 써보자.




2. Linux prompt
리눅스(혹은 유닉스)의 bash 쉘에서는 PS1 환경변수를 바꾸면 현재 프롬프트를 변경할 수 있다.
bash쉘 외에 ksh나 POSIX sh쉘등도 PS1 환경변수를 바꾸면 쉽게 프롬프트가 변경된다.

환경변수를 설정하는 리눅스 명령은 export나 declare -x 를 사용하면 되는데, export가 더 많이 쓰이므로 여기 예제에서는 export명령을 기준으로 설명하겠다.


2.1 프롬프트 변수
리눅스의 bash 쉘 프롬프트 기본값은 "[유저명@호스트명 현재디렉토리]$"의 형태로 되어있다.(root유저는 맨 끝의 프롬프트 문자가 #으로 나타남)
이 중에 유저명은 \u이고 호스트명은 \h, 현재 작업디렉토리는 \W의 변수로 PS1 환경변수에 쓰여진다.
따라서 기본값 PS1은 "[\u@\h \w]$ "가 된다. 그러면 어떤 변수들을 사용할 수 있는지부터 알아보자.
variablenote
\aan ASCII bell character (07)
\dthe date in "Weekday Month Date" format (e.g., "Tue May 26")
\D{format}the format is passed to strftime(3) and the result is inserted into the prompt string; an empty format results in a locale-specific time representation. The braces are required
\ean ASCII escape character (033)
\hthe hostname up to the first ‘.’
\Hthe hostname
\jthe number of jobs currently managed by the shell
\lthe basename of the shell’s terminal device name
\nnewline
\rcarriage return
\sthe name of the shell, the basename of $0 (the portion following the final slash)
\tthe current time in 24-hour HH:MM:SS format
\Tthe current time in 12-hour HH:MM:SS format
\@the current time in 12-hour am/pm format
\Athe current time in 24-hour HH:MM format
\uthe username of the current user
\vthe version of bash (e.g., 2.00)
\Vthe release of bash, version + patch level (e.g., 2.00.0)
\wthe current working directory, with $HOME abbreviated with a tilde (uses the $PROMPT_DIRTRIM variable)
\Wthe basename of the current working directory, with $HOME abbreviated with a tilde
\!the history number of this command
\#the command number of this command
\$if the effective UID is 0, a #, otherwise a $
\nnnthe character corresponding to the octal number nnn
\\a backslash
\[begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt
\]end a sequence of non-printing characters
(* 위 변수목록은 man bash의 PROMPTING 부분에서 인용함)
위의 표에서 나온 것을 사용해서 유용한 프롬프트 예를 3가지 만들어보겠다. 시각편의성을 위해서 프롬프트는 red, 명령어 부분은 blue로 표기했다.

[sunyzero@dev1 pub]$
export PS1="\u:\w $ "
sunyzero:/var/ftp/pub $ export PS1="[\u@\h] \w\n[\@ \$ "
[sunyzero@dev1] /var/ftp/pub
[02:02 PM $
export PS1="[\D{%Y-%m-%d %H:%M:%S}] [\u@\h] \w\n\$ "
[2009-11-24 14:11:52] [sunyzero@dev1] /var/ftp/pub
$
첫번째는 아주 간결한 프롬프트로서 \u와 \w로 구성했다. 두번째는 2행짜리 프롬프트로서 첫째 행에는 유저,호스트,작업디렉토리를 배치하고 둘째 행에는 시간을 배치했다. 세번째도 2행짜리 프롬프트로서 모든 정보를 첫째 행에 배치하고 둘째 행을 넓게 쓰는게 특징이다.



2.2 프롬프트에 색상 넣기
이제 앞의 프롬프트에 색상을 넣는 작업을 할 시간이다. 색상은 자신의 입맛에 넣으면 된다.
필자는 다음과 같이 넣어보았다. 중간에 너무 길어서 \로 개행하고 다음라인에 타이핑했다.(맨끝의 \는 다음행 개행을 의미하며 다음행은 >으로 시작한다.)
$ export PS1="\e[1;37m[\e[36m\D{%Y-%m-%d %H:%M:%S}\e[37m] \
>
[\e[32m\u\e[31m@\e[33m\h\e[37m] \e[34m\w\e[m\n\$ "
[2009-11-24 14:58:04] [sunyzero@atom] /var/ftp/pub
$

이제 본인이 필요한 내용을 넣어서 본인만의 PS1을 만들면 된다.

그리고 위의 PS1 설정 명령은 홈디렉토리에 있는 .bashrc 파일에 넣어두면 매번 로그인할때 자동으로 실행된다.(아래는 .bashrc의 예제이다.)
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

# User specific aliases and functions
export PS1="\e[1;37m[\e[36m\D{%Y-%m-%d %H:%M:%S}\e[37m] \
[\e[32m\u\e[31m@\e[33m\h\e[37m] \e[34m\w\e[m\n\$ "



'Embedded Lab > linux, x86' 카테고리의 다른 글

[fork에 대한 그림 설명]  (0) 2012.09.05
[vim에서 여러 줄에 주석 달고 해제하기]  (0) 2012.08.30
[nask NASM 어셈블러 문법]  (0) 2012.06.07
[NASM과 MASM]  (0) 2012.06.02
[CPU스케쥴러]  (0) 2012.05.26
Posted by cyj4369
,

nask는 NASM를 최적화한 어셈블러입니다.
명령어는 대소문자를 구분하지 않습니다.

DB(data byte) :파일의 내용을 1바이트만 직접 쓰는 명령어
RESB(reserve byte) : 예약의 의미(nask에서는 예약뿐아니라 띄어놓은 부분을 0x00으로 채우준다.)
; : 주석

DW(data word) : 어셈블러에서 워드는 16bit(2byte)의 의미
DD(data double-word): 더블워드는 32bit(4byte)의 의미
'명령어 $' : 이때 $는 이 행이 선두로부터 몇 바이트째인가를 알려주는 변수

<c언어의 #define 역할>
EQU
ex) CYLS EQU  10    


ORG(origin) : 메모리 어디에 로딩되는지  nask에 알려주기 위한 명령어.(시작점 위치 알려주기)
                    ORG명령어 사용시 달러마크($)의 의미는 출력파일에서 몇 번째바이트인지를 나타내지 않고, 
                     ORG에 지정된 주소로부터 몇 번째 주소인지를 나타낸다.
"entry:" : entry라는 레이블 선언. ':'사용하면 레이블을 선언한다.

<제어문>
MOV : 대입문
ex) MOV AX,0  ; AX=0
JMP : c언어의 goto문역할
CMP : 비교문
JE(jump if equal): 조건 점프 명령어
ex) CMP AL,0
      JE    fin
//AL == 0이 같으면 fin으로 이동해라.
JAE(jump if above or equal) : 크거나 같으면 점프
ex) CMP SI, 5    ; SI>=5이면 에러로..
      JAE error
JA : 크거나

JBE(jump if below or equal) : 작거나 같으면 점프
JB : 작거나

JC(jump if carry) : 캐리플래그가 1이면 점프
JNC(jump if not carry) : 캐리플래그가 0이면 점프

INT(interrupt) : 인터럽트 명령어
HLT(halt) : CPU를 대기상태 만드는 명령어. 키보드, 마우스에 변화가 생기면 CPU는 계속 해서 프로그램 실행
//전기를 절약할수있다.


<메모리를 지정할때>
"데이터의 크기[번지]" 
ex) MOV BYTE [678], 123
메모리 678주소에 123을 기억시킨다. 데이터 크기로는 BYTE, WORD, DWORD

<대표적인 16bit(2byte) 레지스터>
AX : 어큐뮬레이터(accumulator: 누적 연산기)
CX : 카운터(counter:수를 세는 기계)
DX : data
BX :base
SP :stack pointer
BP :base pointer
SI : source index(읽기 인덱스)
DI : destination index(쓰기 인덱스)
<8bit(1byte) 레지스터>
AL : accumulator low(AX 레지스터의 16비트 중 아래쪽 비트 0~7부분)
CL : counter low
DL : data low
BL : base low
AH : accumulator high(AX 레지스터의 16비트 중 위쪽 비트 8~15부분)
CH : counter high
DH : data high
BH : base hight
//BP, SP, SI, DI는 L과 H로 나눌수 없다.
//여기서 32bit 레지스터는 단지 E(Extend)만 16비트 레지스터명 앞에 붙인다.

< 16bit 세그먼트 레지스터> 
ES : extra segment( 덤 세그먼트)
CS : code segment
SS : stack segment
DS : data segment
FS : 명칭없음(덤 세그먼트 2번째)
GS : 명칭없음(덤 세그먼트 3번째)

◆ 어떤 메모리라도 세그먼트 레지스터와 함께 번지를 지정하지 않으면 안된다.
그래서 MOV CX,[1234]는 MOV CX,[DS:123]와 같다. 어셈블에서는 생략해도 자동으로 해준다.
MOV AL,[SI] 는 MOV AL,[DS:SI]라는 의미 .기본적으로 DS:가 붙기때문에 항상 DS는 0으로 안하면 메모리 번지는 DS*16 + SI가 된다.

'Embedded Lab > linux, x86' 카테고리의 다른 글

[vim에서 여러 줄에 주석 달고 해제하기]  (0) 2012.08.30
[bashrc에 shell 칼라 설정]  (0) 2012.08.30
[NASM과 MASM]  (0) 2012.06.02
[CPU스케쥴러]  (0) 2012.05.26
[캐리지리턴(\r)]  (0) 2012.05.04
Posted by cyj4369
,

->NASM : 프리웨어로 윈도우와 리눅스에서 어셈블리어를 확인할수있다.
->MASM : 마이크로사의 어셈블러 로써 윈도우즈에서만 사용가능하다.


명렁어의 차이 (1)

주소 지정 방식의 차이

MASM에서는… 
- Mov AX, offset defined_data 
defined_data 의 주소를 AX에 저장 
- Mov AX, defined_data 
defined_data 의 값을 AX에 저장

NASM에서는… 
- Mov AX, defined_data 
defined_data 의 주소를 AX에 저장 
- Mov AX, [defined_data] 
defined_data 의 값을 AX에 저장 

 
명렁어의 차이 (2)

피 연산자 사용의 차이

MASM에서는… 
용도에 따라서, @, $, %, %% 등이 사용됨 
약간 복잡한 방식

NASM에서는… 
주소를 나타내는 [ ] 외에는 달리 사용되는 특수문자가  없음 
프로그래머에게 단순한 사용 방식을 제공 

 
기타 차이점 (1) 
MASM 과 NASM의 사용 시, DB 혹은 DW 등을 이용하여 변수를 선언 시에 약간 다를 수 있다. 
스트링 선언 방식의 차이 등… 
times, resb, resw 등의 약간의 차이점이 있음 
이들 어셈블러는 해당 버전마다 약간씩 사용법이 다를 수 있다. 
추가된 새로운 지시어/피연산자 사용 법 
매크로의 사용방법 등… 
나머지는 NASM Manual 문서를 찾아보도록 하자

'Embedded Lab > linux, x86' 카테고리의 다른 글

[bashrc에 shell 칼라 설정]  (0) 2012.08.30
[nask NASM 어셈블러 문법]  (0) 2012.06.07
[CPU스케쥴러]  (0) 2012.05.26
[캐리지리턴(\r)]  (0) 2012.05.04
[vi편집기 자동정렬]  (0) 2012.05.01
Posted by cyj4369
,

※CPU스케줄링

1) 정의

- 작업을 처리하기 위해 프로세스들에게 중앙처리 장치나 각종 처리기들 을 할당하기 위한
정책을 계획하는 것

2) 방법별 분류

① 선점(preemptive) 스케쥴링
- 한 프로세스가 CPU를 차지하고 있을 때 우선순위가 높은 다른 프로세스가 현재 프로세
스를 중지시키고 자신이 CPU를 차지할 수 있는 경우
- 높은 우선순위를 가진 프로세스들이 빠른 처리를 요구하는 시스템에서 유용
- 빠른 응답시간을 요구하는 시분할 시스템에 유용
- 높은 우선순위 프로세스들이 들어오는 경우 오버헤드를 초래

② 비선점(nonpreemptive) 스케쥴링
- 한 프로세스가 CPU를 할당받으면 다른 프로세스는 CPU를 점유못함
- 짧은 작업을 수행하는 프로세스가 긴 작업이 종료될 때까지 기다려야 함
- 모든 프로세스들에게 공정하고 응답시간의 예측이 가능

3) CPU 스케쥴링 알고리즘별 분류

① 우선순위(priority) 스케줄링
- nonpreemptive
- 프로세스에게 우선순위를 부여하여 우선순위가 높은 순서대로 처리

ㄱ) 정적(static) 우선순위 방법
- 주변 환경 변화에 적응하지 못하여 실행중 우선순위를 바꾸지 않음, 구현이 쉽고
오버헤드가 적다
ㄴ) 동적(dynamic) 우선순위 방법
- 상황 변화에 적응하여 우선순위를 변경, 구현이 복잡, 오버헤드 많다,
시스템의 응답속도를 증가시켜 효율적

② 기한부(deadline) 스케줄링 - nonpreemptive
- 작업을 명시된 시간이나 기한내에 완료되도록 계획
- 작업시간이나 상황등 정보를 미리 예측하기가 어렵다

③ FIFO 스케줄링 - nonpreemptive
- 프로세스들은 대기 큐에 도착한 순서대로 CPU를 할당 받는다
- 일괄처리 시스템에서 주로 사용, 작업 완료 시간을 예측하기 용이
- 짧은 작업이 긴 작업을 기다리게 됨
- 중요하지 않은 작업이 중요한 작업을 기다리게하여 불합리

④ 라운드로빈(round robin) 스케줄링
- preemptive
- FCFS에 의해서 프로세스들이 보내지며
- 각 프로세스는 같은 크기의 CPU 시간을 할당 받는다
- 시분할 방식에 효과적, 할당시간의 크기가 매우 중요
- 할당시간이 크면 FCFS와 같게되고, 작으면 문맥교환이 자주 일어난다

⑤ SJF(shortest job first) 스케줄링 - nonpreemptive
- 준비큐내의 작업중 수행시간이 가장 짧다고 판단되는 것을 먼저 수행
- FCFS보다 평균 대기 시간을 감소, 큰 작업은 시간 예측이 어렵다
- 짧은 작업에 유리

⑥ SRT(short remaining time) 스케줄링
- preemptive
- 가장 짧은 시간이 소요된다고 판단되는 프로세스를 먼저 수행
- 남은 처리 시간이 더 짧다고 판단는 프로세스가 준비큐에 생기면 언제라도 실행중인
프로세스가 선점됨
- 긴 작업은 SJF보다 대기 시간이 길다

⑦ HRN(highest response ratio next) 스케줄링
- nonpreemptive
- 긴 작업과 짧은 작업간의 지나친 불평등을 어느 정도 보완한 기법
- 짧은 작업이나 대기시간이 긴 작업은 우선순위가 높아진다

⑧ 다단계 큐(multilevel queue) 스케줄링
- preemptive
- 작업들을 여러 종류의 그룹으로 나누어 여러개의 큐를 이용하는 기법

⑨ 다단계 피드백 큐(multilevel feedback queue) 스케줄링
- preemptive
- 입출력 위주와 CPU 위주인 프로세스의 특성에 따라 서로 다른 CPU의 타임 슬라이스를
부여
- 짧은 작업에 유리, 입출력 위주의 작업에 우선권을 줌
- 하위단계 큐일수록 할당시간은 커진다



※프로레스 스케쥴링 기법
1. preemptive 기법(선점 기법)
하나의 프로세스가 CPU를 점유하고 있을 때 다른 프로세스가 CPU를 빼앗을 수 있는 방법.
1) Round Robin 스케줄링: FIFO와 같은 방법이지만, 주어진 시간 할당량 안에 작업을
마쳐야 하며, 할당량을 다 소비하고도 작업이 끝나지 않은 프로세스는 다시 대기 큐의
맨 뒤로 돌아가는 방법.
2) SRT 스케줄링: 실행시간 추정치(남은 시간)가 가장 적은 프로세스에게 먼저
CPU를 할당하는 방법.
3) MFQ(다단계 피드백 큐) 스케줄링: 작업처리를 여러 단계로 나누어 처리하는 기법으로
높은 단계에서는 시간 할당량을 짧게 주고, 낮은 단계로 갈수록 시간 할당량을 많이
주고 마지막 단계는 RR기법으로 처리.

2. non-preemptive 기법(비선점 기법)
프로세스에게 이미 할당된 CPU를 강제로 빼앗을 수 없고, 사용이 끝날 때까지 또는
CPU를 할당 받은 프로세스가 스스로 넘길 때까지 기다려야 하는 방법.
1) FIFO 스케줄링: 대기 큐에 먼저 들어온 작업에게 CPU를 먼저 할당.
2) SJF 스케줄링: 작업 시간이 가장 적은 프로세스에게 CPU를 먼저 할당하는 기법.
3) HRN 스케줄링: 우선 순위에 의한 방법. 

'Embedded Lab > linux, x86' 카테고리의 다른 글

[nask NASM 어셈블러 문법]  (0) 2012.06.07
[NASM과 MASM]  (0) 2012.06.02
[캐리지리턴(\r)]  (0) 2012.05.04
[vi편집기 자동정렬]  (0) 2012.05.01
[rm, rndir 옵션]  (0) 2012.04.11
Posted by cyj4369
,

캐리지 리턴(CR)과 라인 피드(LF)는 느린 프린터의 유산인 걸로 알고 있습니다.
CR은 현재 위치를 나타내는 커서(?)를 맨 앞으로 이동시킨다는 뜻이고,
LF는 커서의 위치를 아랫줄로 이동시킨다는 뜻입니다.
이 두 동작을 합치면 뉴라인('\n')과 동일한 동작을 하게 됩니다.

굳이 두 동작으로 나눈 이유는 과거의 느린 프린터가 물리적인 동작을 취하는데 충분한 시간을 확보해주기 위해서 신호를 두 개로 나누어 보내주었기 때문이라고 알고 있습니다.

하지만 현재는 둘 중 하나만 있어도 뉴라인으로 간주합니다. 따라서 신경쓰지 않으셔도 됩니다. (아~~주 가끔 그 문제로 삽질을 하는 경우도 있을 수는 있지만..- -+)

그리고 LF로 뉴라인을 나타내는지 CR+LF로 뉴라인을 나타내는지는 언어의 차이가 아니라 시스템의 차이입니다.
Unix-like 시스템에서는 LF로,
윈도우즈에서는 CR+LF로 표현합니다.

덧붙이자면,
정규식에서는 CR과 LF는 의미가 없습니다.
모두 뉴라인 하나로 표현됩니다.



printf ("abcdefg\rhi"); 

화면표시결과는 abcdefg 표시후 맨앞줄로 이동후 hi를 표시하면

hicdefg

로 나타나고,

 

printf("abcdefg\nhi");

화면표시결과는 abcdefg 표시후 다음줄로 이동후 hi를 표시하면

abcdefg

             hi

위에서 g 바로밑 다음부터 hi임 (편집기에서 바로보이는지 조금 안맞네요)

 

printf("abcdefg\n\rhi");

는 abcdefg 표시후 커서를 맨앞으로 이동후 줄을 바꾸고 hi를 표시합니다.

abcdefg

hi

로 나타납니다.

'Embedded Lab > linux, x86' 카테고리의 다른 글

[NASM과 MASM]  (0) 2012.06.02
[CPU스케쥴러]  (0) 2012.05.26
[vi편집기 자동정렬]  (0) 2012.05.01
[rm, rndir 옵션]  (0) 2012.04.11
[x86 / datasheet / 메모리관리 / x86에서의 메모리정책 (보호모드/실제모드)]  (0) 2012.04.04
Posted by cyj4369
,

1. visual

ggvG=

gg: 파일의 처음으로
v: visual mode
G: 파일의 끝까지 선택 후
=: 정렬

2. non visual

gg=G

gg: 파일의 처음으로
=: 정렬
G: 끝까지


gg: 파일의 처음으로
G: 파일의 끝으로

Posted by cyj4369
,