GithubHelp home page GithubHelp logo

kbu1564 / helloos Goto Github PK

View Code? Open in Web Editor NEW
18.0 18.0 9.0 13.68 MB

The Operating System is executed on x86 Intel CPU Instruction set. It is written in assembly language only.

License: MIT License

Assembly 87.26% Makefile 2.23% C++ 8.88% C 1.63%
assembly-language operating-system

helloos's People

Contributors

kbu1564 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

helloos's Issues

32bit Paging에서 4GB 영역 매핑

현재 필요한 부분만 임의적으로 매핑이 되어진 상태
x86 Architecture는 Memory Mapped IO와 Port Mapped IO 방식이 공존하는 형태 이므로

하드웨어의 예약된 메모리 번지의 안정적인 사용을 위해 전 영역을 매핑 시키는 작업이 필요!!

Can't run on after installation of HelloOS.

MBR(MasterBootRecord) -> FAT32 RootFileEntry Load -> kernel.sys Search -> Find!!
Find to kernel.sys -> 0x8000 Load -> jmp 0x8000

지금 정상루틴이라면 위처럼 로딩되야 한다. 하지만 현재 FAT32 RootFileEntry 로드하는 부분과 kernel.sys 파일을 찾는 함수 부분이 잘못되어 1차 커널을 로드하지 못하는 문제가 있다.

로드 후 kernel.protected.sys 파일을 검색하여 로드하여야 하지만 존재하였다가 지워도 지워진 영역에 찾아가서 로드 시킨다..... 파일이 제거되었어도 실행이 된다. 이러한 문제에 의해 커널이 정상 부팅되지 않고 있다.

Interrupt 활성화 직후 지정된 메모리 주소 Write 관련 오류

VideoDescriptor Segment 부분은 현재 0xB800 번지의 메모리를 지정해 놓고 있던 상태인데
해당 주소에 인터럽트 활성화 전에는 정상적으로 화면 출력 등 기타 여러가지 함수가 정상 동작한 반면

인터럽스 활성화 직후 화면 출력용 함수는 _print_byte_dump32 함수를 제외하고 모두 정상 작동을
하지 않는 상태

현재

_print32_location: dd 0

_print32_location 메모리 주소의 값이 정상적으로 참조되지 않고 비정상적인 값을 가르키게 되는 상황
해당 부분에 대한 원인 파악이 필요

가상 hdd img를 사용한 os 실행은 안될까요?

USB 메모리를 이용해서 os를 개발하시는 듯 한데, 하드디스크 이미지 파일을 뱉게 하는 건 어떤가요? 쓸만한 usb도 없고 해서요 ㅎㅎ,,
한번 구경해보려고 받아서 make 했더니 cp Image/kernel.sys /cygdrive/e/kernel.sys 라면서 에러가 떠서 E: 도 없는데 도대체 뭐지.. 했네요 makefile뜯어본 다음에 알게된..

(c언클 암겨혀입니다)

IDT 등록후 페이징 기능 활성화와 인터럽트 작동하면 튕기는 문제

현재 IDT 라이브러리가 제작이 완료되어

kernel.interrupt.asm 파일의 내부에 존재하는 _kernel_set_idt() 함수를 이용하여 인터럽트 테이블을 구성하는데 예기치 않은 오류가 발생한다.

운영체제가 무한 재부팅 하는 현상이 발생.
_kernel_set_idt 함수 내부에 _print_byte_dump32 함수를 이용하여 메모리 덤프를 이용하여 IDT 저장 상태 체크를 완료 한 상태.

원인은 TSS 테이블과 GDT 를 다시 등록해 주는 작업이 필요할 것 같음
bug1

_kernel_is_enough_memory 함수가 A20기능을 체크하는 가?

A20의 경우 보통 20번째 비트가 무조건 0으로 됨으로써 짝수번째의 주소의 MB 단위 주소에 접근이 불가능 하게 되므로 이를 가능하게 하기위해 A20 기능을 활성화 하여 20번째 비트를 사용이 가능하도록 하는 것인데

_kernel_is_enough_memory 의 경우 64MB 단위 체크는 알맞지만 A20의 기능을 체크하기에는 알맞지 않은 구문이 포함되는가? 이다.

A20 의 기능이 작동하는지 체크하기 위해서는
20번째의 비트가 0인 주소에 0값을 넣은 후 20번째 비트가 1인 주소에 접근후 0인 비트가 0값이 아니면 A20 기능이 활성화 되지 않은 것으로 체크하는 식으로
함수를 제작하면 될것이다.

