BLOG ARTICLE 프로젝트/minios OS 개발 | 6 ARTICLE FOUND

  1. 2011.12.07 minios on ipad
  2. 2011.02.11 minios - real IU !! (1)
  3. 2008.12.13 minios x86 homebrew os project
  4. 2008.12.13 IBM VGA programming
  5. 2008.12.13 minios mouse control
  6. 2008.12.10 minios on svga

아이패드에 bochs가 설치된다니 재미삼아서 예전에 만든 x86 os인 minios를 올려봤다.

음 아쉽게도 gui버전은 약간 설정에 문제있는지 화면이 깨진다.

일단 대충 콘솔버전으로 캡쳐함...

흐흐 아이패드 인증이라 가상키보드로 화면을 다 덮었넹...;

'프로젝트 > minios OS 개발' 카테고리의 다른 글

minios on ipad  (0) 2011.12.07
minios - real IU !!  (1) 2011.02.11
minios x86 homebrew os project  (0) 2008.12.13
IBM VGA programming  (0) 2008.12.13
minios mouse control  (0) 2008.12.13
minios on svga  (0) 2008.12.10
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST





2011년 2월 9일 - 그냥 만저봄2
-----------------------------------------------------
fat.img안의 FAT12 /data/wall.bmp (5:6:5) 640x480 이미지를 보여주려고 하는데,
아무래도 filesystem에서 읽는데 문제가 좀 있는듯하다.
END_OF_CLUSTER가 뜨는데, 확실한 에러는 filesystem만 따로 떼내서 디버깅해봐야할듯하다.

2011년 2월 11일 - 아이유 바탕화면
-----------------------------------------------------
드뎌 바탕화면이 나온다.
역시 minifat에 버그가 있었다... --;;
get_cluster_in_fat12() 함수에서 i번째 클러스터의 항목값 ( 다음 클러스터 값)을 읽어오는
부분에서 어이없는 버그가 숨어 있었다.

 int FATOffset = i + (i/2);
 int ThisFATEntOffset = (FATOffset % bpb->BPB_BytesPerSec );

// FAT12ClusEntryVal = *((WORD *) &fat[ThisFATEntOffset]); 버그 -_-
 FAT12ClusEntryVal = *((WORD *) &fat[FATOffset]);

512번째 클러스터를 넘어가는 부분에 있어서 오동작할 수 밖에 없게 작성했었다 -_-...
바탕화면이 640x480x16bpp다보니까 600k로 512 클러스터를 넘어가다보니 생긴 문제..
어쨋든 이젠 데이터가 다 읽힌다 ㅎㅎㅎ
김태희를 바탕화면으로 넣으려했으나, 2009년에나 대세여서 지금은 리얼 아이유가 대세니까
아이유로 급 변경했다.. ㅋㅋㅋ

 


'프로젝트 > minios OS 개발' 카테고리의 다른 글

minios on ipad  (0) 2011.12.07
minios - real IU !!  (1) 2011.02.11
minios x86 homebrew os project  (0) 2008.12.13
IBM VGA programming  (0) 2008.12.13
minios mouse control  (0) 2008.12.13
minios on svga  (0) 2008.12.10
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 2011.04.13 20:22  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다




2004년에 시작. ㅎㅎ;; (정말 생각날때 조금씩 하고 있습니다)
이전까지는 floppy상의 filesystem에서 pe exe를 로드해 4G 프로세스로 실행하는 protected mode console os였는데, 요즘 (2008-12-07) 문득, 이를 windows os로 만들고 싶어졌습니다.


현재 구현 현황
-----------------------------------------------

bootloader
protected mode
process management
soft task switch
system call : task yield
scheduling : round-robin 
interrupt
system timer
crt driver
keyboard driver
semaphore
memory management : mm_alloc(), mm_free()
key interrupted i/o : getch(), gets()
mini-shell : help, cls, ps, dump
paging : 4G virtual memory mangement per each process
file system : fat12/16
application executable format : PE
svga driver
mouse driver
windows system


'프로젝트 > minios OS 개발' 카테고리의 다른 글

minios on ipad  (0) 2011.12.07
minios - real IU !!  (1) 2011.02.11
minios x86 homebrew os project  (0) 2008.12.13
IBM VGA programming  (0) 2008.12.13
minios mouse control  (0) 2008.12.13
minios on svga  (0) 2008.12.10
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



오후 1:35 2008-12-08
IBM VGA programming
=========================================

IBM VGA프로그래밍은 다음 기능을 사용하여 하게 된다.
- VGA low-level register (vga i/o)
- VGA/VESA BIOS (int 10h)

참고: VGA는 거의 표준 호환되지만 SVGA부터는 비디오카드 벤더마다 각자 자신만의 3D가속이나 여러 함수를 추가하였다.

기본적으로 VGA BIOS 코드는 VGA low-level register를 사용하고 있다.
SVGA를 지원하기 위해 extended BIOS로 VESA BIOS기능으로 같은 10h인터럽트에 AL레지스터에 4Fh를 주어 동작된다.

