3-2학기 2009. 1. 22. 15:29

2008년도 2학기에 진행되었던 프로젝트 텀이다.

우리들은 시리얼통신이 가능한 보드를 직접 디자인 & 납땜 으로 개발하고
그 위에서 돌아가는 펌웨어를 작성, 그 펌웨어를 이용하는 리눅스상의 어플리케이션을
작성하여 같은 프로토콜을 갖는 다른조와 통신하는 텀 프로젝트를 진행하였다.

사용된 인터페이스카드는 PCI9030카드, CPU는 ARM7_TDMI(삼성에서 제조된모델이다)
DPRAM에, MAX232모듈을 사용한 RS232통신을 하였다.

리눅스<->PCI9030<->보드<->MAX232<->선<->MAX232<->보드<->PCI9030<->리눅스

위와같은 흐름이다. 물론 중간의 메커니즘은 뺴고 대략적인 흐름만 볼때말이다.

MAX232에서 수신한 바이트 정보는 DPRAM에 저장하고(영역을 구분한다) 전송이 완료되었다고 판단되면 그제서야 그에 대한 인터럽트를 PCI9030에 발생시킨다. 그리고 그 인터럽트 정보를 통해 리눅스에서는 정보를 수신하여 가져오는 것이다. 이러한 구조로 통신을 한 결과는 성공적이었다.


어플리케이션의 경우, 단순한 채팅 + 타자배틀게임 이었고 상대방 조와의 원활한
협조로 인해 순조롭게 잘 진행되었다.

보드의 경우 김태성군이  밤을 새어가며 납땜을 하며 고생을 해주었으나, 잘못구성되어
다시 김태성군이 고생을하여 여러번 고치고 새로 만들어 결국 제대로된 보드를 만들었다.
또한 여학우 임에도 불구하고 한승혜양이 납떔하느라 고생을 조금 한듯하다.

PCI9030카드와의 세팅 및 점검은 김지훈군이 도맡았고, 연결확인 및 점검은 한승혜, 김지훈군이
도맡다 시피했다.

내가맡은 부분은 어셈블리 펌웨어 부분 100%및 C코드로 작성된 펌웨어의 70~80%정도 이다.
초창기에 어셈블리어를 알고있는 조원이 나 하나 뿐이었기에 중 후반부 까지는 거의 혼자 펌웨어 작업을 진행하였다. 도큐먼트 서칭 및 계산은 김지훈 군과 내가 같이 진행하였다.
후반부는 각종 실험외 개인적 문제로 패닉에 빠진 나 대신 김지훈군이 잘 마무리 해주었다.

사용된 리눅스 배포버젼은 우분투 8.10 이고 커널벼전은 모르겠다..
GUI작성을 위해 QT4라이브러리가 사용되었다.
QT어플리케이션 작성은 김태성군이 도맡았고,  패킷정의 및 패킷을 위한 모듈 라이브러리 작성은
내가 일부 작성하여 모듈을 넘겨주었다.


이 실험은 통신 보드를 작성하고, 직접 드라이버레벨을 컨트롤하며 어플리케이션까지 만들어보는
진정한 의미의 첫 임베디드 프로젝트라 할수 있다. 시리얼이 비록 보잘것 없어 보일지 모르나, 그 단순한 작동을 위해 필요한 여러가지 조건들을 깨달을 수있었고 직접 도큐먼트를 보며 구현하며 하나하나 배울수 있었던 좋은경험이라 생각한다.

팀원들간의 조합도 매우 좋고, 상대편 조와의 조합도 매우좋아 협동도 잘되었고 서로 의논도 잘되어 최상의 팀워크를 자랑했다고 생각한다.

아마도 가자힘든점은 롬을 매번 구우러 가야된다라는 사실과, 문제가생기면 이게 하드웨어 설계의 문제인지, 납땜의 문제인지, 펌웨어의 문제인지, 어플리케이션의 문제인지, 아니면 하드웨어자체의 불량인지를 가늠하기가 쉽지 않다라는 점이다.




말끔한(??) 보드 레이아웃 및 작동어플(우리조, 상대조)

사용자 삽입 이미지

사용자 삽입 이미지
사용자 삽입 이미지





<상대방조가(호철이네) 작성한 어플리케이션>
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

