minios에 드뎌 파일 시스템이 ㅋㅋ

파일 시스템은 2년전에 만들어 두고 차일피일 미뤄뒀던 minios에 파일 시스템 붙이기를
어제부터 본격적(?)으로 진행 한 결과, 아래와 같이 그럭저럭 파일시스템이 붙었습니다 ㅋㅋ
만드는 속도가 아주 느려서 -v- 제가 만들고 있는 os의 세부 부분을 잘 기억 못하고 있어서
이번에도 프로세스 스택이 좀 작아서 생기는 (파일시스템이 붙다보니 스택이 좀 쓰이게 되었네요)
문제를 좀 헤매다가 찾았습니다;
역시.. 중요 포인트나 그런건 잘 정리해야 할것 같네요.. (근데 지금은 취미 os니 귀차니즘으로
이 역시 미루고 있음 ㅎㅎ)





2006년 7월 14일 - 파일시스템 붙이기
---------------------------------------------------------------

miniFAT 파일 시스템이 구조체에 배열이 좀 많은데 이를 전역변수로 잡은
fatfs g_fatfs;
rom_storage g_st;
이런 것들 때문에 스택이 씨가 말라서 이상한 에러가 발생했다 -_-

과감히 프로세스의 스택크기를 10000으로 늘렸다.
#define PS_STACK_SIZE 10000

이제 동작한다 ㅎㅎ;... 쩝.. 튜닝해야 할 부분이 너무 많이 보인다 ㅡㅠ
일단 붙여서 cd, pwd, cat이 되는걸 확인했다. md나 rm은 잘 안되는거 같다 --;
차근 차근 봐야지 뭐..

by 브로 | 2006/07/14 23:08 | 트랙백 | 덧글(3)

2006 문화관광부 우수 학술도서 선정!!



http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200507040001

저가 참여하여 출판한 책 'TCP/IP 소켓 프로그래밍'이 2005년 강컴어워드에 선정되어
기뻤는데, 올해에는 문화관광부에서 주관하는 2006 문화관광부 우수 학술도서에 선정되었답니다  ^^

감사합니다.

문화관광부 (공지사항에 우수 학술도서로 검색)
http://www.mct.go.kr

관련 기사

target=_blank>http://news.naver.com/news/read.php?mode=LSD&office_id=001&article_id=0001319927§ion_id=103&menu_id=103

문화부 우수학술도서 534종 선정

[연합뉴스 2006-06-07 14:43]




광고


(서울=연합뉴스) 정천기 기자 = 문화관광부는 7일 '우리말 속담사전'(조평환 외·도서출판 파미르) 등 534종을 올해의 우수학술도서로 선정했다.
분야별로는 '차의 역사'(고세연·미래문화사) 등 총류 13종, '의사소통행위이론'(위르겐 하버마스·나남출판사) 등 철학 32종, '불교의 여성관'(서영애·불교시대사) 등 종교 17종, '맥루언을 읽는다'(김균, 정연교·궁리출판) 등 사회과학 162종, '조상 이야기'(리처드 도킨스·까치글방) 등 순수과학 18종, '콩발효식품'(정동효 외·홍익재) 등 기술과학 84종, '판소리 작곡가 연구'(강예원·지식산업사) 등 예술 56종, '마침법 씨끝의 융합과 그 한계'(김수태·박이정풀판사) 등 언어 34종, '흰 그늘의 미학을 찾아서'(김지하·실천문학사) 등 문학 71종, '역사가 기억을 말하다'(전진성·휴머니스트) 등 역사 47종이다.

1996년부터 매년 우수학술도서 선정지원사업을 해온 문화부는 올해는 지원액을 전년도 25억원에서 55억원으로 대폭 증액했다. 이를 통해 올해는 지난해의 142개보다 대폭 늘어난 258개 출판사에서 발행한 책을 우수학술도서로 선정했다.

우수학술도서는 지난해 7월 1일부터 올해 4월 30일까지 발행된 3천70여종의 신청도서를 대상으로 분야별 전문가 44명으로 구성된 심사위원회(위원장 민영기 경희대 명예교수)가 선정했다.

