'자자, study,/OS'에 해당하는 글 3건

DAY 2

자자, study,/OS 2011.04.06 01:23
①텍스트 에디터 소개

저자는 TeraPad를 추천했으나 일본어로 되있어서 감수자가 SciTE를 추천했음

②개발 재개

- ORG 기계어가 실행 시에 PC의 메모리 내에 어디에 로딩되는지 어셈블러에게 가르쳐 주기 위한 명령어
여기서 '$'는 ORG에 지정된 주소로부터 몇번째 번지인지를 나타냄, 그렇담 결국 기준만 다르고 똑같은거 아닌가? 얼마나 떨어져 있는가?라는?
- JMP 점프!! goto!! 절로 가란 말이닷!
- entry: 레이블의 선언 JMP 명령이 이동할 곳을 지정할 때 등에 사용됨
- MOV 대입

- CPU의 레지스터들
AX - accumulator 누적연산기
CX - counter
DX - data
BX - base
SP - stack pointer
BP - base pointer
SI - source index 읽기 인텍스
DI - destination index 쓰기 인덱스
16비트 레지스터, 2바이트 즉 16진수 2개 기억가능
아무 레지스터나 사용해도 상관없지만 각 레지스터를 알맞게 잘 활용하면 프로그램을 간결하게 쓸 수 있다. 여기서 간결하게 쓴다는 것은 어디까지나 기계어로 쓰면이라는 의미로 어셈블러의 소스 프로그램 단계에서는 별 차이가 없다. AX는 연산, CX는 횟수를 세는데 BX는 메모리 번지 계산의 기준주소로 사용하면 편리하다.

8bit 레지스터-> AL,CL,DL,BL,AH,CH,DH,BH
AL은 AX레지스터의 16비트중 아래쪽 비트이고 AH는 남은 8비트를 의미한다.
이때 SP,BP,SI,DI는 나눌 수 없다.

32bit 레지스터 -> EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
EAX 역시 32비트 중 하위 16비트가 AX 이다. 하지만 상위 16비트는 이름따위 없습니다. 상위 비트를 사용하고 싶으면 16비트 밀어내서 하위로 내려서 써야해

세그먼트 레지서트 -> 얘들은 내일 가르쳐 준대나_- ;
ES - extra segment 덤 세그먼트
CS - code segment
SS - stack segment
DS - data segment
FS - 명칭없고 덤세그먼트 2번째
GS - 명칭없고 덤세그먼트 3번째

어셈블러에서 레이블은 단지 숫자에 불과, 각 명령어에 의해 번지값을 계산해서 그 값을 레이블 값으로 해줌
그러므로 MOV, JMP 와 같은 명령어 이후에 레이블이 와도 상관없다. 알아서 번수 계산해서ㄷ ㅐㅐ입해줄테니..

MOV AL,[SI]에서 []는 메모리를 의미한다.
Memory 레지스터에 비해 많은 것을 기억할 수 있지만 매우 느려. 레지스터에선 계산을 할 수 있지
MOV 명령에서 전송 도착하는 쪽. 주는 쪽에 메모리 지정하는 것도 가능하지.
어셈블러에서 메모리를 지정할 때에는 BYTE, WORD, DWORD를 사용해서 "데이터 크기[번지]"로 써줘야해
예를 들자면 MOV BYTE [678], 123 과 같지.  메모리도 수치를 이해 못하므로 1BYTE 즉, 8bit에 123을 on/off 전기신호로 기억하지. WORD라면 16bit에 기억하겠지
레지스터를 이용해서 메모리 지정하는 것도 가능해. 예를 들자면 BYTE[SI], WORD[BX] SI, BX에 번지수가 저장되어 있겠지.
그런데 번지 지정에는 BX, BP, SI, DI만 사용할 수 있어.즉 [] 이 안에 들어갈 수 있다는 거지

MOV AL, BYTE [SI] -> MOV AL, [SI]
BYTE 생갹가능해, 왜냐면 MOV에서는 비트 수 같은 것끼리 대입할 수 없는 규칙있어..그러니까 알아서 BYTE라고 판단하겠지.

ADD 명령은 덧셈명령인거 많이 써봐서 알테고, CMP 명령은 비교 명령인것도 알테고

JE 조건 점프 명령의 하나. 비교 명령의 결과가 같으면 점프하고 같지 않으면 점프하지 않고 다음 명령으로 고고