posted by Sense.J
:
3-2학기 2008. 10. 27. 03:22
학과에서 텀과제가 난이도가 높기로 꽤 정평이 나신 탁성우 교수님의 과제로 나온

ActiveX기반으로 작동하는 방화벽 시스템 이다.

우선 이 시스템은 커널 레벨의 Hook Driver(by DDK)를 이용하여 작동한다.
tcp/ip 프로토콜 계층으로 신호를 넘기기 전에, 훅된 드라이버로 먼저 패킷을 넘겨받아 처리한후
tcp/ip 프로토콜 계층으로 데이터를 넘기기에 가능해지는 원리이다.
이를 구현하기위해서는 DDK(Driver Development Kit)이라는 라이브러리가 필요하다.
드라이버는 network 계층과 transport계층 사이에 위치하게 되고, 이정보를 어플리케이션이
컨트롤 하게되면 방화벽이 작동하게 되는 원리이다.

최종 보고가 프로젝트 시작으로부터 4주 뒤였기에, 4주간 개발을 진행하였다.
실질적인 기능 작동은 2주 정도 후부터 작동하기 시작했다.

드라이버의 개발은 내가 맡았고, ActiveX를 이용한 어플리케이션 작성 및 연동은
한승혜 양이 맡았다.
어플리케이션과 드라이버를 연결하는 커넥팅 부분은 내가 직접 구현을 하였다.

커널레벨의 드라이버를 구현함에 있어 속도저하없이 Rule을 삽입하기위해, 링크드 리스트를 직접
구현하였는데 그 방식을 단순화시켜 속도를 극대화하였다.
삽입시에는 제일 앞에 삽입하여 삽입하는데 소요되는 시간은 O(1)이 되게 하였다.
이렇게 한 이유는 커널레벨의 malloc시에 시간이 소모되므로, 네트웤 속도에 최대한 영향을 안미치기위해 고안한 방법이다.

커널레벨에서 작동하는 Hook Driver는 매우 민감하여 메모리참조 오류가 발생할경우 블루스크린을 띄우고 윈도우가 작렬히 사망한다. 이러한 문제로 윈도우즈 파일시스템이 망가져 고생하는 다른 팀원들도 많았다. 이 점이 방화벽을 만드는데 있어 가장 힘들게 하는 점이기도 하다.
개인적으로는 Vmware에 XP를 설치하고 작업하는것을 추천한다.

구현된 기능으로는 간단할 정도의 방화벽 시스템으로써

1.IP/PORT방어,
2.전송량제어
3.단어제어
4..패킷모니터링(그래프 출력)
5.세션제어
6.실시간 프로세스를 인식하여 taskmgr처러 보여주는 기능
위와 같은 기능들이다.

약간의 문제가 있는 부분은 패킷모니터링 부분인데 약간의 꼼수로 구현을 해놓았다.
일정 타이밍주기로 전송량을 읽어와서 화면에 출력하게 했는데 이는 정석이 아니다.
정석으로 구현한 사람은 주변에 최모군이 구현을 했는데 그 방식은 다음과 같다.
업로드나 다운로드시에 드라이버 레벨에서 인터럽트를 발생시키고, 어플리케이션은 그 인터럽트를 캐치하면 드라이버에 전송양을 요구하여 전송양을 읽어오는것이다. 이렇게 하면  굉장히 아름다운(?) 어플을 짤수 있을것이다. 나도 시도는 해보았지만 MSDN에서 그러한 정보를 찾아내는것을 실패하여 끝내 구현하지 못한부분이다.


교수님이 처음에 올려주신 샘플코드에 중요한 결함이 있어 커널레벨의 드라이버가 불안정하여 프로그램이 작동하다가 블루스크린을 출력하여 죽어버리는 경우가 있었는데 아직도 원인은 모르겠다. 하지만 아예 구조를 분석하고 드라이버 틀 생성기(Quick SYS)를 이용하여 틀을 생성한후, 나머지 모든 부분을 직접 설계하고 작성한 이 방화벽 시스템은 안정성을 보장하였으나, 교수님이 올려주신 소스를 그대로 이용하여 시작한 조들은 모두다 시연도중 오작동하는 결과를 보였다.