선정된 책은 '문화관광부 우수학술도서'라고 표시할 수 있고, 1종당 1천만원 안팎어치를 구입해 공공도서관, 해외문화원 등에 보급한다. 우수학술도서 목록은 문화부 홈페이지(www.mct.go.kr) 참조.

http://blog.yonhapnews.co.kr/chuuki

ckchung@yna.co.kr

(끝)

by 브로 | 2006/06/16 16:32 | 잡담~ | 트랙백 | 덧글(2)

나의 방향

 
요즘 이런 일 저런 일로 좀 혼란스럽다.

내가 해야할 일들..
- MPSoC 관련 조사
- MPSoC 관련 논문/특허 분석
- Intel 아키텍처 MP Spec분석
- 리눅스 컴팔, 설치 후 SMP 관련 분석하기
- SMKn RTOS for starcore 분석
- starcore os 만들어보기
- kosdn 발전 방향 잡기
- 스터디 진행해보기 ( Windows 동작 원리, Linker만들기 )
- minios 파일 시스템 붙여보기

요즘 기분이 약간 침체되었는지, 도무지 하나도 손에 잡히지 않는다.
퇴근할때 버스에서 간간히 ARM 책 조금 읽다가, 집에오면 스타하다가
Intel 아키텍처의 MultiProcessor 관련 조금 보다가,
회사오면 SMKn 조금하다가 starcore 매뉴얼보다가, MPSoC관련은 보지도 못하고
퇴근해버린다.

마음을 가다듬을 필요가 있는것 같다.
하나의 목표를 잡고 하나만 집중적으로 하자.

회사에서는 마음 편히 SMKn만?
집에와서는 그럼??
뭐를 하지?? 집에서는 MPSoC 관련된것은 안할까?

회사에서는 꼭 해야하는 것을 하나만 선택해서 하고, 집에서는 휴식이 될 수 있는 것을 하자.

회사서는 SMKn만.. 끝나면 리눅스 SMP를...
집에서는 쉬던지, minios 파일시스템 붙이는 것만 생각해보도록 해야겠다.


음. 좀 나아진건가? 회사에서 해야할 일은 좀 마음이 나아졌다.
쩝 하지만 아직 잘 모르겠다.

올해 내가 하게될 일을 잘 이루고 많이 얻게 된다면, 나에게도 작년 한해동안 공백이 좀
채워지지 않을까 한다..

by 브로 | 2006/06/08 11:11 | 잡담~ | 트랙백

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 | 트랙백

arminios 제작..

 

요즘 공부용으로 arm용 os를 작성중에 있다.
현재 진행된 내용은 아래와 같다.

- boot code
- timer interrupt
- preemtive soft task switch with round-robin

타겟 보드
- armulator ( soft task switch without interrupt 까지 )
- smdk2440 보드 ( s3c2440 soc with arm920t core )

arm에서는 실행 모드가 여럿있는데 이중 IRQ 모드와 SVC 모드만 사용하였다.
IRQ 모드와 SVC 모드를 위해서 따로 stack을 지정하고, IRQ모드에서 SVC 모드의 태스크 전환을 수행하고
적절하게 복원해야하는게 관건이었다.
특히 x86에서 IRETD나 PUSHD 같은 편리한 인스트럭션이 없어서 무척 난감하기 그지없었다. -_-

이름을 슬슬 정할 때가 온것 같다. 그래서 정한것이 arminios 암이니 OS -_-;;;;?
이상한가..;

이번 공부를 통해서 나도 스크래치 부터 arm 쪽 os를 만들어 볼 수 있다는 자신감(?)을 얻게 되었다.
이제 rtos로 가기 위해서 interrupt nested, priority based로 가야하는데 이 부분은 책을 좀 봐야겠다.
책도 안보고 무턱대고 armnios를 만드니 기본적인 것도 몰라서 좀 헤맨것이 있어서 ㅡㅡ;; ㅋㅋ



