Perfect One Day Project
To learn and to grow up, it gives me a sense of achievement. I have realized the
importance of working on self development constantly. So I formed a campaign
named 'Perfect One Day Project' three weeks ago, which aims to practice productive
activities, such as a study or an exercise. I have recruited fellow members to join this
campaign together. I formed this campaign so that I can make an effort with fellow
members to create good habits. As you know, it's difficult to do productive activities
consistently. Especially, if you try to do it alone, you may give up earlier than you
thought. That's why I recommend that you join this campaign. I'm looking forward
to bringing many positive changes in us. Of course, it doesn't mean we don't have
any rules to follow in this campaign. Let me tell you about the kinds of rules simply.
First of all, if you are able to achieve some productive activities, you should post
what you did on our chatroom on that day. You should post the time of how long it
takes and the kind of activitiy you did in more details. Finally, you should attach
some evidence, such as photos or text that can be used as proof. Once you post
your activity on our chat room, I will feed the statistics information back to you
every friday night. I'm sure that this campaign will really help us to try to do the
productive activities harder.
Written by Simhyeon, Choe
나에게 들려주는 이야기
약 7년간 대기업에서 소프트웨어 엔지니어로 회사 생활을 하며 내가 느낀 것은 과연 이 회사
생활이 정말 내가 원했던 것인가하고 나 스스로에게 의문을 던지게 한다.
"심현씨, 이거이거 해주세요. 오늘까지 꼭 해야돼요."
"네..."
그런 업무들이 끊임없다. 내가 아닌 제품을 위한 업무들의 연속이다. 이것이 내가 진정으로
원했던 삶이던가...? 혹자는 말한다. "회사 생활이 다 그렇지 뭐. 대신 돈 많이 받잖아?"
그게 내가 원했던 길이었던가? 그럼 회사 생활 열심히해서 10년 넘게 다니고 수석된 후
수 억대 가량 모은 후에 건물 하나 사면 그게 최고인건가? 무엇을 위해? 나를 위해?
아니면 나 이외의 물질적인 가치와 금전적인 것들을 위해? 그것이 정녕 내가 바랬던 성공이었던가?
출근하고 밤 늦게 퇴근때까지 나는 거의 웃음없이 무표정으로 자리에 앉아서 그들이 원하는 코드를
만들어 주기에 바빴다. 주지 않으면 빨리 해야한다고 끊임없이 재촉하고 압박하는 것을
반복하고 삽질의 시간을 보내면서 그들의 원하는 것을 주면 아무일 없었다는 듯이 그게
그걸로 끝이다. 그러고는 또 다른 요청이 끊임없이 쇄도하고 처리해줘야 하는 무수한 반복의
연속이었다. 나라는 존재는 오로지 제품을 위해서 존재해야 했고 나의 건강, 나의 행복,
나의 삶의 질은 철저히 회사 제품에 의해서 결정되고 있었다. 그렇게 회사 생활 열심히 10년 넘게
다니면 정말 고생하고 장한 회사 생활일지도 모른다. 하지만, 반대로 그 10년은 잃어버린
청춘이 될테지. 혹자는 말한다. "어쩔 수 없어, 그렇게 살아갈 수 밖에 없는거야." 여기서 다시
질문하고 싶다. 그렇게 맹목적인 회사 생활하는 동안 너는 정말 즐거웠냐고. 너는 정말 너의 인생을
살아온거냐고. 수 년 넘게 회사 생활하면서 적어도 한 달 정도는 즐거웠던가? 그 한 달을 위해
수 년 간의 희생은 당연한건가? 그렇게 회사 생활 수석될 때까지 하면 정말 보람있었다고
생각하는 비중이 클까 아니면 후회하는 비중이 클까? 나의 인생은 우주의 수십 억 광년 빛의
속도 시간에서 티끌도 안되는 찰나일 것이기도 하지만 적어도 나에게는 길게 내다봐야 할 인생인데
내가 살고 싶은 삶이 아닌, 남에게 보여지는 삶을 살아가는 것은 너무나도 불쌍한 인생을 살다가
생을 마감할 때 후회하지 않을까? 지금은 나의 월급이 얼마냐, 나의 위치가 어디냐가 중요하지
않아. 지금 중요한 것은 내가 뭘 하고 싶어 하느냐인거지. 내면 어디엔가 웅크리고 있는 나의
잠재력을 다시금 끄집어 내는 것, 그리고 내가 주도하는 삶을 살아가야 하는 것, 바로 그것이
내가 지금 되찾아야 할 것들이지. 도전과 동기 부여는 내 삶의 테두리에서 내가 선택하고 결정한
삶의 안에서 만들어 가야할 부분이야. 나의 안이 아닌, 밖에서 존재하는 도전과 동기 부여는
실제로 내가 만든게 아니라 나 이외의 외압에 의해서 만들어진 허상에 불과하기 때문에
오래가지 않아. 왜냐하면 진정한 나의 안에서 우러나온 도전과 동기 부여가 아니기 때문이지.
나의 삶에는 나에게 선택권이 있고 그 선택에 따른 책임은 나에게 있어. 나는 회사 생활하면서
조금이라도 내가 선택할 수 있는 권한이 있었던가? 아니다.
그저 "네, 네, 네, 알겠습니다."하기 바빴지. 철저히 소모품인 나는 발전없이 제품에 기대어
기약없는 미래를 위해 일을 할 뿐이지. 언제나 조직 변화에 전전긍긍하며 다른 조직원들에 대해
떠들어 대면서 말이지. 그리고 내 자아의 내면 목소리는 철저히 죽인 채, 가식적인 얘기들을
그들앞에 늘어 놓는 것, 그런 직장인의 생활에 나의 미래를 맡긴다는 것은 참으로 측은하고
안타까울 뿐이지 않아?
... ...
그래, 내가 가야할 방향은 이제 좀 더 명확해졌어.
하얀 안개와 구름들 속에 가려져 보이지 않던 막막한 길에 걸어갈 용기가 싹트고 있지.
하지만, 여전히 두려운 것은 사실이야. 그동안 새장에 갖혀 있어서 내가 날개짓을 예전처럼
펼칠 수 있을까하고 두려움이 앞서 솔직히. 하지만 나아가야 해. 왜냐하면 나의 삶을 살기 위해서
숨어 있던 내면의 자아를 밖으로 솔직하게 끌어 내기 위해서 말이지. 그 길을 걷는 것에 대해
또다른 시련과 후회가 찾아올지도 몰라. 하지만 이 경험을 통해 진정한 내 자신을 발견하고 새로운
인생의 이정표를 발견할 거라고 굳게 믿고 있어. 두려워하지마. 남들과 비교하지말고 오직 나의
내면의 목소리에 귀를 기울이고 그것에 집중해. 나를 믿고 또 나를 믿어.
나의 인생은 오로지 나의 것이니까.
Written by Simhyeon, Choe
Setting up Kernel mode debugging over a USB 2.0 Cable manually
우리는 커널 혹은 디바이스 드라이버를 개발하거나 디버깅할 때, 주로 VMWare나 Virtual Box 등의 가상 머신 툴로 많이 작업을 합니다만, 아무래도 그런 가상 머신 환경은 리얼 PC 환경에 비해 한계성을 가질 수 밖에 없습니다. 이를 테면, 리얼 PC 환경과 가상 환경 간의 차이로 구현이 달라져야 하거나 최신 호스트 인터페이스 컨트롤러를 기반으로 동작해야 하는 디바이스 드라이버의 경우, 벤더에서 가상 머신 기반의 개발 및 디버깅 가능하도록 지원해주기 전까지는 그 어떠한 작업도 불가능할 수 밖에 없지요. 만약 호스트 컴퓨터 두 대가 있다면 이를 USB 케이블로 연결하여 한 대는 호스트로, 또다른 한 대는 타깃으로 설정하여 리얼 환경에서 디버깅을 가능하도록 할 것입니다. 그래서 오늘은 PC 두 대를 USB 2.0 Cable로 연결하여 커널 모드로 디버깅하는 방법에 대해서 알아보도록 합시다.
※ Prerequisites:
호스트 컴퓨터(Host Computer) : "Debugger"를 실행한 컴퓨터
타깃 컴퓨터(Target Computer) : "Debuggee"로 실행된 컴퓨터 (디버깅 대상이 된 컴퓨터)
USB 2.0 Cable을 기반으로 디버깅을 지원하기 위해, 호스트 컴퓨터의 윈도우즈 운영체제는 Windows 2000부터 Windows 8까지 사용할 수 있으며, 타깃 컴퓨터는 Windows Vista, Windows 7이나 Windows 8 버전으로 실행되어야 합니다.
Debugging over a USB 2.0 cable requires the following hardware:
-
A USB 2.0 debug cable. This cable is not a standard USB 2.0 cable because it has an extra hardware component that makes it compatible with the USB2 Debug Device Functional Specification. You can find these cables with an Internet search for the term USB 2.0 debug cable.
-
The host computer must have a USB 2.0 controller that is compatible with the Enhanced Host Controller Interface (EHCI) specification.
-
The target computer must have a USB 2.0 controller that is compatible with the EHCI specification and that supports kernel debugging. Not all EHCI-compatible controllers have this support.
USB 2.0 Cable은 별도로 준비하셔야 합니다만, 구매를 희망하신다면 잘 알려진 Ajays USB 2.0 Host-to-Host Debug Device and Cable(http://www.semiconductorstore.com/Ajays-Technology/)을 추천드립니다. (Ajays USB 2.0 Host-to-Host Debug Device and cable 아래 그림 참조)
이 글에서는 Ajays Host-to-Host debug Device와 Cable을 사용하는 것으로 가정하고 설명을 드리도록 하겠습니다.
대부분의 메인보드에서 EHCI 기반의 USB 2.0 controller를 지원하기 때문에 특별히 신경쓰지 않아도 됩니다만, 이를 지원하지 않는다면 USB 2.0 Cable로 디버깅을 할 수 없다는 것을 유념하시기 바랍니다.
먼저 WinDbg 디버거가 설치되어 있지 않다면 Host PC에서 WinDbg 디버거 설치를 하셔야 합니다만, 이때 WinDbg 디버거 버전은 반드시 6.5.3.8 이상으로 설치하셔야 합니다. 아시다시피, WinDbg는 마이크로소프트사에서 무료로 배포하고 있으며, 일반적으로 WDK(Windows Driver Kit)에 함께 패키징되어 있습니다. WDK(7600 이상 버전)를 설치할 때, Debug Tool 관련 체크 박스에 클릭하시면 함께 설치할 수 있습니다.
1. Setting up the Target Computer
[Step 1] 타깃 컴퓨터에서 CMD.EXE를 마우스 우클릭으로 팝업된 윈도우에서 [관리자 권한으로 실행]을 선택합니다. 커맨드 프롬프트 윈도우에서 다음과 같이 타이핑합니다.
bcdedit /debug off
[Step 2] 타깃 컴퓨터를 재부팅합니다.
[Step 3] 타깃 컴퓨터에서 UsbView Tool을 실행시킵니다. (UsbView Tool은 호스트 컴퓨터에 설치된 "Debugging Tools for Windows package"에 포함되어 있음)
[Step 4] UsbView Tool로 두 가지 작업을 해야 합니다.
① Finding a physical USB connector
첫 번째는 EHCI와 호환되는 USB 2.0 Host Controller를 찾는 작업입니다. 커널 디버깅을 할 수 있는 물리적인 USB 커넥터를 찾기 위해, USB 2.0 Cable을 USB 소켓에 연결하였을 때 USB Debug Device가 어느 곳에 나타나는지 확인해야 합니다. 이를 갱신하도록 하려면 UsbView Tool에서 [Refresh]를 체크하면 됩니다. Usb Debug Device를 EHCI 기반의 Host Controller의 Port 1로 연결했다면, UsbView Tool의 TreeView에 "USB 2.0 Debug Connection Device"를 확인할 수 있습니다. 여전히 확인할 수 없다면 다른 USB 소켓을 바꿔가면서 반복적으로 연결하는 작업을 해서 확인해야 합니다. 이렇게 확인하였음에도 불구하고 보여지는 USB 커넥터를 발견할 수 없다면, 그것은 USB 커널 디버깅을 위한 타깃 컴퓨터로 사용이 불가능합니다. 이는 EHC 기반의 USB 커넥터를 메인보드에서 지원하지 않는다는 의미가 됩니다.
② Identifying Bus number, Device number and Function number
두 번째 작업은 해당 USB 2.0 Host Controller의 버스 번호, 디바이스 번호 그리고 펑션 번호를 찾는 작업을 해야합니다. UsbView의 Tree View에서 "USB 2.0 Debug Connection Device"가 표시된 자식 노드 상위의 USB Host Controller의 16진수값을 상기합니다. (아래 그림 빨간색 밑줄과 동그라미 확인)
그 후, [장치관리자]를 실행시켜서 해당 Host Controller의 노드를 찾습니다. 그리고 해당 노드의 속성 정보를 클릭하면 PCI 버스 번호, 장치 번호, 기능 번호를 확인할 수 있습니다. 이것 역시 상기해야 합니다.
[Step 5] 다시 CMD.EXE를 관리자 권한으로 실행하고 다음과 같이 입력합니다.
(Windows 7 기준)
bcdedit /debug on
bcdedit /debgsettings usb targetname:TargetName
bcdedit /set "{dbgsettings}" busparams x.y.z
다시 위의 커맨드들을 설명드리면,
/debug on은 해당 타깃 컴퓨터를 디버깅 프로세서로 동작시키기 위한 옵션입니다.
위의 TargetName은 USB Cable이 연결된 타깃컴퓨터 대상을 식별하기 위한 문자열 값입니다. 다시 말해서 디버깅 대상이 되는 여러 대의 타깃 컴퓨터가 있다면 호스트 컴퓨터는 그 중에서 특정 하나를 선택하고 디버깅해야 할 것입니다. 바로 이를 위해 존재하는 문자열을 의미합니다.
busparams x.y.z가 Step 4에서 상기했던 버스 번호, 장치 번호, 기능 번호를 의미합니다. 예를 들어, 버스 번호 0, 장치 번호 19, 기능 번호 4라면, busparams 0.19.4 처럼 입력합니다. 이때, busparams의 값은 Windows 7에서는 Decimal 값으로 입력해야 함을 유의합니다.
[Step 6] 다시 타깃 컴퓨터를 재부팅하고 BIOS Setup Utility로 들어가서 [Advanced] 탭의 Legacy USB Support를 [Disabled]로 설정합니다.
2. Setting up the Host Computer
[Step 1] USB 2.0 debug cable 양쪽을 호스트와 타깃 컴퓨터에 연결합니다. 당연히 조금 전에 언급했던 것 처럼, EHCI와 호환이 되는 USB 2.0 Host Controller와 반드시 연결해야 합니다.
USB Cable을 연결하면, USB Debug 드라이버가 자동적으로 설치될 수도 있고 안될 수도 있습니다. 만약에 장치관리자에서 확인하여 !로 표시된다면 수동적으로 드라이버를 설치해야 합니다. 그 절차는 아래와 같습니다.
a.[장치관리자]에서 USB 2.0 debug cable를 연결하였을 때 !로 나타나는 노드를 찾음
b.노드의 속성 페이지에서 드라이버 업데이트 혹은 인스톨을 선택
c.드라이버 설치 마법사에서 "Debugging Tools for Windows package"에 있는 usb2dbg.inf을
찾아서 설치
d.설치 마법사를 완료
[Step 2] 호스트 컴퓨터에서 첫 번째 USB Port를 찾습니다.
USB 버스를 통해서 디버깅을 수행하기 위해, Ajays device output port는 반드시 USB Port 1에 연결되어야 합니다(이는 호스트 컴퓨터에서만 해당하는 규칙임을 유의). 타깃 컴퓨터에서 UsbView를 사용해서 확인했던 것처럼, 마찬가지로 호스트 컴퓨터에서 USB Port 1를 찾기 위해, 순차적으로 Ajays Debug Cable을 연결해서 USB View에서 Refresh하여 확인하도록 합니다.
(아래 그림 참조. 이 그림에서는 Loc51이 USB Port 1에 해당함)
[Step 3] 호스트 컴퓨터에서 설치된 WinDbg를 실행하여 메인 메뉴에서 [File]-[Kernel Debug]를 선택합니다. 그리고 USB 2.0 탭을 선택하고 Target Name에 타깃 컴퓨터에서 입력했던 문자열 값을 동일하게 입력하고 OK 버튼을 클릭합니다.
WinDbg를 실행할 때마다 이렇게 작업하는 것이 번거롭다면, WinDbg.exe를 선택하고 우클릭해서 속성을 클릭하여 "대상"에 아래와 같이 입력합니다.
windbg.exe -b -k usb2:targetname=tagetname
이렇게 설정하면, WinDbg를 실행할 때마다 자동으로 지정된 Target Name으로 연결합니다.
3. 호스트 컴퓨터와 타깃 컴퓨터의 디버깅 연결
위의 모든 과정에서 설명드렸던 설정을 완료하셨다면, 호스트 컴퓨터에 설치된 WinDbg를 실행합니다. 그러고나서 타깃 컴퓨터를 재부팅합니다. 성공적으로 타깃 컴퓨터가 연결되었다면 아래의 그림과 같이 출력될 것입니다. 여기서 [Ctrl] + [Break]키를 누르면 소프트웨어 브레이크 포인트가 설정되고 타깃 컴퓨터는 HALT 상태로 대기하게 됩니다.
[Notes and References]
http://msdn.microsoft.com/en-us/library/windows/hardware/ff556869(v=vs.85).aspx
http://www.apriorit.com/our-company/dev-blog/210-win-debug-with-usb
http://blogs.msdn.com/b/usbcoreblog/archive/2010/10/25/setting-up-kernel-debugging-with-usb-2-0.aspx
그럼 여기까지 마무리하도록 하겠습니다. 좋은 주말 보내세요.
Written by Simhyeon, Choe