2006년 06월 01일
floppy driver 로 miniapp.exe 실행하기

2006년 5월 9일 - 프로세스 영역에 커널 힙 매핑
------------------------------------------------------------------------
별로 어려움없이, 그냥 커널 힙의 vm_area를 매핑하였다.
이제 프로세스도 그냥 커널 힙인 kheap을 사용하여 힙을 사용할 수 있다.
그러면 여러 프로세스는 kheap을 공유하여 사용하게 된다.
프로세스별 사용자 디폴트 힙도 필요할 것이다.
일단 힙은 커널 힙을 모두 공유하자.
// setup kernel pages
vmm_map_kernel( ps->phys_page_directory );
// setup kernel heap
vmm_area_map( &va_kernel_heap, ps->phys_page_directory, (unsigned char*)VIRT_KERNEL_HEAP_BASE );
다음에 해야할 것은 드뎌... 플로피디스크 드라이브를 잡는 것이다.
그래서 minishell에서 miniapp.exe 명령을 주면 일단 파일시스템없는 상황에서
플로피 이미지에서 섹터를 읽어 miniapp이미지를 로드해서 실행해보자.
그 다음에 파일시스템과 PE 포맷을 살려 진정한 minishell> miniapp.exe를
구현할 수 있다.
2006년 6월 1일 - floppy driver 로 miniapp.exe 실행하기
------------------------------------------------------------------------
실행하면, miniapp를 위한 가상 주소 매핑 정보를 출력하고, 상단 오른편에
miniapp started!!!를 출력된다.
일단 플로피에서 읽을 수 있는 것이지 아직 파일 시스템이 마련된것은 아니기때문에
-_- 그냥 쉘에서 miniapp.exe가 입력되면 특정 섹터에서 miniapp.exe 이미지를
읽어와서 실행하게 된다.
플로피 디스크 드라이버는 일단 GazOS의 fdc.c/h를 이용하였다.
테스트로 create_process_miniapp_from_fdc() 를 만들었다.
마지막 인자 start_sector로 플로피 디스크의 시작 섹터와 sectors로 섹터 갯수를 주어
플로피에서 miniapp.exe 이미지를 읽어와서 힙 메모리에 담아두었다가,
create_process_from_memory() 함수를 이용하여 miniapp.exe를 0x10000000 주소로 복사한다.
int create_process_miniapp_from_fdc( char* name, LPFN_ENTRY_POINT func, int start_sector, int sectors )
{
int pid;
unsigned char* buf;
buf = mm_alloc( &kheap, 512*sectors );
read_block(start_sector, buf, sectors );
pid = create_process_from_memory( name, func, buf, sectors );
mm_free( &kheap, buf );
return pid;
}
int create_process_from_memory( char* name, LPFN_ENTRY_POINT func, unsigned char* base, int sectors )
{
LPPROCESS ps, last;
LPCPU_CONTEXT ctx;
volatile WORD selector = 0x08, data_segment, stack_segment;
static int _pid;
unsigned int process_page_directory;
unsigned char kernel_sectors;
unsigned char* miniapp_base;
// 프로세스 공간 생성
if( 0 == (ps = alloc_process() ) )
return 0;
// 스택 설정
ps->stack = (void*) ((unsigned int) ps->base + PS_STACK_SIZE - sizeof(CPU_CONTEXT));
ctx = (LPCPU_CONTEXT) ps->stack;
memset(ctx, 0, sizeof(CPU_CONTEXT));
// set process control block
ps->pid = _pid++;
ps->func = func;
ps->state = ready;
strcpy( ps->name, name );
last = ps_get_last();
last->next = ps;
ps->next = 0;
ps->prev = last;
crt_printf("create_process: pid = %d stack = 0x%08X
", ps->pid, ps->stack );
__asm mov selector, cs
__asm mov data_segment, ds
__asm mov stack_segment, ss
ctx->ds = ctx->es = ctx->fs = ctx->gs = data_segment;
ctx->cs = selector;
ctx->eip = (int)ps_entry_point;
ctx->eflags = 0x202; // IF flag 설정
// kernel page mapping 할당
ps->phys_page_directory = vmm_physic_alloc();
memset(ps->phys_page_directory, 0, PAGE_SIZE );
// setup kernel pages
vmm_map_kernel( ps->phys_page_directory );
// setup kernel heap
vmm_area_map( &va_kernel_heap, ps->phys_page_directory, (unsigned char*)VIRT_KERNEL_HEAP_BASE );
// miniapp application 주소 영역
if( vmm_area_create( &ps->va_app, ps->phys_page_directory,
(unsigned char*)0x10000000, PAGE_SIZE*1) == 0 )
{
crt_printf( "vmm_area_create failed ");
}
// load BRDR(cr3)
process_page_directory = (unsigned int)(ps->phys_page_directory);
__asm
{
mov eax, process_page_directory
mov cr3, eax
}
// copy miniapp to virt:0x10000000 from fdc
miniapp_base = (unsigned char*)base;
// 56번째 섹터에 miniapp 이미지가 3섹터 있다.
memcpy( (unsigned char*)0x10000000, miniapp_base, 512 * sectors);
// load BRDR(cr3)
process_page_directory = (unsigned int)g_page_directory;
__asm
{
mov eax, process_page_directory
mov cr3, eax
}
// prepare process default heap
return ps->pid;
}
# by | 2006/06/01 23:57 | 트랙백