by 브로 | 2006/06/01 17:08 | 트랙백

페이징 도입

너무 오랜만이당 ㅠㅠ 너무 나태한 나 ㅡ,.ㅠ
작년 11월에 커널 플랫 페이징이 되었는데, 어제 오늘 불현듯 _-minios 다시 시작해서
커널 플랫 페이징 상태에서 새로운 페이지 추가 할 수 있도록 하였음..
아직 프로세스 별 페이지 디렉터리를 준비하진 않아서 프로세스별 4G 영역을
주진 못하는 상태




2005년 11월 3일 - 드뎌 페이징 된다.
-----------------------------------------------------------------------
이사가고 여행 다녀오느라고 정신이 없었다.
이제 양재다. 나도 서울 특별시민이다 음화하하하
그건 그렇고 일단 페이징이라도 되는 버전을 만들기 위해서 뚝딱 뚝딱했는데, 된다.
기쁘다.
페이징을 활성화하기 위해서 PDBR(Page Directory Base Register)로 쓰이는 특수레지스터
CR3에 페이지 디렉토리 시작 주소를 던져주고, CR0레지스터의 최상위 비트를 1로 하면
페이지가 시작된다.
첫번째 페이지 디렉토리를 페이지 존재하다는 PRESENT로 준 후, 이 페이지 디렉토리가
가리키는 페이지 테이블(1024개의 페이지 시작 주소가 들어있음)에 커널 전체 영역을
무식하게 4K씩 짤라서 페이징시켰다.
vmm_setup_kernel_page()는 페이징 시작하면 바로 eip가 가리키는 주소가 가상주소로
여겨져 페이징 메커니즘을 통해서 실제 물리주소로 변환되어야 하므로, 커널이 실행되는
영역을 페이지로 매핑하는 함수이다.

void vmm_setup_kernel_page()
{
int kernel_pdes;
int i, n;
unsigned int* pte, *pde;
unsigned int addr;

pde = g_page_directory;
addr = 0;
n = 0;
// 커널 영역(0x00000000 ~ KERNEL_END) 전체를 페이지로 매핑해둔다.
//kernel_pdes = (KERNEL_END/PAGE_SIZE+1;
// 일단 heap으로 쓰는 영역까지 모두 페이징 매핑 시켜두자 -_-; 무식하다.
kernel_pdes = (0x00110000+0x000fffff)/(PAGE_SIZE*1024)+1;

crt_printf("kernels page directory entries : %d ", kernel_pdes);
// 테스트로 일단 page directory 0번을 커널용 페이지 디렉토리로 사용해보자.
pte = (unsigned int*)VMM_START_PAGE_TABLE;

while( kernel_pdes-- > 0 )
{
for( i = 0 ; i < 1024; i ++)
{
pte[i] = addr | PF_PRESENT | PF_KERNEL | PF_READWRITE;
addr += PAGE_SIZE;
}
pde[n++] = (unsigned int)pte | PF_PRESENT | PF_KERNEL | PF_READWRITE;
}
}
// load BRDR(cr3)
__asm
{
mov eax, g_page_directory
mov cr3, eax
}

// PG(page) enable paging
__asm
{
mov eax, cr0
or eax, 0x80000000
mov cr0, eax
}

이러니까 된다. 일단 오늘은 이걸로 땡..
차후 해야할일은, 제대로 Paging하는 것인데, heap영역은 페이징 매핑 하지 말고 있다가
malloc() 요청이 오면 그때 페이지를 마련해서 리턴해주는 방식으로 바뀌어야 한다.
이러면 기존 flat memory model방식의 메모리 관리가 아니라 다르게 이쁘게 바꿔야 할듯하다.
또한 #PF(Page Fault) 인터럽트가 오면 이를 처리해주는 루틴도 고려해봐야 한다.
일단 그런일은 없다는 것으로 -_-;;


[KB9] Paging

2006년 4월 20일 - 커널 페이징 마련
------------------------------------------------------------------