몇몇 팀들은 한해전 선배들의 코드를 그대로 받아와 제출한 조도 있었다고한다.
이는 자신의 경험을 져버리는 행위라고 생각한다. ....물론 나는 아니다.....

이 방화벽 시스템을 ActiveX로 구현할 사람이 누가될지는 모르겠다.
부산대학교 정보컴퓨터 공학부 후배들이 될수도 있고, 타학교의 컴공생일지 모르겠지만
한번쯤 해볼만한 경험이라 생각한다.

같은학기, 다른 분반의 다른팀은 4명이서 방화벽시스템을 구현하려고 시도하려다, 끝내 실패하고 패킷캡쳐 라이브러리를 이용하여 유사한 시스템을 구현한것을 본적이 있다.  이는 거의 구현하는부분은 없다고 봐도 무방하다.  팀원이 훨씬많은데도 말이다.

이는 개인 능력의 차이도 있을거라 생각하지만, 준비성의 부족이라고 생각한다.
MSDN을 통한 정보검색, 웹서핑을 통한 커널레벨의 특성 등을 제대로 파악하고, TCP/IP에 대해서 약간의 공부를 한다음 시작한다면 무리없이 2주안에 기본적인 방화벽은 작성할수 있을거라
생각한다.

사용자 삽입 이미지

사용자 삽입 이미지
                                                        <문제의 화면>


ActiveX로 배포하기위한 패키징 툴을 올린다.
내가 쓰던 패키징 배포파일이 포함되어 있다. step1,step2.bat파일을 잘 보고 조절하며
firewall.inf 파일을 잘 수정하길 바란다. 이거 찾느라고 예전에 고생을 좀 했었는데
필요하신분은 가져다 쓰길바란다.




추가로 혹시나 방화벽으로 검색해서 들어오신분이 계실것 같아 내용추가합니다.

Visual Studio 6.0에서 작동하는 DDK(링크)
http://download.microsoft.com/download/9/0/f/90f019ac-8243-48d3-91cf-81fc4093ecfd/1830_usa_ddk.iso

현재 위의 링크는 홈페이지상에서는 안보이지만 저링크로 다운받을수 있다.
아마 저 버젼이 6.0에서 억지로라도 컴파일이 가능한 마지막버젼인듯하다.

약간의 디파인값들을 수정하여 주면 6.0에서도 잘 컴파일된다.
비쥬얼스튜디오2005이상에서는 그냥 컴파일되므로 편할대로 하면된다.
아래의 링크를 참조하면 해결가능하다..(본인이 사용했던방법)
http://blog.naver.com/fruach?Redirect=Log&logNo=150018484930



또한 커널 레벨에서 디버그 메시지를 출력할수있는데 이는 드라이버 디버깅시에
매우 유용하다.  다운로드 링크는 아래와같다
http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx
자세한 사용법은 웹서핑해보길바란다.


VM안의 WInXP에서 개발하는것이 안전할걸로 예상된다.
하지만 나는 그냥 xp환경상에서 시도했으며 별문제는 없었다.
타조원은 윈도우즈를 여러번 재설치했다...이는 액티브엑스가 등록되어
삭제할줄몰라 그랬던것이다.. 간혹 커널이 깨진경우도있으나 대부분 등록문제이다.
이는 레지스트리를 통해 해결이 가능하다. 궁금하면 연락을 주면 알려주겠음.


DDK사용을 위한 VC6.0 환경세팅
1. vs6.0 설치
2. 서비스팩6설치 <----매우 중요
3. (3790.1830) WIN SERVER 2003 SP1 다운로드
4. SDK설치
5. INC폴더(WXP, DDK\WXP, CRT 를 세팅)
6. LIB폴더 세팅
7. 링킹옵션 폴더세팅
8. BASEDIR환경변수 경로 세팅
9. CLT+F7누른후 디버그 모드일때 커스텀빌드 칸의 모든정보를 삭제
10. 디버깅모드로 컴파일 & 링크

위의 과정을 거치면 DDK환경 설정은 얼추될거임.

업무적으로 필요해서 저도 기록을 참고하는데 설렁설렁 3일이면 방화벽 기본적인 기능은 다 구현이되더군요.....
혹시나 도전하시는분들은 겁먹지 마시고.....화이팅....ㄲㄲ
posted by Sense.J
: