Welcome to My World (www.dgmayor.com)

소프트웨어 186

15. 인터럽트 - 키보드 드라이버 2

https://github.com/SIMHANGSUB/HoGoS/tree/master/14 14 ~ 15 강 소스코드입니다. -------------------------------------------------------------------------------- 자 저번 강의에 이어서 ScanCode를 아스키코드로 바꾸는 작업을 진행해봅시다. interrupt.h에 다음과 같은 함수를 하나 선언해줍시다. ( ScanCode가 담긴 char 형을 받아 아스키값을 리턴해줄겁니다. ) unsigned char transScan(unsigned char); 그리고 이 함수를 interrupt.c 에 다음과 같이 구현해봅시다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18..

14. 인터럽트 - 키보드 드라이버 1

https://github.com/SIMHANGSUB/HoGoS/tree/master/14 14 ~ 15 강 소스코드입니다. -------------------------------------------------------------------------------- 자! 오늘은 키보드 드라이버를 구현해봅시다! 저번 강의를 통해 우리는 키보드 인터럽트를 받을 수 있게 되었습니다. 그렇다면 이제 어떤 키를 눌렀는지를 알아봐야겠죠? interrupt.c 에 들어가서 버퍼용 전역변수를 하나 선언합시다. 여기에 어떤 문자를 입력했는지 저장할 겁니다. unsigned char keybuf; 그리고, init_intdesc() 함수 끝에 다음과 같은 어셈블리 코드를 추가합시다. 이는 키보드 입력을 받겠다는 일종의..

13. 인터럽트 - ISR 구현

https://github.com/SIMHANGSUB/HoGoS/tree/master/10 10 ~ 13 강 소스코드입니다. -------------------------------------------------------------------------------- 대망의 마지막 인터럽트 구현입니다. 1. PIC 셋팅 ( 하드웨어 셋팅 ) 2. IDT ( 전에 구현했던 GDT와 같은 종류 ) 3. ISR ( 실제 인터럽트 발생 시 실행되는 코드 ) ISR이라고 거창하게 적었지만 실상은 인터럽트 발생시 실행할 함수 구현하는 겁니다. 대표적으로 int_ignore() 함수를 작성해봅시다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25..

12. 인터럽트 IDT 구현

https://github.com/SIMHANGSUB/HoGoS/tree/master/10 10 ~ 13강 소스코드입니다. -------------------------------------------------------------------------------- 저번에 설명했듯이 인터럽트를 구현하기 위해서는 크게 3단계를 구현해야 합니다. 1. PIC 셋팅 ( 하드웨어 셋팅 ) 2. IDT ( 전에 구현했던 GDT와 같은 종류 ) 3. ISR ( 실제 인터럽트 발생 시 실행되는 코드 ) 요번 포스트에서는 저번에 IDT 선언에 이어 실제로 구현해보도록 하겠습니다. 당장 interrupt.c를 만들어 다음과 같이 작성해봅시다. 1 2 3 4 5 6 7 8 9 10 11 #include "interrup..

11. 인터럽트 - IDT 선언

https://github.com/SIMHANGSUB/HoGoS/tree/master/10 10~13강 소스코드입니다. -------------------------------------------------------------------------------- 저번에 설명했듯이 인터럽트를 구현하기 위해서는 크게 3단계를 구현해야 합니다. 1. PIC 셋팅 ( 하드웨어 셋팅 ) 2. IDT ( 전에 구현했던 GDT와 같은 종류 ) 3. ISR ( 실제 인터럽트 발생 시 실행되는 코드 ) 요번 포스트에서는 2. IDT ( 전에 구현했던 GDT와 같은 종류 ) 을 다뤄보도록 하죠. 구글링을 통한 여러 포스트를 살펴보면 IDT를 어셈블리로 구현하는 분들이 대부분입니다. 물론 그렇게 하면 나름 쉽게 셋팅이 가..

10. 인터럽트 - PLC 세팅

https://github.com/SIMHANGSUB/HoGoS/tree/master/10 10~13강 소스코드입니다. -------------------------------------------------------------------------------- 인터럽트를 이제 구현해봅시다! 이 파트는 굉장히 복잡하고 하드코어하기 때문에 포스트를 여러 번 나누어서 할 겁니다. 준비 단단히 하시기 바랍니다. 인터럽트를 구현하기 위해서는 크게 3단계를 구현해야 합니다. 1. PIC 셋팅 ( 하드웨어 셋팅 ) 2. IDT ( 전에 구현했던 GDT와 같은 종류 ) 3. ISR ( 실제 인터럽트 발생 시 실행되는 코드 ) 요번 포스트에서는 1. PIC 셋팅 을 다뤄보도록 하죠. ------------------..