그동안 쭉 놀다가, 어제 밤에 스타하다 이러면 안되겠다 싶어 -_-;
잠깐 vmm.c 소스를 보면서 내 OS의 메모리 맵을 다시 정리했다.
생각해 보니 지금 내가 페이징 vmm을 넣으려고 하는 것은 프로세스 마다
자신의 고유 영역 4G 주소를 갖을 수 있도록 하기 위해서 였다.
결국, 프로세스 마다 page_directory 주소를 갖고 있고, 필요에 따라서
물리적인 페이지를 할당 받아, page_directory 및 page_table을 갱신하고
프로세스 스위치가 일어날때 CR3 레지스터에 프로세스의 page_directory를
써주면 프로세스마다 자신의 4G 주소 영역을 갖을거 같다는 생각을 했다.
다음날 오재준 님의 OS 제작의 원리를 읽으니, process 구조체에 자신의
page_directory 주소를 갖고 있는것을 보고, TSS 구조체에도 CR3 필드에
page_directory 주소를 갖고 있는것을 보고 어느정도 내 추측이 맞았다는
생각을 했다.

현재는 프로세스마다 page_directory를 갖고 있지 않고, 단지 커널 전체에
하나의 page_directory가 있는 구조이다. 현재는 물리 페이지 할당 함수와
이 물리 페이지를 가상 주소로 map하는 함수를 구현하였는데 다행이 도는거
같다 ㅠㅠ. 이제 다음에는 프로세스 마다 page_directory를 갖고 프로세스
전환시 CR3값을 프로세스의 page_directory로 변경하는 것을 작성하면
진정한 멀티 프로세스 OS가 될듯 하다.

하나 알게 된 것은 새로운 물리 페이지를 할당해서 이를 page_directory와
page_table에 갱신하게 되면 cpu에게 TLB를 갱신하라는 명령을 내려야하는데
__asm
{
mov eax, cr3
mov cr3, eax
}
그냥 위처럼 해주면 TLB 전체를 갱신하게 된다.

이제 아래와 같은 테스트 코드를 작성해서
void task_vmm()
{
unsigned int* phys;
unsigned int* virt = (unsigned int*)0xFFFF0000;
phys = vmm_physic_alloc();

crt_printf("vmm_physic_alloc(): phys = 0x%08x ", phys );

vmm_map( virt, phys);

crt_printf("vmm_map(): 0x%08x => 0x%08x ", phys, virt );

*virt = 100;

crt_printf( "*virt = %d ", *virt );
}

돌려 보니 잘 돌아간다.. 오우.. 256 메가 램밖에 없는데, 0xFFFF0000번지를
접근했옹 ㅠㅠ

당연한 얘기지만, vmm_map( virt, phys); 라인을 주석 달면 page fault뜬다 ㅠㅠ



[KB9] Paging
--------------------------------------------------------------------
오전 12:23 2005-10-17
bro@shinbiro.com 조경민
paging on x86
===========================================================

전제
- paging은 IA-32에서 가능하다. (protected mode및 MMU를 지원하는 386이상)
- PSE(Page Size Extension)은 생략한다. pentium이상에서 가능
- PAE(Physical Address Extension)은 생략한다. pentium pro이상 가능
- 386이상에서 가능한 기본적인 페이징에 대해서 논한다.
- segmentation에 의한 linear address개념을 알고 있다 가정한다.
- page size는 4K byte로 가정한다.

Logical Address : Selector + Offset
Linear Address : Segment Descriptor base + Offset
virtual address : MMU Paging기능시 Linear Address는 virtual address라고 봄

MMU의 paging은 segmentation 과정을 통해 발생된 linear address를
physical address로 변환한다.
paging기능을 disable시키면 logical address가 바로 linear address가 된다.
한 페이지는 4KByte이며, 연속된 Physical address 영역이다.

CR3 레지스터에 Page Directory 시작 주소를 설정한다.
Page Directory안에 Directroy entry는 1024개가 존재한다.
각 Directory Entry는 Page Table의 시작 주소를 가리키도록 설정한다.
Page Table안에 Page Table Entry는 1024개이다.
각 Page Table Entry는 4K바이트의 Page Frame의 시작주소를 가리킨다.
Page Frame이 페이지 하나로 연속된 Physical 메모리이다.