ps. 이 문제점을 일깨워준 손XX 형에게 감사한다.

인터럽트나 예외 실행에 따른 번호가 출력

인터럽트나 예외 실행에 따른 번호가 출력이 되면 좋을것 같다.

진행은 아마 페이징 관련된 오류가 해결되는대로 시작이 될것 같으며.

페이징 관련기능이 정상 작동하고 page fault 오류가 정상 실행된다면,

지금까지 일차적인 구현단계까진 거진 다 구현된것 같다 판단된다.

Refactor 1.0

소스가 현재 모듈화가 되어있지 않아 모듈화로 변환해야 할 필요성이 있음
모듈화에 대한 추가 함수가 필요함.
This source was not made to modules. So, it need of change to modularity to source.
And, it need to append functions to load modules.

이에 대해 소스 리펙토링 하기로 결정. 추후 소스 추가 수정 삭제의 편의를 위해
하지만 어셈블리로 계속 작성할 예정
I think to refactoring of source. but This project has made to only the Netwide Assembler and Makefile.

_print32 함수의 기능 강화 필요

라인수를 직접 부여하는 방식이 아니라 기존의 윈도우에서 찍어내는 방식과 동일하게

\n를 개행문자로 인식하도록 하여 개행처리 되도록 하는 _print32 함수와 개행처리용 _print32_nl 함수의 제작이 필요

실제 머신상 General protection fault 오류 발생

부팅시 인터럽트 예외가 발생하면서 interrupt 13 General protection fault 오류가 발생

GDT및 디스크립터 테이블이 잘못되어 발생할 가능성이 높고
이 예외의 경우 GDT에 관련도가 매우 높으므로 각종 세그먼트 및 GDT 정보 및 IDT 정보를 재 점검

Bitmap 폰트 파일 로드

bitmap 형식의 트루타입 폰트 파일의 format을 분석하여
폰트 정보를 로드 후 해당 데이터를 이용하여 화면에 글씨를 출력하는 기능이 필요

kernel.file.asm : load_library 함수 실행시 작동 중지 문제

해당 이슈에 대한 문제 코드는 16bit 모드에서 실행되는 함수

_load_library:
...
mov si, DiskAddressPacket
mov ah, 0x42
mov dl, byte [BootDiskNumber]
int 0x13
; DAP 에는 문제 없지만 int 0x13에서 읽히지 않음
jnc .find_to_end
...

bugfix 1

현재 DiskAddressPacket 은 정상적으로 값이 할당이 완료된 상태이며
검색하고자 하는 파일의 데이터 영역을 올바르게 읽어오는 상태.

현재 함수 코드상 문제가 발생하여 셋팅된 DAP를 이용하여 int 13h, ah = 0x42 를 실행시 운영체제
멈춤 현상이 발생한다.

페이징 기능 활성화할 경우 OS 튕기는 문제

아래는 kernel.asm 파일의 일부

call _kernel_init_paging
; 페이징 초기화, 활성화
; 이놈이 실행된 순간 모든 주소는 논리주소로 해석됨...

mov ax, 0
call _mask_pic
; 모든 PIC 활성화

sti
; 인터럽트 활성화

문제의 코드 부분 위 부분에서 _kernel_init_paging 함수를 사용하여 해당 함수 내부의 코드중에서 kernel.mmu.asm

...
mov eax, cr0
or eax, 0x80000000
mov cr0, eax
; 페이징을 시작하기 위해 컨트롤 레지스터에서
; 최상위 비트를 1로 셋팅
...

위 소스 부분에서 오류 발생 페이지 테이블의 구조가 잘못 된 것으로 판단됨

bug2

TSS를 위한 GDT 재 등록시 인터럽트/예외 작동 안하는 문제

문제의 코드

and ah, 0xF0
; kernel.gdt.asm line : 92

위 코드로 인해 GDT가 재 등록시 정상적인 디스크립터 테이블에 옵션값이 등록되지 않는 것이였다.
따라서 위 코드를 아래와 같이 수정

shl ah, 4
; kernel.gdt.asm line : 92

인터럽트 정상작동 모습

; kernel.asm
;-------------------------------------------------------------
; 인터럽트 발생 테스트
; 여러가지 인터럽트 예외를 강제적으로 발생시킨다.
;-------------------------------------------------------------
; devide error!!
mov eax, 10
mov ecx, 0
div ecx

