<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>이만우 블로그</title>
<link>http://maanu.net/soojung</link>
<description>나빌레라의 시니컬하게 세상살기</description>
<copyright></copyright>
<pubDate>Sun, 05 Sep 2010 15:36:52 +0900</pubDate>
<generator>soojung 0.4.13</generator>

<item>
<title>ddd를 외부 gdb와 연동할 때...</title>
<link>http://maanu.net/soojung/entry.php?blogid=484</link>
<pubDate>Sat, 15 May 2010 04:30:32 +0900</pubDate>
<category>작업</category>
<description>리눅스에서 쓸 수 있는 GUI 디버그 툴이 이렇게 없을 줄이야...-_-;;&lt;br /&gt;
&lt;br /&gt;
DDD는 한 20년 정도는 개발이 중단되어 있는것 같다..-_-;;;; 오~쉣..-_-&lt;br /&gt;
&lt;br /&gt;
아무튼.. &lt;br /&gt;
&lt;br /&gt;
DDD를 그냥 실행하면, 시스템 디폴트 gdb와 연동된다.&lt;br /&gt;
크로스 디버깅을 하려면 arm-linux-gdb와 연동되어야 한다.&lt;br /&gt;
&lt;br /&gt;
연동은 아래와 같이 한다.&lt;br /&gt;
&lt;br /&gt;
ddd --gdb --debugger /usr/local/CodeSourcery/arm-2010q1/bin/arm-none-linux-gnueabi-gdb 심볼디버깅정보를포함한이미지파일이름&lt;br /&gt;
&lt;br /&gt;
이러면 잘 된다.&lt;br /&gt;
&lt;br /&gt;
PATH가 설정되어 있다면,&lt;br /&gt;
&lt;br /&gt;
ddd -debugger arm-none-linux-gnueabi-gdb 심볼디버깅정보를포함한이미지파일이름&lt;br /&gt;
&lt;br /&gt;
라고만 해도 잘 된다. &lt;br /&gt;
&lt;br /&gt;
아~ 근데 ddd는 너무 구리다..-_-&lt;br /&gt;
libgdb 같은거 있으면 다음 프로젝트로 gdb gui tool이나 만들어 볼까..-_-</description>
</item>
<item>
<title>장고로 만든 사이트</title>
<link>http://maanu.net/soojung/entry.php?blogid=478</link>
<pubDate>Sat, 27 Feb 2010 21:48:31 +0900</pubDate>
<category>작업</category>
<description>Django로 만들었다.&lt;br /&gt;
&lt;br /&gt;
트위터 + 미투데이 + 클리앙 컨셉으로 만들었는데,&lt;br /&gt;
&lt;br /&gt;
만들고 나니 그냥 한줄 게시판이 되었다..-_-;;&lt;br /&gt;
&lt;br /&gt;
원래는 몇 가지 차별화 기능이 있긴 한데, 아직 공개 안했다.&lt;br /&gt;
&lt;br /&gt;
혹시라도 사용자들이 많아지면 그때 공개할 생각이다.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://raonlife.com&quot;&gt;http://raonlife.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
이 블로그 조차 오는 사람이 몇명 안되긴 하지만 그래도 한 번 들어서 글 써주시길..</description>
</item>
<item>
<title>우분투에서 cpas_lock과 esc 바꾸기</title>
<link>http://maanu.net/soojung/entry.php?blogid=477</link>
<pubDate>Tue, 12 Jan 2010 20:22:35 +0900</pubDate>
<category>작업</category>
<description>워낙 변화 무쌍한 우분투라 나중에 또 어떻게 설정이 바뀔지 모르겠지만,&lt;br /&gt;
&lt;br /&gt;
일단 지금 쓰고 있는 우분투에서는 &lt;br /&gt;
&lt;br /&gt;
'시스템' -&gt; '기본설정' -&gt; '키보드' -&gt; '키배치' -&gt; '키배치옵션'&lt;br /&gt;
&lt;br /&gt;
에서 간단하게 caps lock의 동작을 바꿀 수 있다.&lt;br /&gt;
&lt;br /&gt;
리눅스...&lt;br /&gt;
&lt;br /&gt;
정말 편해졌다.</description>
</item>
<item>
<title>Django에서 mysql에 한글이 들어갈때 에러가 난다면?</title>
<link>http://maanu.net/soojung/entry.php?blogid=475</link>
<pubDate>Wed, 09 Dec 2009 23:35:57 +0900</pubDate>
<category>작업</category>
<description>Django에서 사용하는 Mysql DB를 만들 때,&lt;br /&gt;
&lt;br /&gt;
create database 데이터베이스이름;&lt;br /&gt;
&lt;br /&gt;
으로 만들지 말고&lt;br /&gt;
&lt;br /&gt;
create schema 데이터베이스이름 default charset utf8;&lt;br /&gt;
&lt;br /&gt;
으로 만들면 된다.&lt;br /&gt;
&lt;br /&gt;
이거 때문에 졸라 삽질했다. -_-;</description>
</item>
<item>
<title>파이썬 소켓에서 바이너리 데이터 전송하기.</title>
<link>http://maanu.net/soojung/entry.php?blogid=462</link>
<pubDate>Tue, 08 Sep 2009 00:18:50 +0900</pubDate>
<category>작업</category>
<description>난 파이썬으로 많은 프로그램을 작성했다.&lt;br /&gt;
&lt;br /&gt;
당연히 소켓 프로그램에서 바이너리 전송도 해봤을 것이라고 생각했다.&lt;br /&gt;
&lt;br /&gt;
하지만 아니었다.&lt;br /&gt;
&lt;br /&gt;
-_-;;; &lt;br /&gt;
&lt;br /&gt;
send() argument 1 must be string or buffer, not int&lt;br /&gt;
&lt;br /&gt;
난데없는 에러메시지에 당황하고... (문자열이나 버퍼만 됐단 말이던가!!!-_-)&lt;br /&gt;
&lt;br /&gt;
약간의 구글링..&lt;br /&gt;
&lt;br /&gt;
결론은&lt;br /&gt;
&lt;br /&gt;
struct.pack()&lt;br /&gt;
&lt;br /&gt;
을 사용하면 된다고 한다. 정말 몰랐다..-_-;;; 그렇다 나는 파이썬으로 꽤 많은 소켓 프로그램을 작성했으면서도 바이너리를 서버로 보내는 클라이언트를 작성해 본적이 한 번도 없었던 것이다.&lt;br /&gt;
&lt;br /&gt;
의외로 개발 경험이 없었단 사실에 스스로 놀랐다..-_-;;;&lt;br /&gt;
&lt;br /&gt;
s = socket.socket(....)&lt;br /&gt;
buf = &quot;hi&quot;&lt;br /&gt;
s. send(buf)&lt;br /&gt;
&lt;br /&gt;
하면 에러가 안나지만&lt;br /&gt;
&lt;br /&gt;
val = 5000000000000&lt;br /&gt;
s.send(val)&lt;br /&gt;
&lt;br /&gt;
하면 에러 난다.&lt;br /&gt;
&lt;br /&gt;
s.send(struct.pack(&quot;!i&quot;, val))&lt;br /&gt;
&lt;br /&gt;
해야 에러가 나지 않는다. &quot;!i&quot;에 대해선 파이썬 도큐먼트를 참고하면 설명이 있다.</description>
</item>
<item>
<title>WDM을 이용해서 Raw Sector Data (LBA, Length, Data) 가로채기</title>
<link>http://maanu.net/soojung/entry.php?blogid=454</link>
<pubDate>Thu, 06 Aug 2009 21:07:10 +0900</pubDate>
<category>작업</category>
<description>&lt;div class=&quot;format_bbcode&quot;&gt;최근 WDM을 하나 만들었다. 평소에 윈도우 자체를 사용하지 않을 뿐 아니라 윈도우에서 개발을 별로 해 본적이 없는 나에겐 큰 시련이었다.&lt;br /&gt;
&lt;br /&gt;
그래도 약 한 달간 끊임없는 구글링과 WDK 샘플 코드를 후벼 판 결과 원하는 WDM 드라이버를 만들었다. 내가 만들고자 했던건 운영체제를 포함한 디스크 상위 레이어에서 디스크에 내려 보내는 모든 LBA 번호와 크기, 그리고 그 내용을 중간에서 가로채는 것이었다.&lt;br /&gt;
&lt;br /&gt;
일단 대부분의 윈도우 환경에서 개발이 그렇듯 바닥부터 코드를 작성할 필요는 없다. &lt;br /&gt;
&lt;br /&gt;
WDK의 샘플 소스 디렉토리에 있는 storage/filter/diskperf 소스를 이용하면 된다. 이 샘플 드라이버는 Upper Disk filter driver로 동작하여 디스크의 성능 측정치를 만들어주는 드라이버다.&lt;br /&gt;
&lt;br /&gt;
Diskperf 드라이버는 IRP_MJ_READ와 IRP_MJ_WRITE를 하나의 콜백함수로 가로챈다. 나는 이 함수에 약 20 줄 정도를 추가해서 목적을 달성했다.&lt;br /&gt;
&lt;br /&gt;
우선 Diskperf의 콜백함수에서 IO_STACK을 복사하기 전에 현재 IO_STACK의 위치를 받아온다. 위치를 받는 매크로는 IoGetCurrentIrpStackLocation()라는 긴 이름의 매크로다. 반환 값으로 IO_STACK_LOCATION 이라는 구조체의 포인터를 넘긴다.&lt;br /&gt;
&lt;br /&gt;
IO_STACK_LOCATION 구조체의 Parameta 멤버는 기다란 공용체다. 이 공용체는 메이저 함수에 따라서 분리되어 있다. Parameta.Write.Lengh 가 상위 레이어에서 디스크로 내려 보내는 버퍼의 크기다. 그리고 Parameta.Write.ByteOffset이 LBA다. &lt;br /&gt;
&lt;br /&gt;
Upper Filesystem driver에서는 ByteOffset이 File Pointer일 가능성이 크겠지만, Diskperf는 Upper Disk filter driver기 때문에 ByteOffset이 디스크를 기준으로 한 ByteOffset이 된다. 즉 LBA다.&lt;br /&gt;
&lt;br /&gt;
그리고 중요한 버퍼의 내용은 IRP 구조체의 MdlAddress를 이용해 MmGetSystemAddressForMdlSafe() 함수를 통해 버퍼 포인터를 얻어온다. 보통은 Irp-&amp;gt;AssociatedIrp.SystemBuffer를 바로 포인팅하면 되지만, Upper Disk Filter Driver는 Direct I/O를 사용하기 때문에 MdlAddress를 이용한다.&lt;br /&gt;
&lt;br /&gt;
위 내용을 이용하면 Upper Disk Filter Driver에서 LBA와 Length 그리고 Buffer Data를 얻어 낼 수 있다. 즉 하드디스크로 전달 되는 모든 데이터를 가로챌 수 있게 된다. 이걸 알게 되면 응용 분야는 정말 무한하지 않을까? 선의든... 악의든...&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;	PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp);

	if(currentIrpStack-&amp;gt;MajorFunction == IRP_MJ_WRITE){	
		PVOID			pBuff = NULL;
		PIRP  				pOrigIrp;
		KEVENT 				Event;
		IO_STATUS_BLOCK	ioStatus;
		NTSTATUS status = STATUS_UNSUCCESSFUL;

		if(Irp-&amp;gt;AssociatedIrp.SystemBuffer){
			pOneByte = Irp-&amp;gt;AssociatedIrp.SystemBuffer;		
		}
		if(Irp-&amp;gt;MdlAddress){		
			pOneByte = MmGetSystemAddressForMdlSafe(Irp-&amp;gt;MdlAddress,  NormalPagePriority );
			
			/** Read Original Sector Data **/
			pBuff = ExAllocatePool(NonPagedPool, currentIrpStack-&amp;gt;Parameters.Write.Length);			                
			KeInitializeEvent((&amp;amp;Event, NotificationEvent, FALSE);
			pOrigIrp = IoBuildSynchronousFsdRequest(IRP_MJ_READ, 
												deviceExtension-&amp;gt;TargetDeviceObject, 
												pBuff, 
												currentIrpStack-&amp;gt;Parameters.Write.Length, 
												&amp;amp;currentIrpStack-&amp;gt;Parameters.Write.ByteOffset, 	
												&amp;amp;Event, &amp;amp;ioStatus);
			if(!pOrigIrp){
				DbgPrint(&amp;quot;LBA Diff---Read IRP Craze!!!\n&amp;quot;);				
			}
			else{			
				status = IoCallDriver(deviceExtension-&amp;gt;TargetDeviceObject, pOrigIrp);
				if (status == STATUS_PENDING) 
				{
					KeWaitForSingleObject(&amp;amp;Event, Executive, KernelMode, FALSE,	NULL);
					status = ioStatus.Status;				
				}				
			}			
			ExFreePool(pBuff);
		}
	}&lt;/pre&gt;&lt;/div&gt;</description>
</item>
<item>
<title>링커 완성</title>
<link>http://maanu.net/soojung/entry.php?blogid=453</link>
<pubDate>Fri, 17 Jul 2009 23:10:38 +0900</pubDate>
<category>작업</category>
<description>어셈블러를 장장 4개월에 걸쳐 작업한것에 비하면 매우 빨리 작업한 축에 속하는&lt;br /&gt;
&lt;br /&gt;
약 20일 만에 링커를 완성했다.&lt;br /&gt;
&lt;br /&gt;
어셈블러를 작업하는 동안에 드문드문 링커의 설계와 동작 방식에 대한 생각을 많이 정리해 놨기에 빠르게 작업할 수 있었다.&lt;br /&gt;
&lt;br /&gt;
사실 동적 라이브러리를 지원하지 않기 때문에 제대로된 링커라고는 할 수 없겠지만 기본적인 재배치 개념은 충분히 구현했다고 생각한다. &lt;br /&gt;
&lt;br /&gt;
뭐 어차피 내맘대로 아닌가...&lt;br /&gt;
&lt;br /&gt;
내일 부터는 Virtual Machine 작업에 돌입한다. &lt;br /&gt;
&lt;br /&gt;
네 개의 큰 모듈 중 반이 완료되었다.&lt;br /&gt;
&lt;br /&gt;
ps. 링커를 작업하는 20여일 동안 블로그 포스팅을 두 개 밖에 안했다. 그것도 잡담으로..-_-;</description>
</item>
<item>
<title>어셈블러 완성.</title>
<link>http://maanu.net/soojung/entry.php?blogid=450</link>
<pubDate>Thu, 25 Jun 2009 21:58:44 +0900</pubDate>
<category>작업</category>
<description>운영체제에 이은 또 하나의 &lt;b&gt;나에 대한 스스로의 도전&lt;/b&gt;&lt;br /&gt;
컴파일러 만들기의 큰 모듈 네 개 중에 첫 번째 모듈인 어셈블러를 방금 완성했다.&lt;br /&gt;
&lt;br /&gt;
2009년 2월 10일날 첫 코딩을 시작해서, 퇴근 후에 짬짬히 코딩해서&lt;br /&gt;
2009년 6월 25일. 4개월 15일만에 완성했다.&lt;br /&gt;
&lt;br /&gt;
학교다닐 때였으면 두 달 정도에 끝내 버렸을 분량이지만,&lt;br /&gt;
회사 다니면서 무언가를 따로 한다는 일은 참 어려운 일이다.&lt;br /&gt;
&lt;br /&gt;
내일 부터는 두 번째 모듈인 링커 제작에 들어간다.</description>
</item>
<item>
<title>나빌언어 프로젝트중 나빌VM 아키텍처 설계(안)</title>
<link>http://maanu.net/soojung/entry.php?blogid=444</link>
<pubDate>Sun, 19 Apr 2009 12:35:04 +0900</pubDate>
<category>작업</category>
<description>&lt;b&gt; 명령어의 길이는 32bit고정 &lt;/b&gt;&lt;pre&gt;
레지스터
	4bit로 표현 : 총 16개 제공
	각 레지스터의 크기는 당연히 32bit
	범용레지스터 : 12개 (A~L)
	특수레지스터 : 3개 
	    PC - Program Counter
	    LR - Link Register
	    SP - Stack Pointer
	상태레지스터 : 1개 - ST
	    각 비트별로 사용 4개 정의 28비트 예약
	        Overflow - STO
	        Carry - STC
	        Zero - STZ
	        Negative - STN
&lt;/pre&gt;&lt;img src=/photo/opcode.png&gt;&lt;br /&gt;
&lt;img src=/photo/opcode_bit.png&gt;&lt;br /&gt;
&lt;br /&gt;
명령어의 기계어 코드 배정&lt;br /&gt;
	⁃	MOV		0x01&lt;br /&gt;
	⁃	ADD		0x02&lt;br /&gt;
	⁃	SUB		0x03&lt;br /&gt;
	⁃	MUL		0x04&lt;br /&gt;
	⁃	DIV		0x05&lt;br /&gt;
	⁃	CMP		0x06&lt;br /&gt;
	⁃	AND		0x07&lt;br /&gt;
	⁃	OR			0x08&lt;br /&gt;
	⁃	XOR		0x09&lt;br /&gt;
	⁃	SHL		0x0A&lt;br /&gt;
	⁃	SHR		0x0B&lt;br /&gt;
	⁃	B			0x0C&lt;br /&gt;
	⁃	BSUB		0x0D&lt;br /&gt;
	⁃	BEQ		0x0E&lt;br /&gt;
	⁃	BGT		0x0F&lt;br /&gt;
	⁃	BLT		0x10&lt;br /&gt;
	⁃	BGET		0x11&lt;br /&gt;
	⁃	BLET		0x12&lt;br /&gt;
	⁃	LDR		0x13&lt;br /&gt;
	⁃	STR		0x14&lt;br /&gt;
	⁃	LDM		0x15&lt;br /&gt;
	⁃	STM		0x16&lt;br /&gt;
	⁃	OPT		0x17&lt;br /&gt;
	⁃	0x18~0x1F 까지 예약&lt;br /&gt;
&lt;br /&gt;
레지스터의 기계어 주소 배정&lt;br /&gt;
	⁃	ST			0x0&lt;br /&gt;
	⁃	A			0x1&lt;br /&gt;
	⁃	B			0x2&lt;br /&gt;
	⁃	C			0x3&lt;br /&gt;
	⁃	D			0x4&lt;br /&gt;
	⁃	E			0x5&lt;br /&gt;
	⁃	F			0x6&lt;br /&gt;
	⁃	G			0x7&lt;br /&gt;
	⁃	H			0x8&lt;br /&gt;
	⁃	I			0x9&lt;br /&gt;
	⁃	J			0xA&lt;br /&gt;
	⁃	K			0xB&lt;br /&gt;
	⁃	L			0xC&lt;br /&gt;
	⁃	PC			0xD&lt;br /&gt;
	⁃	LR			0xE&lt;br /&gt;
	⁃	SP			0xF</description>
</item>
<item>
<title>나빌언어 프로젝트 중 오브젝트 코드 형식 설계 (안)</title>
<link>http://maanu.net/soojung/entry.php?blogid=442</link>
<pubDate>Thu, 09 Apr 2009 23:49:35 +0900</pubDate>
<category>작업</category>
<description>&lt;img src=/photo/objformat.png&gt;&lt;br /&gt;
&lt;br /&gt;
1. 내부 심볼 참조 테이블&lt;br /&gt;
각 obj 파일의 순서가 링커에 의해 정렬되고 나면 각각의 obj 파일은 내부 심볼에 대해서 더해야 할 세그먼트의 크기가 정해진다. 정해진 세그먼트 값을 &lt;b&gt;내부 심볼 주소&lt;/b&gt;에 일괄적으로 더한다.&lt;br /&gt;
&lt;br /&gt;
2. 외부 심볼 참조 테이블&lt;br /&gt;
모든 obj 파일에 내부 심볼에 대한 주소가 확정되고 나면 다시 각 obj 파일을 순회하면서 외부 심볼의 주소를 확정해 준다. 이때 발견되지 않는 심볼이 있다면 에러가 난다.&lt;br /&gt;
&lt;br /&gt;
3. 실행 이미지 만들기&lt;br /&gt;
내부/외부 심볼 참조 테이블에 주소 재배치를 완료하고 나면 해당 심볼을 참조하고 있는 명령어의 주소부분의 값을 모두 바꿔준다. 그리고 각 obj 파일의 기계어 부분을 모두 합친다.</description>
</item>

</channel>
</rss>

