본문 바로가기

basic

[OS만들기] day 07: PIC(Programmable Interrupt Controller)의 초기화 오늘의 결과물 timer로 interrupt로 인해서 This is the timer interrupt 부분의 첫 글자가 계속 다른 글자로 변경됩니다. 저번 시간 간단 복습 뭔가 저번 시간에 했던 IDT가 잘 기억이 나지 않았습니다. 간단하게 요약하면, cli라는 명령어로 EFLAGS라는 레지스터의 interrupt 플래그를 0으로 만들어 줍니다. 그리고 IDT를 등록해서 인터럽트가 걸리면 어디로 갈 지 설정해줍니다. 이후, sti 명령어로 EFLAGS 레지스터의 interrupt 플래그를 1로 만들어줍니다. interrupt 플래그가 1이면, 인터럽트를 받을 준비가 됐다는 의미입니다. 오늘의 코드 ; init.inc SysCodeSelector equ 0x08 SysDataSelector equ 0x1.. 더보기
[OS만들기] day 06: IDT 오늘의 결과물 오늘은 day05와 결과물이 같습니다. 추가된 결과물은 없고, 설명만 추가했습니다. IDT 만들기 Protected Mode에서 인터럽트를 구현하기 위해서 테이블이 하나 필요한데, 이 것을 IDT(Interrupt Descriptor Table)가 필요합니다. IDT는 GDT와 마찬가지로 RAM 상에 저장되며, 메모리 중 어느 곳이라도 저장이 가능합니다. 이 테이블은 256개의 디스크립터로 구성되어 있으며, GDT의 디스크립터와 유사하게 생겼습니다. GDT의 디스크립터는 메모리의 세그먼트 영역을 포함하고 있었지만, IDT는 해당 인터럽트가 발생했을 때 어느 루틴을 실행시켜야 하는지에 대한 정보를 포함하고 있습니다. IDT 디스크립터 핸들러의 오프셋은 핸들러가 자리하고 있는 RAM 상의 물리.. 더보기
[OS만들기] day 05: 인터럽트와 예외 오늘의 결과물 inturrupt가 발생한 부분 타이머에 의한 인터럽트로 인해 floppy disk를 계속 끄고 있기 때문에, 무한으로 재부팅 되는 모습. 코드 ; src\\init.inc SysCodeSelector equ 0x08 SysDataSelector equ 0x10 VideoSelector equ 0x18 ; src\\boot.asm %include "src/init.inc" [org 0] jmp 07C0h:start start: mov ax, cs mov ds, ax mov es, ax mov ax, 0xB800 mov es, ax mov di, 0 mov ax, word [msgBack] mov cx, 0x7FF paint: mov word [es:di], ax add di, 2 dec c.. 더보기
[OS만들기] day 04: protected mode 진입하기(2) 오늘의 결과물 (이미지 상으로는 day03과 다를 바가 없지만, 코드가 좀 더 간결해졌습니다.) 소스코드 ; init.inc SysCodeSelector equ 0x08 SysDataSelector equ 0x10 VideoSelector equ 0x18 ; boot2.asm %include "src/init.inc" [org 0] jmp 07C0h:start start: mov ax, cs mov ds, ax mov es, ax mov ax, 0xB800 mov es, ax mov di, 0 mov ax, word [msgBack] mov cx, 0x7FF paint: mov word [es:di], ax add di, 2 dec cx jnz paint read: mov ax, 0x1000 mov es.. 더보기
[OS만들기] day 03: protected mode 진입하기 오늘 만든 결과물 소스코드 [org 0] [bits 16] start: mov ax, cs ; CS에는 0x1000이 들어 있습니다. mov ds, ax xor ax, ax mov ss, ax cli ; EFLAGS 레지스터의 IF(interrupt flag)를 0으로 clear sti: IF비트를 1로 set. inturrupt 활성화 lgdt[gdtr] ; gdtr 포인터에 따라서 gdt를 등록시키는 명령어 mov eax, cr0 or eax, 0x00000001 mov cr0, eax jmp $+2 ; 왜 이부분에서 jmp $+2 를 하지..? nop을 2개 쓰고..? nop nop db 0x66 ; 0x66, 0x67, 0xEA는 잘 gdt가 등록 되었다는 의미인지..? db 0x67 db 0xE.. 더보기
[OS 만들기] os 만들기 index git 링크(https://github.com/NoelBird/os-making) 진행상황 day 01: bootstrap day 02: bootloader day 03: protected mode 진입 day 04: protected mode 진입(2) day 05: 인터럽트와 예외 day 06: IDT day 07: PIC의 초기화 day 08: PIC의 초기화 - 설명 day 09: PIC의 설명(2) day10: PIC - 타이머 인터럽트 핸들러 day11: 키보드 인터럽트 핸들러 day12: Task Switching day13: Task Switching과 TSS day14: Task Switching (3) day15: Task Switching(4) day16: CALL 명령에 의한 Tas.. 더보기
[OS 만들기] day 01: bootstrap 오늘의 결과물 환경설정 HOST OS: windows 10 vmware workstation player 설치 처음에는 windows에 내장된 hyper-v를 사용하려고 했지만, hyper-v에는 플로피 디스크를 사용하려고 할 때 VFD라는 가상 플로피디스크를 만들어 줘야 했습니다. 이렇게 되면, FAT32 파일 시스템까지 구현하고 그 안에 bootstrap을 넣어야 했기 때문에 hyper-v 대신에 vmware workstation을 선택했습니다. 어셈블리: nasm 설치 masm, tasm도 있지만 이것들은 windows에 국한되는 assembly라서 제외했습니다 hex editor: hxd 설치 010 editor에 비해 무료이고 가볍기 때문에 hxd를 설치했습니다. 소스코드(nasm assembl.. 더보기
[백엔드 관련 패턴] 도메인 모델 패턴 vs 트랜젝션 스크립트 패턴 도메인 모델 패턴: 엔티티가 비즈니스 로직을 가지고 객체 지향의 특성을 적극 활용하는 것 트랜잭션 스크립트 패턴: 엔티티에는 비즈니스 로직이 거의 없고 서비스 계층에서 대부분의 비즈니스 로직을 처리하는 것 참고자료 http://martinfowler.com/eaaCatalog/domainModel.html http://martinfowler.com/eaaCatalog/transactionScript.html 둘 중 하나가 무조건 틀렸다 보다는 상황에 따라서 다르기 때문에, 어떤 것이 더 맞는지를 선택하는 것이 필요합니다. 더보기