9. C언어로 OS 만들기

이제 본격적으로 C언어로 OS를 개발해봅시다. 전산학을 공부한 사람이라면 어떤 언어로 프로그램을 만들던 결국 어셈블리어로 변환되고 그 후 기계어로 변해 동작한다는 것을 알 겁니다. 지금까지 짠 코드들은 모두 어셈블리어로 개발했습니다. 해당 코드와 합치기 위해선 C언어로 개발한 코드를 어셈블리어로 변환하고 궁극적으로 기계어로 변환해서 우리의 OS 이미지(image)에다 붙여넣을 것입니다. 우리의 목표는 C언어로 개발을 하되, 소스코드를 기계어로 만들어 통합하는 것입니다. C언어에서 기계어를 추출하는 방법은 여러 가지입니다. 저는 Linux 계열에서 제공하는 gcc 컴파일러를 사용할 예정입니다. 그런데 개발을 Windows 상에서 하고 있었으니... Linux를 vmware에 설치해야겠죠? 요약하면, 다음과..

8. 커널 프로그램 만들기

목차 커널이 뭔가요? 커널 프로그램 코드 설명 vmware 시뮬레이션 커널이 뭔가요? 사전적 정의를 먼저 살펴보겠습니다. 씨앗의 안쪽 부분. 생각이나 주제에 대한 중심의, 중요한 부분. - oxford 영어사전 컴퓨터에서의 커널이란, 다음 그림과 같습니다. 사진에 나와 있는 내용을 전부 다루지는 않습니다. 책에서 주로 다루는 내용은 프로세스 관리( Process Management )와 메모리 관리( Memory Management )입니다. 두 부분을 좀 더 중점적으로 공부할 수 있을 것으로 예상합니다. 커널 프로그램 아직 커널이라고 하기에는 많이 부족한 프로그램이지만, 커널을 만들어봅시다. kernel.asm 파일로 작성해주세요. kernel.asm 코드 설명 ( line 7 ) xor ax, ax ..

7. boot loader 작성하기

OS [32bit] 부트로더 작성하기 by 올리고당 2021. 7. 27. 목차 전체 코드 BIOS 인터럽트 코드 설명 실제 동작 전체 코드 이전 코드에서 삭제된 부분은 line 20 ~ 41입니다. 추가된 부분은 아래 사진에서 // 로 표시된 line 22 ~ 37 부분입니다. 추가된 코드의 모든 부분이 int 13h 명령어( line 33 )에 대해 준비하고, 그 결과에 대한 처리를 하는 과정입니다. BIOS 인터럽트 int 13h 명령어는 BIOS에서 제공하는 인터럽트 중 하나입니다. 인터럽트란, 특정 외부 입력이 들어오면 진행 중이던 절차( main program )를 잠시 멈추고, 외부 입력에 대응하는 절차( ISR : Interrupt Service Routine )를 수행한 후, 멈춘 부분(..

6. boot sector에서 프로그램 꺼내기 2

곧 부트로더가 될 프로그램 일단 해봅시다! boot1.asm 파일을 다음과 같이 작성해주세요. boot1.asm 코드 설명 Q1. mov ds, cs는 불가능 한가? : CPU 내부 구조적인 문제로, 세그먼트 레지스터의 값을 바꾸려면, 범용 레지스터를 거쳐야 합니다. - 인텔 매뉴얼 vol.1 6-16page 6.3.1.1 절 참고. Q2. 비디오 메모리 세그먼트 16비트 세그먼트:오프셋 방식으로 표현할 수 있는 주소는 0000:0000 ~ FFFF:FFFF입니다. 이 중 모두를 RAM이 사용하는 것이 아니라, 다른 주변장치에도 주소가 할당되어 있습니다. 어느 기기에 어느 주소가 할당되었는지에 대한 분포를 나타낸 것을 메모리 맵이라 합니다. 메모리 맵 ( 참고도서 36페이지 발췌 ) 실습 코드에서는 컬러..

5. boot sector에서 프로그램 꺼내기 1