; page fault!!
;mov ecx, 0x12345678
;mov eax, dword [0x01000000]
;-------------------------------------------------------------

success1
인터럽트 정상 작동하는 모습

특정 경로의 파일을 로드하는 함수 필요

현재 파일을 검색해서 로드 하는것은 가능하지만 폴더를 포함한 경로는 검색 불가능 하므로 이에 대한 함수적 지원이 필요함

자주 사용되는 함수들에 대한 Call Vector Table 을 구성하여 사용
Memory_Map.txt 에 사용 영역을 할당

페이징 기능으로 kernel memory allocator 함수 제작 필요

본격적으로 그래픽 모드로 전환하기 위해 페이징 기능을 이용하여 논리주소를 특정 물리주소로 매핑 시키는 작업을 kernel.mmu.asm 파일에 구현

; esi에 설정된 논리주소에 대한 페이지 디렉토리 엔트리에 해당하는
; 페이지 테이블의 위치 주소값을 계산 하여 디렉토리 앤트리 값을 설정한 후
; 해당 페이지 테이블을 초기화 한다
;
; 이 함수는 커널권한의 메모리를 확보합니다.
; 요청한 주소로 부터 지정된 크기의 커널 메모리를 할당 받습니다.
;
; 함수 형태:
; A의 논리 주소부터 B만큼의 공간을 실제 물리메모리의 C에 매핑합니다.
; void _kernel_alloc(void* A, void* C, size_t B);
;
; 주의:
; 이 함수는 메모리의 사용여부와 관계없이 지정된 값만큼의
; 메모리를 무조건 매핑시킵니다.
;
; push 커널 페이지를 할당할 논리 메모리 시작 주소
; push 매핑할 실제 물리 메모리 시작 주소
; push 할당할 메모리의 크기(4KB의 배수단위로 생성)
_kernel_alloc:
...
    ret 12
...

이와 같이 논리 주소값을 인자값으로 받아들여 페이지 디렉토리의 엔트리를 커널 영역으로 설정하고 해당 논리주소의 테이블 엔트리 부분에 매핑되는 물리주소의 영역옵션 역시 커널옵션으로 설정 함으로써 물리메모리 상의 존재하지 않는 구간을 마치 존재하는 것처럼 사용할 수 있으며.

이 커널 메모리 할당 함수를 구현하게 될 경우 보다 간편하게 메모리 할당/매핑을 관리 할 수 있다.

따라서 위의 페이징 작업을 진행하여야 GUI 그래픽 모드로 전환 준비 작업이 마무리 되게 된다.

페이지 테이블의 구조상 하나의 테이블이 4MiB 이상이 매핑 될 수 있을까?
없을 것이다. 따라서 _kernel_alloc 함수는 최대 4MiB를 매핑하도록 한다.

이미지 파일 로드 함수 제작

특정 경로의 이미지를 로딩하는 함수가 필요
순수 어셈블리로 제작할 것이므로 우선은 BMP 파일을 로드하는 것이 우선

  • 추후 그래픽 카드 자원 사용을 통해 속도 증가
  • 마우스 그리는 부분을 인터럽트에서 처리하지 말고 큐에 담았다가 다른 루틴에서 처리할 것

FAT32 계열의 USB에서의 GPT 지원 부분

참고 : http://electronicmakeiteasy.blogspot.kr/2013/05/master-boot-record.html

Address Length Description
0x0000 to 0x01BD 446 bytes Boot Loader Code
0x01BE to 0x01CD 16 bytes Partition entry 1
0x01CE to 0x01DD 16 bytes Partition entry 2
0x01DE to 0x01ED 16 bytes Partition entry 3
0x01EE to 0x01FD 16 bytes Partition entry 4
0x01FE to 0x01FF 16 bytes Boot Record signature (55 AA)

0번지 섹터에 최대 4개까지의 파티션 정보를 담을 수 있으며 파티션에 대한 정보는 아래와 같음

Length Description
1 Boot indicator (0x00 = Inactive, 0x80 = Active)
3 Starting head, cylinder and sector (refer Head, Cylinder and sector)
1 File system descriptor (refer Partition Type Listing)
3 Ending head, cylinder and sector
4 Starting sector (offset to disk start)
4 Number of sector in partition

support 1

위 정보를 계산하여 해당 파티션의 MBR 영역의 시작점을 계산하는 코드가 필요!!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.