kbu1564 / helloos Goto Github PK
View Code? Open in Web Editor NEWThe Operating System is executed on x86 Intel CPU Instruction set. It is written in assembly language only.
License: MIT License
The Operating System is executed on x86 Intel CPU Instruction set. It is written in assembly language only.
License: MIT License
현재 필요한 부분만 임의적으로 매핑이 되어진 상태
x86 Architecture는 Memory Mapped IO와 Port Mapped IO 방식이 공존하는 형태 이므로
하드웨어의 예약된 메모리 번지의 안정적인 사용을 위해 전 영역을 매핑 시키는 작업이 필요!!
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 파일을 검색하여 로드하여야 하지만 존재하였다가 지워도 지워진 영역에 찾아가서 로드 시킨다..... 파일이 제거되었어도 실행이 된다. 이러한 문제에 의해 커널이 정상 부팅되지 않고 있다.
VideoDescriptor Segment 부분은 현재 0xB800 번지의 메모리를 지정해 놓고 있던 상태인데
해당 주소에 인터럽트 활성화 전에는 정상적으로 화면 출력 등 기타 여러가지 함수가 정상 동작한 반면
인터럽스 활성화 직후 화면 출력용 함수는 _print_byte_dump32 함수를 제외하고 모두 정상 작동을
하지 않는 상태
현재
_print32_location: dd 0
_print32_location 메모리 주소의 값이 정상적으로 참조되지 않고 비정상적인 값을 가르키게 되는 상황
해당 부분에 대한 원인 파악이 필요
Main thread 와 System UI thread 분리
USB 메모리를 이용해서 os를 개발하시는 듯 한데, 하드디스크 이미지 파일을 뱉게 하는 건 어떤가요? 쓸만한 usb도 없고 해서요 ㅎㅎ,,
한번 구경해보려고 받아서 make 했더니 cp Image/kernel.sys /cygdrive/e/kernel.sys
라면서 에러가 떠서 E: 도 없는데 도대체 뭐지.. 했네요 makefile뜯어본 다음에 알게된..
(c언클 암겨혀입니다)
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 오류가 정상 실행된다면,
지금까지 일차적인 구현단계까진 거진 다 구현된것 같다 판단된다.
소스가 현재 모듈화가 되어있지 않아 모듈화로 변환해야 할 필요성이 있음
모듈화에 대한 추가 함수가 필요함.
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.
라인수를 직접 부여하는 방식이 아니라 기존의 윈도우에서 찍어내는 방식과 동일하게
\n를 개행문자로 인식하도록 하여 개행처리 되도록 하는 _print32 함수와 개행처리용 _print32_nl 함수의 제작이 필요
부팅시 인터럽트 예외가 발생하면서 interrupt 13 General protection fault 오류가 발생
GDT및 디스크립터 테이블이 잘못되어 발생할 가능성이 높고
이 예외의 경우 GDT에 관련도가 매우 높으므로 각종 세그먼트 및 GDT 정보 및 IDT 정보를 재 점검
bitmap 형식의 트루타입 폰트 파일의 format을 분석하여
폰트 정보를 로드 후 해당 데이터를 이용하여 화면에 글씨를 출력하는 기능이 필요
해당 이슈에 대한 문제 코드는 16bit 모드에서 실행되는 함수
_load_library:
...
mov si, DiskAddressPacket
mov ah, 0x42
mov dl, byte [BootDiskNumber]
int 0x13
; DAP 에는 문제 없지만 int 0x13에서 읽히지 않음
jnc .find_to_end
...
현재 DiskAddressPacket 은 정상적으로 값이 할당이 완료된 상태이며
검색하고자 하는 파일의 데이터 영역을 올바르게 읽어오는 상태.
현재 함수 코드상 문제가 발생하여 셋팅된 DAP를 이용하여 int 13h, ah = 0x42 를 실행시 운영체제
멈춤 현상이 발생한다.
아래는 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로 셋팅
...
위 소스 부분에서 오류 발생 페이지 테이블의 구조가 잘못 된 것으로 판단됨
문제의 코드
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]
;-------------------------------------------------------------
현재 파일을 검색해서 로드 하는것은 가능하지만 폴더를 포함한 경로는 검색 불가능 하므로 이에 대한 함수적 지원이 필요함
자주 사용되는 함수들에 대한 Call Vector Table 을 구성하여 사용
Memory_Map.txt 에 사용 영역을 할당
본격적으로 그래픽 모드로 전환하기 위해 페이징 기능을 이용하여 논리주소를 특정 물리주소로 매핑 시키는 작업을 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 파일을 로드하는 것이 우선
참고 : 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 |
위 정보를 계산하여 해당 파티션의 MBR 영역의 시작점을 계산하는 코드가 필요!!
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.