<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>bro의 이글이글 우~</title>
	<link>http://broid.egloos.com</link>
	<description>나도 모르겠3</description>
	<language>ko</language>
	<pubDate>Fri, 14 Jul 2006 14:08:59 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>bro의 이글이글 우~</title>
		<url>http://pds.egloos.com/logo/1/  </url>
		<link>http://broid.egloos.com</link>
		<width>80</width>
		<height>80</height>
		<description>나도 모르겠3</description>
	</image>
  	<item>
		<title><![CDATA[ minios에 드뎌 파일 시스템이 ㅋㅋ ]]> </title>
		<link>http://broid.egloos.com/2246982</link>
		<guid>http://broid.egloos.com/2246982</guid>
		<description>
			<![CDATA[ 
  파일 시스템은 2년전에 만들어 두고 차일피일 미뤄뒀던 minios에 파일 시스템 붙이기를<br />
어제부터 본격적(?)으로 진행 한 결과, 아래와 같이 그럭저럭 파일시스템이 붙었습니다 ㅋㅋ<br />
만드는 속도가 아주 느려서 -v- 제가 만들고 있는 os의 세부 부분을 잘 기억 못하고 있어서<br />
이번에도 프로세스 스택이 좀 작아서 생기는 (파일시스템이 붙다보니 스택이 좀 쓰이게 되었네요)<br />
문제를 좀 헤매다가 찾았습니다;<br />
역시.. 중요 포인트나 그런건 잘 정리해야 할것 같네요.. (근데 지금은 취미 os니 귀차니즘으로<br />
이 역시 미루고 있음 ㅎㅎ)<br />
<br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/[2006_07_14]fsinit.gif" class="image_mid"  border="0" alt="" /></div><br />
<br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/[2006_07_14]fs.gif" class="image_mid" border="0" alt="" /></div><br />
<br />
2006년 7월 14일 - 파일시스템 붙이기<br />
---------------------------------------------------------------<br />
<br />
miniFAT 파일 시스템이 구조체에 배열이 좀 많은데 이를 전역변수로 잡은 <br />
fatfs                g_fatfs;<br />
rom_storage         g_st;<br />
이런 것들 때문에 스택이 씨가 말라서 이상한 에러가 발생했다 -_-<br />
<br />
과감히 프로세스의 스택크기를 10000으로 늘렸다.<br />
#define PS_STACK_SIZE                        10000<br />
<br />
이제 동작한다 ㅎㅎ;... 쩝.. 튜닝해야 할 부분이 너무 많이 보인다 ㅡㅠ<br />
일단 붙여서 cd, pwd, cat이 되는걸 확인했다. md나 rm은 잘 안되는거 같다 --;<br />
차근 차근 봐야지 뭐..<br /><br />			 ]]> 
		</description>

		<comments>http://broid.egloos.com/2246982#comments</comments>
		<pubDate>Fri, 14 Jul 2006 14:08:36 GMT</pubDate>
		<dc:creator>브로</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 2006 문화관광부 우수 학술도서 선정!! ]]> </title>
		<link>http://broid.egloos.com/2113881</link>
		<guid>http://broid.egloos.com/2113881</guid>
		<description>
			<![CDATA[ 
  <img src="http://image.hanbitbook.co.kr/cover/_m_1333m.gif" /><br />
<br />
<a href="http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200507040001">http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200507040001</a><br />
<br />
저가 참여하여 출판한 책 'TCP/IP 소켓 프로그래밍'이 2005년 강컴어워드에 선정되어 <br />
기뻤는데, 올해에는 문화관광부에서 주관하는 2006 문화관광부 우수 학술도서에 선정되었답니다&nbsp; ^^<br />
<br />
감사합니다.<br />
<br />
문화관광부 (공지사항에 우수 학술도서로 검색)<br />
<a href="http://www.mct.go.kr/">http://www.mct.go.kr</a> <br />
<br />
관련 기사 <br />
<br />
<A href="http://news.naver.com/news/read.php?mode=LSD&amp;office_id=001&amp;article_id=0001319927&amp;section_id=103&amp;menu_id=103<br />
<span style="FONT-SIZE: 100%">target=_blank&gt;http://news.naver.com/news/read.php?mode=LSD&amp;office_id=001&amp;article_id=0001319927§ion_id=103&amp;menu_id=103<br />
</span></a><br />
<span style="FONT-SIZE: 100%; COLOR: #666666">문화부 우수학술도서 534종 선정 <br />
<br />
[연합뉴스 2006-06-07 14:43] <br />
<br />
<br />
<br />
<br />
광고 <br />
<br />
<br />
(서울=연합뉴스) 정천기 기자 = 문화관광부는 7일 '우리말 속담사전'(조평환 외·도서출판 파미르) 등 534종을 올해의 우수학술도서로 선정했다. <br />
분야별로는 '차의 역사'(고세연·미래문화사) 등 총류 13종, '의사소통행위이론'(위르겐 하버마스·나남출판사) 등 철학 32종, '불교의 여성관'(서영애·불교시대사) 등 종교 17종, '맥루언을 읽는다'(김균, 정연교·궁리출판) 등 사회과학 162종, '조상 이야기'(리처드 도킨스·까치글방) 등 순수과학 18종, '콩발효식품'(정동효 외·홍익재) 등 기술과학 84종, '판소리 작곡가 연구'(강예원·지식산업사) 등 예술 56종, '마침법 씨끝의 융합과 그 한계'(김수태·박이정풀판사) 등 언어 34종, '흰 그늘의 미학을 찾아서'(김지하·실천문학사) 등 문학 71종, '역사가 기억을 말하다'(전진성·휴머니스트) 등 역사 47종이다. <br />
<br />
1996년부터 매년 우수학술도서 선정지원사업을 해온 문화부는 올해는 지원액을 전년도 25억원에서 55억원으로 대폭 증액했다. 이를 통해 올해는 지난해의 142개보다 대폭 늘어난 258개 출판사에서 발행한 책을 우수학술도서로 선정했다. <br />
<br />
우수학술도서는 지난해 7월 1일부터 올해 4월 30일까지 발행된 3천70여종의 신청도서를 대상으로 분야별 전문가 44명으로 구성된 심사위원회(위원장 민영기 경희대 명예교수)가 선정했다. <br />
<br />
선정된 책은 '문화관광부 우수학술도서'라고 표시할 수 있고, 1종당 1천만원 안팎어치를 구입해 공공도서관, 해외문화원 등에 보급한다. 우수학술도서 목록은 문화부 홈페이지(www.mct.go.kr) 참조. <br />
<br />
</span><a href="http://blog.yonhapnews.co.kr/chuuki" target="_blank"><span style="FONT-SIZE: 100%">http://blog.yonhapnews.co.kr/chuuki</span></a><span style="FONT-SIZE: 100%; COLOR: #666666"><br />
<br />
</span><a href="mailto:ckchung@yna.co.kr"><span style="FONT-SIZE: 100%">ckchung@yna.co.kr</span></a><span style="FONT-SIZE: 100%; COLOR: #666666"><br />
<br />
(끝) </span><br /><br />			 ]]> 
		</description>
		<category>잡담~</category>

		<comments>http://broid.egloos.com/2113881#comments</comments>
		<pubDate>Fri, 16 Jun 2006 07:32:29 GMT</pubDate>
		<dc:creator>브로</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 나의 방향 ]]> </title>
		<link>http://broid.egloos.com/2076181</link>
		<guid>http://broid.egloos.com/2076181</guid>
		<description>
			<![CDATA[ 
  &nbsp;<br />
요즘 이런 일 저런 일로 좀 혼란스럽다.<br />
<br />
내가 해야할 일들..<br />
- MPSoC 관련 조사<br />
 - MPSoC 관련 논문/특허 분석<br />
 - Intel 아키텍처 MP Spec분석<br />
 - 리눅스 컴팔, 설치 후 SMP 관련 분석하기<br />
- SMKn RTOS for starcore 분석<br />
- starcore os 만들어보기<br />
- kosdn 발전 방향 잡기<br />
 - 스터디 진행해보기 ( Windows 동작 원리, Linker만들기 )<br />
- minios 파일 시스템 붙여보기<br />
<br />
요즘 기분이 약간 침체되었는지, 도무지 하나도 손에 잡히지 않는다.<br />
퇴근할때 버스에서 간간히 ARM 책 조금 읽다가, 집에오면 스타하다가<br />
Intel 아키텍처의 MultiProcessor 관련 조금 보다가, <br />
회사오면 SMKn 조금하다가 starcore 매뉴얼보다가, MPSoC관련은 보지도 못하고<br />
퇴근해버린다.<br />
<br />
마음을 가다듬을 필요가 있는것 같다.<br />
하나의 목표를 잡고 하나만 집중적으로 하자.<br />
<br />
회사에서는 마음 편히 SMKn만?<br />
집에와서는 그럼??<br />
뭐를 하지?? 집에서는 MPSoC 관련된것은 안할까?<br />
<br />
회사에서는 꼭&nbsp;해야하는 것을 하나만 선택해서 하고, 집에서는 휴식이 될 수 있는 것을 하자.<br />
<br />
회사서는 SMKn만.. 끝나면 리눅스 SMP를...<br />
집에서는 쉬던지, minios 파일시스템 붙이는 것만 생각해보도록 해야겠다.<br />
<br />
<br />
음. 좀 나아진건가? 회사에서 해야할 일은 좀 마음이 나아졌다.<br />
쩝 하지만 아직 잘 모르겠다.<br />
<br />
올해 내가 하게될 일을 잘 이루고 많이 얻게 된다면, 나에게도 작년 한해동안 공백이 좀<br />
채워지지 않을까 한다..<br />
<br />
<br /><br />			 ]]> 
		</description>
		<category>잡담~</category>

		<comments>http://broid.egloos.com/2076181#comments</comments>
		<pubDate>Thu, 08 Jun 2006 02:11:18 GMT</pubDate>
		<dc:creator>브로</dc:creator>
	</item>
	<item>
		<title><![CDATA[ floppy driver 로 miniapp.exe 실행하기 ]]> </title>
		<link>http://broid.egloos.com/2046235</link>
		<guid>http://broid.egloos.com/2046235</guid>
		<description>
			<![CDATA[ 
  <div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/[2006_06_01]floppy.gif" class="image_mid" border="0" alt="" /></div><br />
<br />
<br />
2006년 5월 9일 - 프로세스 영역에 커널 힙 매핑<br />
------------------------------------------------------------------------<br />
별로 어려움없이, 그냥 커널 힙의 vm_area를 매핑하였다.<br />
이제 프로세스도 그냥 커널 힙인 kheap을 사용하여 힙을 사용할 수 있다. <br />
그러면 여러 프로세스는 kheap을 공유하여 사용하게 된다.<br />
프로세스별 사용자 디폴트 힙도 필요할 것이다.<br />
일단 힙은 커널 힙을 모두 공유하자.<br />
<br />
	// setup kernel pages<br />
	vmm_map_kernel( ps->phys_page_directory );<br />
<br />
	// setup kernel heap<br />
	vmm_area_map( &va_kernel_heap, ps->phys_page_directory, (unsigned char*)VIRT_KERNEL_HEAP_BASE );<br />
<br />
다음에 해야할 것은 드뎌... 플로피디스크 드라이브를 잡는 것이다.<br />
그래서 minishell에서 miniapp.exe 명령을 주면 일단 파일시스템없는 상황에서<br />
플로피 이미지에서 섹터를 읽어 miniapp이미지를 로드해서 실행해보자.<br />
그 다음에 파일시스템과 PE 포맷을 살려 진정한 minishell> miniapp.exe를<br />
구현할 수 있다.<br />
<br />
2006년 6월 1일 - floppy driver 로 miniapp.exe 실행하기<br />
------------------------------------------------------------------------<br />
<br />
실행하면, miniapp를 위한 가상 주소 매핑 정보를 출력하고, 상단 오른편에 <br />
miniapp started!!!를 출력된다.<br />
일단 플로피에서 읽을 수 있는 것이지 아직 파일 시스템이 마련된것은 아니기때문에<br />
-_- 그냥 쉘에서 miniapp.exe가 입력되면 특정 섹터에서 miniapp.exe 이미지를<br />
읽어와서 실행하게 된다.<br />
<br />
플로피 디스크 드라이버는 일단 GazOS의 fdc.c/h를 이용하였다.<br />
테스트로 create_process_miniapp_from_fdc() 를 만들었다.<br />
마지막 인자 start_sector로 플로피 디스크의 시작 섹터와 sectors로 섹터 갯수를 주어<br />
플로피에서 miniapp.exe 이미지를 읽어와서 힙 메모리에 담아두었다가,<br />
create_process_from_memory() 함수를 이용하여 miniapp.exe를 0x10000000 주소로 복사한다.<br />
<br />
int create_process_miniapp_from_fdc( char* name, LPFN_ENTRY_POINT func, int start_sector, int sectors )<br />
{<br />
	int pid;<br />
	unsigned char* buf;	<br />
	buf = mm_alloc( &kheap, 512*sectors );<br />
	read_block(start_sector, buf, sectors );<br />
<br />
	pid = create_process_from_memory( name, func, buf, sectors );<br />
	<br />
	mm_free( &kheap, buf );<br />
	return pid;<br />
}<br />
<br />
int create_process_from_memory( char* name, LPFN_ENTRY_POINT func, unsigned char* base, int sectors )<br />
{<br />
	LPPROCESS ps, last;<br />
	LPCPU_CONTEXT ctx;<br />
	volatile WORD selector = 0x08, data_segment, stack_segment;<br />
	static int _pid;<br />
<br />
	unsigned int process_page_directory;<br />
	unsigned char kernel_sectors;<br />
	unsigned char* miniapp_base;<br />
	<br />
	// 프로세스 공간 생성<br />
	if( 0 == (ps = alloc_process() ) )<br />
		return 0;<br />
<br />
	// 스택 설정<br />
	ps->stack = (void*) ((unsigned int) ps->base + PS_STACK_SIZE - sizeof(CPU_CONTEXT));<br />
	ctx = (LPCPU_CONTEXT) ps->stack;<br />
	memset(ctx, 0, sizeof(CPU_CONTEXT));<br />
<br />
	// set process control block<br />
	ps->pid = _pid++;<br />
	ps->func = func;<br />
	ps->state = ready;<br />
	strcpy( ps->name, name );<br />
	<br />
	last = ps_get_last();<br />
	last->next = ps;<br />
	ps->next = 0;<br />
	ps->prev = last;<br />
				<br />
	crt_printf("create_process: pid = %d  stack = 0x%08X <br />
", ps->pid, ps->stack );<br />
	<br />
	__asm mov selector, cs<br />
	__asm mov data_segment, ds<br />
	__asm mov stack_segment, ss<br />
<br />
	ctx->ds = ctx->es = ctx->fs = ctx->gs = data_segment;<br />
	ctx->cs = selector;<br />
	ctx->eip = (int)ps_entry_point;<br />
	ctx->eflags = 0x202;	// IF flag 설정<br />
<br />
	// kernel page mapping 할당<br />
	ps->phys_page_directory = vmm_physic_alloc();<br />
	memset(ps->phys_page_directory, 0, PAGE_SIZE );<br />
	<br />
	// setup kernel pages<br />
	vmm_map_kernel( ps->phys_page_directory );<br />
<br />
	// setup kernel heap<br />
	vmm_area_map( &va_kernel_heap, ps->phys_page_directory, (unsigned char*)VIRT_KERNEL_HEAP_BASE );<br />
<br />
	// miniapp application 주소 영역<br />
	if( vmm_area_create( &ps->va_app, ps->phys_page_directory, <br />
		(unsigned char*)0x10000000, PAGE_SIZE*1) == 0 )<br />
	{<br />
		crt_printf( "vmm_area_create failed
");<br />
	}<br />
<br />
	// load BRDR(cr3)<br />
	process_page_directory = (unsigned int)(ps->phys_page_directory);<br />
	__asm<br />
	{<br />
		mov eax, process_page_directory<br />
		mov cr3, eax<br />
	}<br />
	<br />
	// copy miniapp to virt:0x10000000 from fdc<br />
	miniapp_base = (unsigned char*)base;<br />
	// 56번째 섹터에 miniapp 이미지가 3섹터 있다.<br />
	memcpy( (unsigned char*)0x10000000, miniapp_base, 512 * sectors);<br />
<br />
	// load BRDR(cr3)<br />
	process_page_directory = (unsigned int)g_page_directory;<br />
	__asm<br />
	{<br />
		mov eax, process_page_directory<br />
		mov cr3, eax<br />
	}<br />
<br />
	// prepare process default heap<br />
	<br />
	return ps->pid;<br />
}<br />
<br />
<br /><br />			 ]]> 
		</description>

		<comments>http://broid.egloos.com/2046235#comments</comments>
		<pubDate>Thu, 01 Jun 2006 14:57:34 GMT</pubDate>
		<dc:creator>브로</dc:creator>
	</item>
	<item>
		<title><![CDATA[ arminios 제작.. ]]> </title>
		<link>http://broid.egloos.com/2044353</link>
		<guid>http://broid.egloos.com/2044353</guid>
		<description>
			<![CDATA[ 
  &nbsp;<br />
<br />
요즘 공부용으로 arm용 os를 작성중에 있다.<br />
현재 진행된 내용은 아래와 같다.<br />
<br />
- boot code<br />
- timer interrupt<br />
- preemtive soft task switch with round-robin<br />
<br />
타겟 보드<br />
- armulator ( soft task switch without interrupt 까지 )<br />
- smdk2440 보드 ( s3c2440 soc with arm920t core )<br />
<br />
arm에서는 실행 모드가 여럿있는데 이중 IRQ 모드와 SVC 모드만 사용하였다.<br />
IRQ 모드와 SVC 모드를 위해서 따로 stack을 지정하고, IRQ모드에서 SVC 모드의 태스크 전환을 수행하고<br />
적절하게 복원해야하는게 관건이었다.<br />
특히 x86에서 IRETD나 PUSHD 같은 편리한 인스트럭션이 없어서 무척 난감하기 그지없었다. -_-<br />
<br />
이름을 슬슬 정할 때가 온것 같다. 그래서 정한것이 arminios 암이니 OS -_-;;;;?<br />
이상한가..;<br />
<br />
이번 공부를 통해서 나도 스크래치 부터 arm 쪽 os를 만들어 볼 수 있다는 자신감(?)을 얻게 되었다.<br />
이제 rtos로 가기 위해서 interrupt nested, priority based로 가야하는데 이 부분은 책을 좀 봐야겠다.<br />
책도 안보고 무턱대고 armnios를 만드니 기본적인 것도 몰라서 좀 헤맨것이 있어서 ㅡㅡ;; ㅋㅋ<br />
<br />
<br />
<br />
<br /><br />			 ]]> 
		</description>

		<comments>http://broid.egloos.com/2044353#comments</comments>
		<pubDate>Thu, 01 Jun 2006 08:08:34 GMT</pubDate>
		<dc:creator>브로</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 페이징 도입 ]]> </title>
		<link>http://broid.egloos.com/1841218</link>
		<guid>http://broid.egloos.com/1841218</guid>
		<description>
			<![CDATA[ 
  너무 오랜만이당 ㅠㅠ 너무 나태한 나 ㅡ,.ㅠ<br />
작년 11월에 커널 플랫 페이징이 되었는데, 어제 오늘 불현듯 _-minios 다시 시작해서<br />
커널 플랫 페이징 상태에서 새로운 페이지 추가 할 수 있도록 하였음..<br />
아직 프로세스 별 페이지 디렉터리를 준비하진 않아서 프로세스별 4G 영역을<br />
주진 못하는 상태<br />
<br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/[2006_04_20]kpaging.gif" class="image_mid" border="0" alt="" /></div><br />
<br />
<br />
2005년 11월 3일 - 드뎌 페이징 된다.<br />
-----------------------------------------------------------------------<br />
이사가고 여행 다녀오느라고 정신이 없었다.<br />
이제 양재다. 나도 서울 특별시민이다 음화하하하<br />
그건 그렇고 일단 페이징이라도 되는 버전을 만들기 위해서 뚝딱 뚝딱했는데, 된다.<br />
기쁘다.<br />
페이징을 활성화하기 위해서 PDBR(Page Directory Base Register)로 쓰이는 특수레지스터<br />
CR3에 페이지 디렉토리 시작 주소를 던져주고, CR0레지스터의 최상위 비트를 1로 하면<br />
페이지가 시작된다.<br />
첫번째 페이지 디렉토리를 페이지 존재하다는 PRESENT로 준 후, 이 페이지 디렉토리가<br />
가리키는 페이지 테이블(1024개의 페이지 시작 주소가 들어있음)에 커널 전체 영역을<br />
무식하게 4K씩 짤라서 페이징시켰다.<br />
vmm_setup_kernel_page()는 페이징 시작하면 바로 eip가 가리키는 주소가 가상주소로 <br />
여겨져 페이징 메커니즘을 통해서 실제 물리주소로 변환되어야 하므로, 커널이 실행되는 <br />
영역을 페이지로 매핑하는 함수이다.<br />
<br />
void vmm_setup_kernel_page()<br />
{<br />
        int kernel_pdes;<br />
        int i, n;<br />
        unsigned int* pte, *pde;<br />
        unsigned int addr;<br />
        <br />
        pde = g_page_directory;<br />
        addr = 0;<br />
        n = 0;<br />
        // 커널 영역(0x00000000 ~ KERNEL_END) 전체를 페이지로 매핑해둔다.<br />
        //kernel_pdes = (KERNEL_END/PAGE_SIZE+1; <br />
        // 일단 heap으로 쓰는 영역까지 모두 페이징 매핑 시켜두자 -_-; 무식하다.<br />
        kernel_pdes = (0x00110000+0x000fffff)/(PAGE_SIZE*1024)+1;<br />
<br />
        crt_printf("kernels page directory entries : %d
", kernel_pdes);<br />
        // 테스트로 일단 page directory 0번을 커널용 페이지 디렉토리로 사용해보자.<br />
        pte = (unsigned int*)VMM_START_PAGE_TABLE;<br />
        <br />
        while( kernel_pdes-- > 0 )<br />
        {<br />
                for( i = 0 ; i < 1024; i ++)<br />
                {<br />
                        pte[i] = addr | PF_PRESENT | PF_KERNEL | PF_READWRITE;<br />
                        addr += PAGE_SIZE;<br />
                }<br />
                pde[n++] = (unsigned int)pte | PF_PRESENT | PF_KERNEL | PF_READWRITE;<br />
        }<br />
}<br />
        // load BRDR(cr3)<br />
        __asm<br />
        {<br />
                mov eax, g_page_directory<br />
                mov cr3, eax<br />
        }<br />
<br />
        // PG(page) enable paging<br />
        __asm<br />
        {<br />
                mov eax, cr0<br />
                or eax, 0x80000000<br />
                mov cr0, eax<br />
        }<br />
<br />
이러니까 된다. 일단 오늘은 이걸로 땡..<br />
차후 해야할일은, 제대로 Paging하는 것인데, heap영역은 페이징 매핑 하지 말고 있다가<br />
malloc() 요청이 오면 그때 페이지를 마련해서 리턴해주는 방식으로 바뀌어야 한다.<br />
이러면 기존 flat memory model방식의 메모리 관리가 아니라 다르게 이쁘게 바꿔야 할듯하다.<br />
또한 #PF(Page Fault) 인터럽트가 오면 이를 처리해주는 루틴도 고려해봐야 한다.<br />
일단 그런일은 없다는 것으로 -_-;;<br />
<br />
<br />
[KB9] Paging<br />
<br />
2006년 4월 20일 - 커널 페이징 마련<br />
------------------------------------------------------------------<br />
<br />
그동안 쭉 놀다가, 어제 밤에 스타하다 이러면 안되겠다 싶어 -_-;<br />
잠깐 vmm.c 소스를 보면서 내 OS의 메모리 맵을 다시 정리했다.<br />
생각해 보니 지금 내가 페이징 vmm을 넣으려고 하는 것은 프로세스 마다<br />
자신의 고유 영역 4G 주소를 갖을 수 있도록 하기 위해서 였다.<br />
결국, 프로세스 마다 page_directory 주소를 갖고 있고, 필요에 따라서<br />
물리적인 페이지를 할당 받아, page_directory 및 page_table을 갱신하고<br />
프로세스 스위치가 일어날때 CR3 레지스터에 프로세스의 page_directory를<br />
써주면 프로세스마다 자신의 4G 주소 영역을 갖을거 같다는 생각을 했다.<br />
다음날 오재준 님의 OS 제작의 원리를 읽으니, process 구조체에 자신의<br />
page_directory 주소를 갖고 있는것을 보고, TSS 구조체에도 CR3 필드에<br />
page_directory 주소를 갖고 있는것을 보고 어느정도 내 추측이 맞았다는<br />
생각을 했다.<br />
<br />
현재는 프로세스마다 page_directory를 갖고 있지 않고, 단지 커널 전체에<br />
하나의 page_directory가 있는 구조이다. 현재는 물리 페이지 할당 함수와<br />
이 물리 페이지를 가상 주소로 map하는 함수를 구현하였는데 다행이 도는거<br />
같다 ㅠㅠ. 이제 다음에는 프로세스 마다 page_directory를 갖고 프로세스<br />
전환시 CR3값을 프로세스의 page_directory로 변경하는 것을 작성하면<br />
진정한 멀티 프로세스 OS가 될듯 하다.<br />
<br />
하나 알게 된 것은 새로운 물리 페이지를 할당해서 이를 page_directory와<br />
page_table에 갱신하게 되면 cpu에게 TLB를 갱신하라는 명령을 내려야하는데<br />
        __asm<br />
        {<br />
                mov eax, cr3<br />
                mov cr3, eax <br />
        }<br />
그냥 위처럼 해주면 TLB 전체를 갱신하게 된다. <br />
<br />
이제 아래와 같은 테스트 코드를 작성해서 <br />
void task_vmm()<br />
{<br />
        unsigned int* phys;<br />
        unsigned int* virt = (unsigned int*)0xFFFF0000;<br />
        phys = vmm_physic_alloc();<br />
<br />
        crt_printf("vmm_physic_alloc(): phys = 0x%08x
", phys );<br />
<br />
        vmm_map( virt, phys);<br />
<br />
        crt_printf("vmm_map(): 0x%08x => 0x%08x
", phys, virt );<br />
<br />
        *virt = 100;<br />
<br />
        crt_printf( "*virt = %d
", *virt );<br />
}<br />
<br />
돌려 보니 잘 돌아간다.. 오우.. 256 메가 램밖에 없는데, 0xFFFF0000번지를<br />
접근했옹 ㅠㅠ <br />
<br />
당연한 얘기지만, vmm_map( virt, phys); 라인을 주석 달면 page fault뜬다 ㅠㅠ<br />
<br />
<br />
<br />
[KB9] Paging<br />
--------------------------------------------------------------------<br />
오전 12:23 2005-10-17<br />
bro@shinbiro.com 조경민<br />
paging on x86<br />
===========================================================<br />
<br />
전제<br />
- paging은 IA-32에서 가능하다. (protected mode및 MMU를 지원하는 386이상)<br />
- PSE(Page Size Extension)은 생략한다. pentium이상에서 가능<br />
- PAE(Physical Address Extension)은 생략한다. pentium pro이상 가능<br />
- 386이상에서 가능한 기본적인 페이징에 대해서 논한다.<br />
- segmentation에 의한 linear address개념을 알고 있다 가정한다.<br />
- page size는 4K byte로 가정한다.<br />
<br />
Logical Address : Selector + Offset<br />
Linear Address : Segment Descriptor base + Offset <br />
virtual address : MMU Paging기능시 Linear Address는 virtual address라고 봄<br />
<br />
MMU의 paging은 segmentation 과정을 통해 발생된 linear address를<br />
physical address로 변환한다.<br />
paging기능을 disable시키면 logical address가 바로 linear address가 된다.<br />
한 페이지는 4KByte이며, 연속된 Physical address 영역이다. <br />
<br />
CR3 레지스터에 Page Directory 시작 주소를 설정한다.<br />
Page Directory안에 Directroy entry는 1024개가 존재한다. <br />
각 Directory Entry는 Page Table의 시작 주소를 가리키도록 설정한다.<br />
Page Table안에 Page Table Entry는 1024개이다.<br />
각 Page Table Entry는 4K바이트의 Page Frame의 시작주소를 가리킨다.<br />
Page Frame이 페이지 하나로 연속된 Physical 메모리이다.<br />
<br />
virtual address에서 Directory index와 table index와 offset을 구분해와서<br />
Page Directory 몇 번째가 가리키는 Page Table안에서 몇번째 Page Table<br />
Entry가 가리키는 4K Page Frame안에서 Offset만큼이 이 linear address가<br />
가리키는 실제 Physical address가 된다.<br />
<br />
<br />
virtual address translation<br />
---------------------------------<br />
<br />
       Virtual Address<br />
<br />
       31      22 21        12 11              0 <br />
       +---------+------------+----------------+<br />
       |Directory|   Table    |     Offset     |    4-Kbyte Page<br />
       +---------+------------+----------------+  +----------------+<br />
           |            |                     |   |                |<br />
  +--------+            |   Page Table        |   +----------------+<br />
  |   Page Directory    |  +----------------+ +-->|Physical Address| <br />
  |  +---------------+  |  |                |     +----------------+<br />
  |  |               |  |  +----------------+     |                |<br />
  |  +---------------+  +->|Page Table Entry|---->+----------------+<br />
  +->|Directory Entry|---->+----------------+      <br />
     +---------------+    <br />
     |               |  <br />
  +->+---------------+   <br />
  |<br />
  |  +---------------+<br />
  +--|CR3(PDBR)      |<br />
     +---------------+<br />
<br />
virtual(linear) address에서 Direcry부분으로 찾아간 Directory Entry의 present 비트가<br />
0이면 Page Fault, Table부분으로 찾아간 Directory.Page Table Entry의 Present<br />
비트가 0 이면 Page Fault이다.<br />
#PF 인터럽트가 발생되면 OS는 직접 디스크에서 페이지 데이터를 읽어와 로드한후<br />
present를 1로 설정한 후 다시 동작하게 할 수 있다. (page swap out)<br />
Paging에서는 linear address를 virtual address라고 부른다.<br />
<br />
paging enale 전에 해야할 일<br />
---------------------------------<br />
<br />
자신 커널공간에 대한 page table과 page directory table을 마련한다.<br />
마련하지 않고 paging enable시키면 바로 eip가 가리키는 커널 공간은<br />
page table에 존재하지 않아 Page Fault가 발생될 것이다.<br />
<br />
<br />
morecore<br />
---------------------------------<br />
<br />
malloc을 구현하기 위해서 기본적으로 커널에서 제공하는 힙 할당 함수로<br />
unix 계열에서 쓰이는 말로 WinNT기반은 MmAllocatePool 같은 것이다.<br />
물리적으로는 떨어진 Page Frame들이 할당되지만 virtual address상으로<br />
연속된 메모리 블럭을 리턴(virtual address를 리턴함)<br />
<br />
void* morecore(int size)<br />
{<br />
  int start_pte;<br />
  pte = get_page_table_entry(page_physic);<br />
  for( size/pagesize )<br />
  {<br />
    page_physic = alloc_page();<br />
<br />
    // map physical to virtual address<br />
    pde = get_directory_entry(page_physic);<br />
    if( pde.present == 0 )<br />
    {<br />
        pt_physic = alloc_page_table();<br />
       *pde = pt_physic | kernel | rw | present;<br />
    }<br />
    *pte = page_physic | kernel | rw | present;<br />
    if( start_pte == 0 )<br />
       start_pte = pte;<br />
    pte = get_next_pte(pte);<br />
  }<br />
<br />
  return start_pte; <br />
} <br />
<br />
<br />
void* malloc(int size)<br />
{<br />
   morecore를 이용하여 구현<br />
}<br />
<br />
 <br />
<br />
<br /><br />			 ]]> 
		</description>
		<category>OS만들기</category>

		<comments>http://broid.egloos.com/1841218#comments</comments>
		<pubDate>Thu, 20 Apr 2006 12:02:35 GMT</pubDate>
		<dc:creator>브로</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 작년에 만든 rtos: uSYS ]]> </title>
		<link>http://broid.egloos.com/787941</link>
		<guid>http://broid.egloos.com/787941</guid>
		<description>
			<![CDATA[ 
  아래는 작년에 맴버십에서 만들었던 usys라는 이름을 붙인 rtos..<br />
보드는 intel이 arm core 라이센스를 사서 구현한 arm 계열의 cpu인 pxa255를 넣은 보드고,<br />
그 위에 우리 rtos를 구현한거지.. 팀원은 나를 포함해서 영호랑 동국대 친구 창우랑 셋이서 했지..<br />
<br />
대충 스펙은 이렇고..<br />
scheduling : 동적우선, rate monotonic, ealry deadline first<br />
memory management, device driver hal<br />
device driver : uart, lcd, nand flash, touch, sensors(열감지,조도,습도,온도), 전력제어, IrDA(적외선리모트컨트롤)<br />
file system : fat12/16  (ram fs)<br />
network : tcp/ip, telnet server, web server<br />
windows system<br />
 <br />
이중 제가 한건 nand flash, touch, lcd device driver랑, file system, windows system이었지요..<br />
<br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/[2004_09_17]help.gif" class="image_mid" border="0" alt="" /></div><br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/[2004_09_17]process.gif" class="image_mid" border="0" alt="" /></div><br />
<br />
오실로스코프를 이용하여 각 테스트 태스크1,2,3을 실행한후<br />
각각 태스크는 보드상의 led 단자로 신호를 보내고 이를 오실로스코프로<br />
각 입력으로 받아 화면에 출력합니다.<br />
현재 uSYS 는 기본 라운드로빈 스케줄링과 리얼타임 스케줄링인<br />
RM (Rate Monotonic) 과 EDF( Eariist Deadline First ) 를 제공합니다.<br />
스크린샷은 파일 첨부를 두개 밖에 할 수 없어 --;;<br />
라운드로빈과 rm을 올립니다.<br />
제 꼬진 디카로 찍은걸 보여드려서 화질이 나쁨 -_-;<br />
오실로스코프는 마이크로세컨드 단위까지 시간을 계산할 수 있어<br />
uSYS의 인터럽트 오버헤드및 프로세스 생성 오버헤드등 rtos의 필수<br />
주요 시간을 체크하는데 도움이 많이 되었습니다.<br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/[2004_09_17]schedule_rm.gif" class="image_mid" width="400" height="300" border="0" alt="" /></div><br />
<br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/[2004_09_17]ls.gif" class="image_mid" border="0" alt="" /></div><br />
<br />
현재 uSYS에는 Nand Flash에 있는 FAT fs 이미지를 램에 올리는 <br />
램파일 시스템 형식으로 FAT12가 동작되고 있습니다. 현재 FAT 코드는<br />
FAT12/16을 지원합니다. <br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/[2004_09_17]cat.gif" class="image_mid" border="0" alt="" /></div><br />
<br />
먼저 VC로 GUI system을 만들었다.<br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/1098088007/gui0.gif" class="image_mid" width="400" height="299" border="0" alt="" /></div><br />
<br />
전력제어, 적외선리모콘, 열,조도,습도,가스 여러 센서들..<br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/ctl_sensor.jpg" class="image_mid" width="400" height="300" border="0" alt="" /></div><br />
<br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/DCP03895.jpg" class="image_mid" width="400" height="300" border="0" alt="" /></div><br />
<br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/set_touch.jpg" class="image_mid" width="400" height="300" border="0" alt="" /></div><br />
<br />
<div align="center"><img src="http://neri.cafe24.com/menu/bbs/data/project/gui.jpg" class="image_mid" width="400" height="300" border="0" alt="" /></div><br />
<br />
임베디드공모전에서 자유부문 금상 수상해서 소프트엑스포에 전시되었었다..<br />
<div align="center"><img src="http://contest.kesic.or.kr/apPhoto/photo2004/big/DSC00769b.jpg" class="image_mid" width="400" height="256" border="0" alt="" /></div><br />
<br />
<div align="center"><img src="http://contest.kesic.or.kr/apPhoto/photo2004/big/DSC00811b.jpg" class="image_mid" width="400" height="256" border="0" alt="" /></div><br />
<br />
전시를 위해서 애플리케이션으로 텔넷 서버, 웹서버, 센서, 전력제어, 리모트컨트롤 devicedriver를 만들어서<br />
웹서버를 통해서 클릭하면 가습기도 켜지고 전등도 켜지고, 스피커도 켜지고, TV나 에어콘을 컨트롤하고<br />
여러 센서 처리를 하는것을 전시 데모 보여줬다.<br />
<div align="center"><img src="http://contest.kesic.or.kr/apPhoto/photo2004/big/DSC00837b.jpg" class="image_mid" width="400" height="256" border="0" alt="" /></div><br />
<br />
<br /><br />			 ]]> 
		</description>
		<category>OS만들기</category>

		<comments>http://broid.egloos.com/787941#comments</comments>
		<pubDate>Mon, 24 Oct 2005 00:36:41 GMT</pubDate>
		<dc:creator>브로</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 강컹 4위당 ]]> </title>
		<link>http://broid.egloos.com/753841</link>
		<guid>http://broid.egloos.com/753841</guid>
		<description>
			<![CDATA[ 
  <div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds1.egloos.com/pds/1/200510/17/90/c0040390_8104286.jpg" width="500" height="330.112721417" onclick="Control.Modal.openDialog(this, event, 'http://pds1.egloos.com/pds/1/200510/17/90/c0040390_8104286.jpg');" /></div><br />
<br />
맴버십 친구들과 함께 쓴 TCP/IP 소켓 프로그래밍 책이 4위까지 올랐다~<br />
이벤트 도서의 힘을 얻긴 했지만, 이렇게 선전(?)할줄은 몰랐다. 넘 기쁘당 ^^<br />
윈도우즈 부분 소켓을 담당했는데 내가 쓴 분량이 꽤 되어서 쓸땐 약간 불만(?)이었는데<br />
출판되고 나니, 많이 썼다는게 자랑스럽당 ㅎㅎ<br />
<br />
조엘온 소프트랑 열혈강의 소켓 버전을 잠시나마 눌러보았다는것도 개인적으로 기쁨!<br />
<br />
현재 이 책은 배제대학교와 건양대학교에 교재로 사용된다고 하는 기쁜 소식도 들었다.<br /><br />			 ]]> 
		</description>
		<category>잡담~</category>

		<comments>http://broid.egloos.com/753841#comments</comments>
		<pubDate>Sun, 16 Oct 2005 23:15:10 GMT</pubDate>
		<dc:creator>브로</dc:creator>
	</item>
	<item>
		<title><![CDATA[ getch(), minishell 구현~ ]]> </title>
		<link>http://broid.egloos.com/734506</link>
		<guid>http://broid.egloos.com/734506</guid>
		<description>
			<![CDATA[ 
  <IMG SRC="http://neri.cafe24.com/menu/bbs/data/project/[2005_10_11]minishell.gif" CLASS=IMAGE_MID BORDER=0><br />
<br />
2005년 10월 11일 - 휴가 나온 동생 보고 옴<br />
----------------------------------------------------------------------<br />
keyboard 입력에 대한 생각만 정리하였다.<br />
늦게 군대간 동생 휴가가 나왔다 해서 집에 다녀왔다.<br />
<br />
2005년 10월 12일 - interrupt getch(), minishell<br />
----------------------------------------------------------------------<br />
getch()는 polling 방식으로는 쉽게 구현할 수 있다. 하지만 busy wait이기<br />
때문에 쓸데없이 cpu낭비를 하게 된다. interrupt로 키입력을 받고 이 키입력<br />
을 버퍼에 넣고, getch()하면 리턴해주고 getch()할때 키버퍼가 비었다면<br />
해당 프로세스를 block처리하고 key input i/o wait queue에 넣어두다가 <br />
키입력이 발생되면 block된 프로세스를 ready시키고 키값을 리턴하는 방식이<br />
interrupt getch() 방식이다.<br />
역시 block을 위해서 항상 ready상태인 dummy process가 필요한데 이제 이름을<br />
idle process라고 정했다.<br />
드뎌 문자열 입력을 제대로 받을 수 있으므로 바로 쉘인 minishell을 만들어<br />
봤다. 간단한 명령어만 지원하는 minishell이다.<br />
<br /><br />			 ]]> 
		</description>

		<comments>http://broid.egloos.com/734506#comments</comments>
		<pubDate>Wed, 12 Oct 2005 14:30:20 GMT</pubDate>
		<dc:creator>브로</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 세마포어 구현 ^^ ]]> </title>
		<link>http://broid.egloos.com/731817</link>
		<guid>http://broid.egloos.com/731817</guid>
		<description>
			<![CDATA[ 
  <IMG SRC="http://neri.cafe24.com/menu/bbs/data/project/[2005_10_10]semaphore.gif" CLASS=IMAGE_MID BORDER=0><br />
<br />
2005년 10월 10일 - 세마포어<br />
-----------------------------------------------------------------------<br />
process state를 갖도록 하여 세마포어 wait()이 일어날때 process state를<br />
block으로 주어 schedule에 빠지도록 구현하였다. semaphore.post()가 일어나면<br />
semaphore에 저장된 wait queue에서 해당 process를 끄내와 block된 상태에서<br />
ready 상태로 변경해주었다.<br />
모든 프로세스가 block된 상태라면 현재 scheduler는 무조건 첫번째 process를<br />
block 상태임에도 선택해와서 running상태로 만드는 버그가 있었다.<br />
현재는 idle process개념을 두지 않고 세마포어 테스트시 dummy process를 <br />
같이 생성하여 이 문제를 당분간 해결하였다. 차 후에 커널의 모든 프로세스가<br />
멈춰있을때 돌아가는 idle process를 두어야 겠다.<br />
<br />
<br />
스크린샷을 보면 동기화 객체 세마포어에 의해 task_sem1과 task_sem2는<br />
서로 상호배제적으로 실행되게 된다.<br />
<br />
kernel_start() 에서<br />
semaphore                g_sem1;<br />
        sem_open( &g_sem1, 1 );<br />
        create_process( task_dummy );<br />
        create_process( task_sem1 );<br />
        create_process( task_sem2 );<br />
<br />
<br />
void task_dummy()<br />
{<br />
        while(1)<br />
        {<br />
                _asm int 0x30<br />
        }<br />
}<br />
<br />
void task_sem1()<br />
{<br />
        while(1)<br />
        {<br />
                sem_wait( &g_sem1 );                <br />
                crt_printf( "[sem%d] = 1
", ps_get_current()->pid );<br />
                sleep();<br />
                crt_printf( "[sem%d] = 2
", ps_get_current()->pid );<br />
                sleep();<br />
                sem_post( &g_sem1 );<br />
        }<br />
}<br />
<br />
void task_sem2()<br />
{<br />
        while(1)<br />
        {<br />
                sem_wait( &g_sem1 );<br />
                <br />
                crt_printf( "[sem%d] = 1
", ps_get_current()->pid );<br />
                sleep();<br />
                crt_printf( "[sem%d] = 2
", ps_get_current()->pid );<br />
                sleep();<br />
                crt_printf( "[sem%d] = 3
", ps_get_current()->pid );<br />
                sleep();<br />
<br />
                sem_post( &g_sem1 );<br />
        }<br />
}<br />
<br />
더 해야할 일<br />
mutex, event 정도는 마련해야 할듯하다.<br />
<br />
typedef struct _wait_queue<br />
{<br />
        LPPROCESS                        ps;<br />
        struct _wait_queue*        next;<br />
}wait_queue;<br />
<br />
// kernel object<br />
typedef struct _kernel_object<br />
{<br />
        char        name[10];<br />
}kernel_object;<br />
<br />
// semaphore object<br />
typedef struct _semaphore<br />
{<br />
        kernel_object        object;<br />
        wait_queue                wait_head;<br />
        int                                counter;<br />
}semaphore;<br />
<br />
void sem_open( semaphore* s, int counter );<br />
void sem_wait( semaphore* s );<br />
void sem_post( semaphore* s );<br />
<br />
void sem_open( semaphore* s, int counter )<br />
{<br />
        ENTER_CRITICAL_SECTION();<br />
        memset( s, 0, sizeof(semaphore) );<br />
        if( counter == 0 )<br />
                counter = 1;<br />
<br />
        s->wait_head.next = 0;<br />
        s->counter = counter;<br />
        EXIT_CRITICAL_SECTION();<br />
}<br />
<br />
wait_queue* wq_get_last( wait_queue* wq )<br />
{<br />
        while( wq && wq->next )<br />
                wq = wq->next;<br />
        return wq;<br />
}<br />
<br />
void sem_wait( semaphore* s )<br />
{<br />
        ENTER_CRITICAL_SECTION();<br />
        //crt_printf("(%d) sem_wait call
", ps_get_current()->pid );<br />
        if( s->counter > 0 )<br />
        {<br />
                s->counter--;<br />
                //crt_printf("(%d) sem.counter = %d 
", ps_get_current()->pid, s->counter );<br />
                //crt_printf("(%d) sem_wait return
", ps_get_current()->pid );<br />
                EXIT_CRITICAL_SECTION();<br />
        }<br />
        else<br />
        {<br />
                // add wait queue<br />
                wait_queue* wq_last = wq_get_last( &s->wait_head );<br />
                wait_queue* wq = (wait_queue*)mm_alloc( sizeof(wait_queue) );<br />
                s->counter--;<br />
                wq_last->next = wq;<br />
                wq->next = 0;<br />
                wq->ps = ps_get_current();<br />
                wq->ps->state = block;<br />
                //crt_printf("(%d) -> block 
", ps_get_current()->pid );<br />
                //crt_printf("(%d) sem_wait return
", ps_get_current()->pid );<br />
                EXIT_CRITICAL_SECTION();<br />
                _asm int 0x30;<br />
        }<br />
}<br />
<br />
void sem_post( semaphore* s )<br />
{<br />
        wait_queue* wq;<br />
        ENTER_CRITICAL_SECTION();        <br />
        //crt_printf("(%d) sem_post call
", ps_get_current()->pid );<br />
        wq = s->wait_head.next;<br />
        //crt_printf("(%d) sem.counter = %d 
", ps_get_current()->pid, s->counter );<br />
        if( wq != 0 )<br />
        {<br />
                s->wait_head.next = wq->next;<br />
                wq->ps->state = ready;<br />
                //crt_printf("(%d) -> ready 
", wq->ps->pid );<br />
                mm_free(wq);<br />
                //crt_printf("(%d) sem_post return
", ps_get_current()->pid );<br />
                EXIT_CRITICAL_SECTION();<br />
                _asm int 0x30;<br />
                return;<br />
        }<br />
        <br />
        s->counter++;<br />
        <br />
        //crt_printf("(%d) sem_post return
", ps_get_current()->pid );<br />
        EXIT_CRITICAL_SECTION();<br />
} <br />
<br /><br />			 ]]> 
		</description>
		<category>OS만들기</category>

		<comments>http://broid.egloos.com/731817#comments</comments>
		<pubDate>Wed, 12 Oct 2005 02:27:34 GMT</pubDate>
		<dc:creator>브로</dc:creator>
	</item>
</channel>
</rss>