INT 명령어 소프트웨어 인터럽트 명령으로 함수 호출 명령의 일종이라고 지금은 생각하면 된담
PC에는 BIOS가 있는데 이건 ROM에 들어있다. 이거는 PC제조사가 OS 제작자가 자주 사용할 것 같은 프로그램을 미리 준비해둔것이야.BIOS는 basic input output system의 약어로 해석하자면 기본 입출력에 관한 시스템이 되겠지. INT 명령이 이 프로그램에서 함수들을 호출하기 위해서 사용되는 명령어야. 그래서 INT 뒤에 숫자를 써서 BIOS의 어떤 함수를 호출하는가를 선택할 수 있어. 예를 들어 0x10 즉 16번 함수를 호출하면 비디오카드 제어에 관한 함수를 호출할 수 잇다.

HLT 명령어 CPU 정지시켜! 대기 상태로 만드는거지 근데 외부변화 있으면 계속 프로그램 실행해.

ORG 명령어 쓸 때 왜 0x7c00을 사용했는가?? 당연히 아무 주소만 쓰면 난리가 나겠지? 여러 아이들이 미리 쓰고 있을테니
memory map을 보면(보고 싶었는데 책에 나와있는 홈페이지는 안들어가 지는... ) 0x00007c00 - 0x00007dff가 부트섹터가 읽혀지는 어드레스래
그래서 이 값을 이용한거래

더보기


③부트섹터만 만들도록 정리

디스크 이미지 전체보다는 일단 512바이트의 부트섹터만 만들고 나머지는 디스크 이미지 관리 툴로 만드는 것이 편리해..
왜냐면 부섹터는 512바이트밖에 안되는데 지금은 크기가 작지만 점점 os 크기가 커지면 다 안들어가지잖아.
그니까 우선은 부트섹터만 만들어서 os가 어딧는지 갈켜 줘야지.. 그런 이유때문이겠지? 아마?

이제 부트섹터 파일만 있으니 이름을 ipl.nas로 바꾸고 ipl.bin ipl.list 파일이 출력되도록 하지. (asm.bat파일 수정)
이때 ipl.list는 각 명령들이 어떤 기계어로 번역되었느지 확인할 수 있어! 신기하더군...

makeimg.bat 파일을 새로 만들었는데 이건 ipl.bin으로 helloos.img를 만드는 배치파일임..
그런데 왜 궂이 이렇게 나눠놨는지는 아직 모르겠담.. bin 파일을 왜 만들어야 되고 makeimg.bat으로 img 만들어야 되는지 머.. 뒤에 왜 그런지 이유가 나오겠지?아마??

④ 이후를 위한 Makefile 도입

makefile은 많이많이 써봤더랬지.. unix할 때부터 많이 써봤던가 ?!
makefile을 움직이게 하는 make.exe를 호출해야해.
'#'은 주석 쓸 때 사용해.
'\'는 다음 행으로 이어진다는 뜻의 표시야

파일생성규칙으로
'ipl.bin : ipl.nas Makefile' 이거는 ipl.bin을 만들고 싶으면 ipl.nas랑 Makefile이 있는지 확인하라는 거임 이게 확인되면 다음행을 실행시켜서 명령을 수행해서 먼가 만들어내겠지.

실행은 cmd 창에서 'make -r helloos.bin' 이런식으로 하면 됨. 여기서 helloos.bin을 만들기 위해 필요한 ipl.bin 파일이 없다면 알아서 Makefile 안에 ipl.bin 만드는 방법을 발견하고 만든 후에 helloos.img를 만들어줘. 똑같은 거 또 만들려고 하면 이미 있으니 고칠 필요 없으니 또 안만들고 만약 수정된 파일이 있으면 수정일자를 확인해서 다시 만들지. 오오.. 똑똑해..
여기서 만드는 make.exe는 흔히 썼던 makefile들을 실행하던 것과 같은걸깔?

'자자, study, > OS' 카테고리의 다른 글

DAY 2  (0) 2011.04.06
DAY 1  (0) 2011.04.05
OS 만들어보자,  (0) 2011.04.03

WRITTEN BY
쫑아☆

트랙백  0 , 댓글  0개가 달렸습니다.
secret

DAY 1

자자, study,/OS 2011.04.05 22:38
①어쨌든 해 보는 거야!

2진수 편집기(Bz.exe)를 이용하여 디스크 이미지를 만들었다.
사실 CD에 있는거 가져온거긴 하지만? 음? ...
뭔가 포맷 형식도 지정해주고 하는 거 같은데 정확히 어떤 부분이 뭘 하는 건지 모르겠다.
알 수 있는 부분은 "hello, world!" 화면에 뜨는 메시지 정도?
그래서 그 부분을 조금 수정해서(아스키 코드 몇개집어넣은 거였지만) QEMU 에뮬레이터에서 실행해보았다.
먼가.. 쭉 아스키코드 썻는데 먼가 나오니까 신기하기는 한데...
사실 이걸 OS라고 하자니.. 좀 그런거 같기도 하고;

더보기


②결국 무엇을 한 것인가?

PC 처리의 중심은 CPU(Central Processing Unit, 중앙 처리 장치)로 전기 신호에 의한 ON OFF 2개의 신호로 모든 것을 이해한다.
우리가 만든 프로그램은 최종적으로 기계어가 되고, 그 기계어는 전기 신호의 형태의 명령으로  CPU에 전달된다.
2진수 4자리 = 16진수 1자리, 당연한거겠지? 2진수 4자리로 표현할 수 있는게 0-15, 16개의 숫자이니

③어셈블러 첫 체

이제는 이진수말고 어셈블러를 이용해 만들어 봅시닷
처음에 만들었던걸 어셈블러 소스 프로그램으로 만든거라서 실행하니까 출력화면에 차이는 없다
.bat 파일은 배치 파일로 콘솔에 입력해야 하는 내용을 텍스트 파일로 작성하여 나열한 것인데, 앞에서 쓸 때는 뭔지도 잘 모르고 썼는데 이번 과정에서 asm.bat 을 만들었다.
 요걸 쓰고 나니 조금은 더 이해를 할 수 있었다. 나름 만든 OS?! 실행시킬 때 !cons_nt.bat 이걸 켜고서 'run'을 넣으면 되는데 이때 수행되는 명령어가 run.bat 파일에 들어가 있다. asm.bat파일은 img파일을 만들기 위한 명령어가 들어가 있다. 고로 asm 치고 run하면 잘 실행되는거다. 근데 install.bat 파일은.. 아직 잘 정체를 모르겠다.. 쓰이긴 하는거겠지? 그러니까 복붙복붙 하라 한거겠지;
방금 !cons_nt.bat 이거 파일을 확인해봤는데 놀랍게도 그냥 cmd창 띄우는 명령어 하나만 달랑 적혀있던.. .이럴슈가! 난 뭔가 대단한 건줄 알았는뎀 나는 파닭파닭

어셈블러 명령어,
 - DB(data byte) 파일의 내용을 1바이트만 직접 쓰는 명령어, 대소문자 구분없음. 흠...과연 dB?나 Db?로 해도 될까? 된닷!
그런데 얘는 왜쓰는건지 정확히 모르겠다.. 쓰라고 해서 쓰긴 쓰는데?!
- RESB(reserve byte) 10byte 예약해놓는다는 의미로 RESB 10과 같은 방식으로 사용한다. nask에서는 이부부을 0x00으로 채우는 것이 된다.
그래서 이걸 이용해서 소스 길이를 확 줄일 수 있었지.

④첫 체험의 어셈블러 다시 써 보기
 
 뭔가 좀 더 그럴듯한 소스 프로그램을 이용했다 . 근데 주석을 보니까.. 먼가 저자도 정확히 알지 못하는 듯한 늬앙스를 풍기는 주석이 음 ? 저자님께서 이러시면 아니되죠?
-';' 주석
-DW(Data Word) word는 어셈블러에서 16비트 즉, 2바이트
-DD(Data Double-word) 더블이니까 32비트, 즉 4바이트
-'$' 이 행이 선두로부터 몇 바이트째인가 알려준다. Ex) 0x1fe-$ 요래 하면 현재 행부터 0x1fe까지 를 의미하는거

- 부트섹터 : 디스크의 처음 섹터(512바이트) PC는 디스크의 첫 섹터를 읽고나서 맨 뒤의 2바이트를 본다 이게 55 AA이여야만 이 섹터의 선두부터 프로그램이 써 있을 것이라고 판단하고 거기서부터 실행하기 시작한다.
- IPL(Initial program loader) 초기프로그램 읽기장치. 부트섹터에 OS 본체를 읽어 들이는 프로그램을 써두니까 부트섹터를 IPL이라고 부르기도 함

'자자, study, > OS' 카테고리의 다른 글

DAY 2  (0) 2011.04.06
DAY 1  (0) 2011.04.05
OS 만들어보자,  (0) 2011.04.03

WRITTEN BY
쫑아☆

트랙백  0 , 댓글  0개가 달렸습니다.
secret