모든 low-level register는 i/o port를 통해서 접근된다.
IBM PC는 메모리 버스와 I/O버스가 구분되어 있다.
따라서 low-level register는 IBM pc가 real mode이든 protected mode이든 i/o를 통해서
접근 가능하다.


low-level register에는 다음과 같은 군이 있다.
----------------------------------------------------
Graphic Register - CPU가 video RAM을 어떻게 접근할지 방법을 설정
Sequencer Register - video data를 DAC에게 어떻게 보낼지 설정
Attribute Controller Register - EGA/CGA compatibility를 위해사용되는 16/64 칼라 팔레트를 선택
CRT Controller Register - 어떻게 video가 display로 출력될지 방법을 설정
Color Register - 256 color palette 설정
External Register - video system 설정용 여러 레지스터


VGA BIOS를 이용
-----------------------------------------------------
이를 쉽게 프로그래밍할 수 있도록 BIOS에서 인터럽트 벡터로 제공하고 있다.
이를 사용하기 위해서 cpu레지스터에 파라미터를 넣고 int 10h를 호출하게 된다.
BIOS기능 호출은 real mode에서만 가능하다.

보호모드에서는 BIOS 호출을 할 수 없다. 
보호모드에서 BIOS를 사용해서 VGA를 설정하고 싶다면 다음과 같은 방법을 사용한다.
- real mode에서 video 설정을 끝내고 protected mode로 들어감.
- protected mode에서 unreal mode로 들어와서 video를 설정하고 다시 protected mode로 감.
- 보호모드에서 V86 Task를 생성해서 이 emulate된 real mode상에서 비디오 설정
- VBE (VESA Bios Extension)을 사용하여 보호모드에서 직접 VESA BIOS를 호출. (비디오카드에 따라 제공안할 수 있음)