virtual address에서 Directory index와 table index와 offset을 구분해와서
Page Directory 몇 번째가 가리키는 Page Table안에서 몇번째 Page Table
Entry가 가리키는 4K Page Frame안에서 Offset만큼이 이 linear address가
가리키는 실제 Physical address가 된다.


virtual address translation
---------------------------------

Virtual Address

31 22 21 12 11 0
+---------+------------+----------------+
|Directory| Table | Offset | 4-Kbyte Page
+---------+------------+----------------+ +----------------+
| | | | |
+--------+ | Page Table | +----------------+
| Page Directory | +----------------+ +-->|Physical Address|
| +---------------+ | | | +----------------+
| | | | +----------------+ | |
| +---------------+ +->|Page Table Entry|---->+----------------+
+->|Directory Entry|---->+----------------+
+---------------+
| |
+->+---------------+
|
| +---------------+
+--|CR3(PDBR) |
+---------------+

virtual(linear) address에서 Direcry부분으로 찾아간 Directory Entry의 present 비트가
0이면 Page Fault, Table부분으로 찾아간 Directory.Page Table Entry의 Present
비트가 0 이면 Page Fault이다.
#PF 인터럽트가 발생되면 OS는 직접 디스크에서 페이지 데이터를 읽어와 로드한후
present를 1로 설정한 후 다시 동작하게 할 수 있다. (page swap out)
Paging에서는 linear address를 virtual address라고 부른다.

paging enale 전에 해야할 일
---------------------------------

자신 커널공간에 대한 page table과 page directory table을 마련한다.
마련하지 않고 paging enable시키면 바로 eip가 가리키는 커널 공간은
page table에 존재하지 않아 Page Fault가 발생될 것이다.


morecore
---------------------------------

malloc을 구현하기 위해서 기본적으로 커널에서 제공하는 힙 할당 함수로
unix 계열에서 쓰이는 말로 WinNT기반은 MmAllocatePool 같은 것이다.
물리적으로는 떨어진 Page Frame들이 할당되지만 virtual address상으로
연속된 메모리 블럭을 리턴(virtual address를 리턴함)

void* morecore(int size)
{
int start_pte;
pte = get_page_table_entry(page_physic);
for( size/pagesize )
{
page_physic = alloc_page();

// map physical to virtual address
pde = get_directory_entry(page_physic);
if( pde.present == 0 )
{
pt_physic = alloc_page_table();
*pde = pt_physic | kernel | rw | present;
}
*pte = page_physic | kernel | rw | present;
if( start_pte == 0 )
start_pte = pte;
pte = get_next_pte(pte);
}

return start_pte;
}


void* malloc(int size)
{
morecore를 이용하여 구현
}



by 브로 | 2006/04/20 21:02 | OS만들기 | 트랙백(5)

작년에 만든 rtos: uSYS

아래는 작년에 맴버십에서 만들었던 usys라는 이름을 붙인 rtos..
보드는 intel이 arm core 라이센스를 사서 구현한 arm 계열의 cpu인 pxa255를 넣은 보드고,
그 위에 우리 rtos를 구현한거지.. 팀원은 나를 포함해서 영호랑 동국대 친구 창우랑 셋이서 했지..

대충 스펙은 이렇고..
scheduling : 동적우선, rate monotonic, ealry deadline first
memory management, device driver hal
device driver : uart, lcd, nand flash, touch, sensors(열감지,조도,습도,온도), 전력제어, IrDA(적외선리모트컨트롤)
file system : fat12/16 (ram fs)
network : tcp/ip, telnet server, web server
windows system

이중 제가 한건 nand flash, touch, lcd device driver랑, file system, windows system이었지요..