코드를 이해하기 위한 레지스터 n-bit 레지스터란, n자리의 이진수를 저장할 수 있는 하드웨어입니다. CPU에 내장되어 있습니다. 포인터 레지스터 ip : 다음에 실행할 명령어를 가리키는 포인터 레지스터 ( instruction pointer ). 바로 다음 주소의 명령어를 가리키고 있습니다. 범용 레지스터 ax : 주 누산기(primary accumulator)인 ax는 주로 입출력과 대부분의 산술 연산에 쓰입니다. eax(extended ax)의 하위 16비트. ax의 상위 8비트를 ah, 하위 8비트를 al 이라고도 합니다. cx : 카운트 레지스터. 루프 반복의 횟수 혹은 쉬프트 연산 횟수를 저장하는 데에 쓰입니다. ecx(extended cx)의 하위 16비트. cx의 상위 8비트를 ch, 하..

4. bootStrap?

부트스트랩이 뭔가요? OS 분야에서 부트스트랩은 CPU에 전원이 들어오고 나서, OS 커널이 로드되기까지 외부 입력 없이 스스로 진행하는 일련의 과정을 뜻합니다. 다른 분야에서도 각각 다른 의미로 쓰이는 용어이니, 혼동 없으시길 바랍니다. 부트스트랩 과정 일반적인 PC의 부트스트랩 과정을 살펴보겠습니다. reset vector : CPU가 전원이 들어오면, 가장 먼저 확인하는 장소. 이곳에서 첫 명령어를 확인합니다. 롬처럼 각인된( hard-coded ) 레지스터가 있어 전원이 들어오지 않더라도 저장된 명령어 값이 유지됩니다. jump 명령어를 통해 바이오스( BIOS )로 실행 흐름을 넘겨줍니다. BIOS ( Basic Input/Output System ) : 사용하는 하드웨어를 점검하고, OS 커널..

3. nasm 소개

nasm이 뭔가요? 어셈블리어를 기계어로 바꾸어주는 '어셈블러'이자 '역어셈블러'입니다. 마치 C언어 코드를 기계어로 바꿔주는 컴파일러처럼 어셈블리 코드를 기계어로 바꾸어줍니다. 또, nasm을 이용해 기계어 코드를 어셈블리 코드로 바꿀 수 있습니다. nasm 설치하기 사이트에 접속합니다. https://www.nasm.us/ NASM Latest version Stable 2.15.05 History Builds List Snapshots Latest, List For users of RPM-based Linux distributions (e.g. Fedora, Red Hat, SUSE, ...), you can download the official NASM builds using dnf or yum..

20. 포트리더기랑 수정....

패치 내역... 설비 db 연동 UI 개선... 프린터, 큰화면 등 취사 선택 가능.. 실행시 자바 필요 없음... 만들고 나니, 생각지도 못했던 중복 상태시 프린트 에러 발생 및, & 제거 기능 사라짐... 화면 상에는 없지만 어찌 되었든 에러 해결... 마음 같아서는 추가 기능을 더 넣고... device 메뉴 설정 하는 버튼을 좀 더 고치고 싶은데;; 각이 안 나오고... 피곤해서 못 하겠음;; 뭐... 없어도 약간 귀찮다는 거지, 프로그램 운용에는 전혀 지장이 없음... 사용 방법을 안다는 전제 하에서...

41. 레지스트리란?

레지스트리란 윈도우계열 시스템에서 사용하는 시스템 구성 정보를 저장한 데이터베이스를 말한다. 프로세스종류, 주기억장치의 용량, 주변장치의 정보, 시스템 매개변수, 응용소프웨어에서 취급하는 파일 타입과 매개변수 등을 기록한 저장소를 말한다. 간단히 말해 레지스트리는 윈도우 계열에서 사용하는 PC의 기본설정으로 - 내가 PC를 켰을 때 자동으로 켜지는 프로그램 설정 정보 - 마우스 우클릭을 했을 때 실행되는 정보 - .txt, .mp3 등 해당 확장자를 어떤 프로그램으로 열지 등 윈도우를 이용할 때 필요한 모든 정보들이 담겨 있는 윈도우 설정 정보들이라고 생각하면 될 것 같다. 위 화면 처럼 "실행창" 에서 > "Regedit" 을 기입하여 레지스트리를 편집할 수 있습니다. 해당 명령어를 기입하면 위 화면처..

51. 자바 마우스 우측 버튼 클릭

guiex.SwingTest.java package guiex; import java.awt.Frame; import java.awt.MenuItem; import java.awt.PopupMenu; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /* 프레임에 팝업 메뉴 - 마우스 오른쪽으로 이벤트 동작 */ public class SwingTest { public static void main(String[] args) { Frame f = new Frame("팝업 메뉴"); f.setSize(300,300); // 팝업 메뉴를 만들어 놓자 PopupMenu pMenu = new PopupMenu("edit"); // Lab..