참고사항
------------------------------------------------------
http://forum.osdev.org/viewtopic.php?f=1&t=18445
Note that you can use PMode <-> RMode switching or v86 for using BIOS calls, but the second method is generally not recommended for disk IO (cf. Windows 95!). PMode <-> RMode switching also needs to be done very carefully and can get messy. If you go to long mode, you will need drivers (there's no v86 mode).

참고
-------------------------------------------------------
FreeVGA (low-level VGA)
http://www.stanford.edu/class/cs140/projects/pintos/specs/freevga/freevga.htm

VBE3
http://www.vesa.org/vbe3.pdf

VESA/VGA BIOS emulation
http://unix.derkeiler.com/pdf/Newsgroups/comp.os.vms/2004-12/1177.pdf

Drawing In Protected Mode
http://wiki.osdev.org/Drawing_In_Protected_Mode

IBM BIOS
http://www.bioscentral.com/postcodes/ibmbios.htm

'프로젝트 > minios OS 개발' 카테고리의 다른 글

minios on ipad  (0) 2011.12.07
minios - real IU !!  (1) 2011.02.11
minios x86 homebrew os project  (0) 2008.12.13
IBM VGA programming  (0) 2008.12.13
minios mouse control  (0) 2008.12.13
minios on svga  (0) 2008.12.10
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


마우스 제어가 되네요!
어제 계속 마우스 인터럽트 (irq 12h)가 발생되지 않아서 알고 봤더니, PIC (programmable interrupt controller)를 잘못 짜고 있었네요..;

이 말이 나를 살렸습니다 ㅡㅡ;
Also remind that prior to receive IRQ12, you must enable this interrupt at
the slave PIC (will be #4, iirc) and the cascade interrupt at master PIC (#2).
You must also send a "end of interrupt" to both PICs at the end of your ISR
(i.e. "mov al, 20h; out 20h,al; out 0a0h, al").


아래는 640x480x16bpp상에서 minios를 실행한 화면입니다.
아쉽게도 --; minifat 파일시스템의 버그로 300K 쯤 넘는 부분을 읽다가 제대로 못읽는 경우가 생기는군요.. (으흑.. 다시 파일시스템 테스트를 잘 해봐야겠네요)

바탕화면으로 쓰려던것은 태희아가씨였는데.. ㅠㅠ 크헉.. 하필이면 이마만 나오냐고..

아직 마우스 버튼 제어가 어색해서 윈도우 창을 드래그 해서 이동시키는게 잘 안되고 있네요..

음.. 오늘까지 일단 이정도 해놓고.. cpu 설계 쪽으로 한번 해봐야겠네요.

더보기


 

'프로젝트 > minios OS 개발' 카테고리의 다른 글

minios on ipad  (0) 2011.12.07
minios - real IU !!  (1) 2011.02.11
minios x86 homebrew os project  (0) 2008.12.13
IBM VGA programming  (0) 2008.12.13
minios mouse control  (0) 2008.12.13
minios on svga  (0) 2008.12.10
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


음.. broneri homebrew project에는 minios를 두지 않으려 했는데 블로그를 두개로 운영하려니 귀찮네요..; (http://minios.tistory.com 는 천천히 없애야겠네요 )



윈도우 시스템은 역시나 예전에 만들어두었던 minigui를 사용하였습니다. 4년이 넘은 코드에 의존하고 있다니 --;

아래는 mini gui가 최초(?)로 사용된 arm rtos 인 usys os의 화면입니다.
이 땐 LCD컨트롤러만 잡으면 기본적으로 linear한 frame buffer가 잡혔지요. 그리고 터치 드라이버를 작성해서 터치로 설정할 수 있게 했었습니다.

어쨋든 Mini-GUI 소스 헤더에  2004/10/18라는 타임 스탬프는 저를 놀라게 하는군요. -_- 세월은 참 빠르구나.. 드뎌 mini fat과 mini gui가 모두 mini os로 이식되는구낭. ㅠ.ㅠ (혼자 감회가 새로움) ㅋㅋ

다시 x86 mini os로 돌아와서.. 문제는 아직 마우스를 잡지 않아서 아무런 컨트롤도 할 수 없다는 것이었습니다. 뜨헉...
어서 마우스를 먼저 잡아야 할것 같네요.

아래는 svga vesa 114h, 800x600x16bpp 입니다.

아래는 svga vesa 111h, 640x480x16bpp입니다.

부팅 시 리얼 모드에서 아래와 같이 먼저 svga를 vesa bios를 이용하여 설정합니다.
;   mov    bx, 0x114 ; ok, 800x600 5:6:5
   mov    bx, 0x111 ; ok, 640x480 5:6:5
   or     bh, 0x40 ; want linear model, clear screen (LFB linear Frame buffer)
   mov   ax, 0x4F02 ; change mode
   int   0x10 ; go
이 때 LFB (linear frame buffer)의 주소가 어디서부터 시작하는지 알아내야 합니다. (VMWare의 경우 두 svga 모드 모두 0xF0000000 번지였습니다. )

따라서 꽁수(?)를 부려서 0x9000번지에 vbe_mode_info 정보를 담아두도록 했습니다.
   mov ax, 0x900
   mov es, ax ; save ModeInfoBlock to 900:0h = 0x9000
   mov ax, 4f01h ; get vbe_mode_info
  ; mov cx, 0x114 ; vbe mode (800x600 5:6:5)
   mov cx, 0x111 ; vbe mode (640x480 5:6:5)
   mov di, 0x0   
   int 0x10

그리곤 32 bit protected kernel의 시작 엔트리가 호출되면 잽싸게 0x9000번지의 소중한(?) 현재 svga설정 값들을 받아왔습니다.

VBEMode* p = (VBEMode*)0x9000;
lfb_width = p->bytes; // 한 줄 scan line의 바이트 수
lfb = p->lfbaddr; // lfb 시작 주소 (젤중요)
lfb_xres = p->xres;
lfb_yres = p->yres;

그리고 최초 kernel의 virtual memory mapping시 lfb 주소 공간도 매핑하도록 추가하였습니다.
void vmm_map_kernel( unsigned char* phys_page_directory )
{
vmm_maps( "boot", phys_page_directory, (unsigned char*)PHYS_BOOT_START, (unsigned char*)VIRT_BOOT_START, PHYS_BOOT_PAGES );
vmm_maps( "bios", phys_page_directory, (unsigned char*)PHYS_BIOS_START, (unsigned char*)VIRT_BIOS_START, PHYS_BIOS_PAGES );
vmm_maps( "kheap", phys_page_directory, (unsigned char*)PHYS_KHEAP_START, (unsigned char*)VIRT_KHEAP_START, PHYS_KHEAP_PAGES );
vmm_maps( "kernel", phys_page_directory, (unsigned char*)PHYS_KERNEL_START, (unsigned char*)VIRT_KERNEL_START, PHYS_KERNEL_PAGES );
vmm_maps( "vmm", phys_page_directory, (unsigned char*)PHYS_VMM_START, (unsigned char*)VIRT_VMM_START, PHYS_VMM_PAGES );

vmm_maps( "lfb", phys_page_directory, (unsigned char*)PHYS_LFB_START, (unsigned char*)VIRT_LFB_START, PHYS_LFB_PAGES );
}
아주 재미있는 것은 아까 받아온 0xF0000000라는 주소는 언뜻보기엔 가상주소같은데 physical 주소라는 것이지요! 

이제 점을 찍을 수 있습니다. 

void my_draw_setpixel( int x, int y, COLOR cr )
{
char* vmem = (char*)lfb;

*((unsigned short*)(vmem + (lfb_width*y) + x * 2)) = cr;

'프로젝트 > minios OS 개발' 카테고리의 다른 글

minios on ipad  (0) 2011.12.07
minios - real IU !!  (1) 2011.02.11
minios x86 homebrew os project  (0) 2008.12.13
IBM VGA programming  (0) 2008.12.13
minios mouse control  (0) 2008.12.13
minios on svga  (0) 2008.12.10
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


티스토리 툴바