오실로스코프를 이용하여 각 테스트 태스크1,2,3을 실행한후
각각 태스크는 보드상의 led 단자로 신호를 보내고 이를 오실로스코프로
각 입력으로 받아 화면에 출력합니다.
현재 uSYS 는 기본 라운드로빈 스케줄링과 리얼타임 스케줄링인
RM (Rate Monotonic) 과 EDF( Eariist Deadline First ) 를 제공합니다.
스크린샷은 파일 첨부를 두개 밖에 할 수 없어 --;;
라운드로빈과 rm을 올립니다.
제 꼬진 디카로 찍은걸 보여드려서 화질이 나쁨 -_-;
오실로스코프는 마이크로세컨드 단위까지 시간을 계산할 수 있어
uSYS의 인터럽트 오버헤드및 프로세스 생성 오버헤드등 rtos의 필수
주요 시간을 체크하는데 도움이 많이 되었습니다.




현재 uSYS에는 Nand Flash에 있는 FAT fs 이미지를 램에 올리는
램파일 시스템 형식으로 FAT12가 동작되고 있습니다. 현재 FAT 코드는
FAT12/16을 지원합니다.


먼저 VC로 GUI system을 만들었다.


전력제어, 적외선리모콘, 열,조도,습도,가스 여러 센서들..








임베디드공모전에서 자유부문 금상 수상해서 소프트엑스포에 전시되었었다..




전시를 위해서 애플리케이션으로 텔넷 서버, 웹서버, 센서, 전력제어, 리모트컨트롤 devicedriver를 만들어서
웹서버를 통해서 클릭하면 가습기도 켜지고 전등도 켜지고, 스피커도 켜지고, TV나 에어콘을 컨트롤하고
여러 센서 처리를 하는것을 전시 데모 보여줬다.


by 브로 | 2005/10/24 09:36 | OS만들기 | 트랙백 | 덧글(1)

강컹 4위당



맴버십 친구들과 함께 쓴 TCP/IP 소켓 프로그래밍 책이 4위까지 올랐다~
이벤트 도서의 힘을 얻긴 했지만, 이렇게 선전(?)할줄은 몰랐다. 넘 기쁘당 ^^
윈도우즈 부분 소켓을 담당했는데 내가 쓴 분량이 꽤 되어서 쓸땐 약간 불만(?)이었는데
출판되고 나니, 많이 썼다는게 자랑스럽당 ㅎㅎ

조엘온 소프트랑 열혈강의 소켓 버전을 잠시나마 눌러보았다는것도 개인적으로 기쁨!

현재 이 책은 배제대학교와 건양대학교에 교재로 사용된다고 하는 기쁜 소식도 들었다.

by 브로 | 2005/10/17 08:15 | 잡담~ | 트랙백 | 덧글(6)

getch(), minishell 구현~



2005년 10월 11일 - 휴가 나온 동생 보고 옴
----------------------------------------------------------------------
keyboard 입력에 대한 생각만 정리하였다.
늦게 군대간 동생 휴가가 나왔다 해서 집에 다녀왔다.

2005년 10월 12일 - interrupt getch(), minishell
----------------------------------------------------------------------
getch()는 polling 방식으로는 쉽게 구현할 수 있다. 하지만 busy wait이기
때문에 쓸데없이 cpu낭비를 하게 된다. interrupt로 키입력을 받고 이 키입력
을 버퍼에 넣고, getch()하면 리턴해주고 getch()할때 키버퍼가 비었다면
해당 프로세스를 block처리하고 key input i/o wait queue에 넣어두다가
키입력이 발생되면 block된 프로세스를 ready시키고 키값을 리턴하는 방식이
interrupt getch() 방식이다.
역시 block을 위해서 항상 ready상태인 dummy process가 필요한데 이제 이름을
idle process라고 정했다.
드뎌 문자열 입력을 제대로 받을 수 있으므로 바로 쉘인 minishell을 만들어
봤다. 간단한 명령어만 지원하는 minishell이다.

by 브로 | 2005/10/12 23:30 | 트랙백(379) | 덧글(107)

◀ 이전 페이지다음 페이지 ▶