64 비트시대를향한첫걸음, 커널모드드라이버포팅 이없기때문에무조건 64비트로포팅해야한다고이미말했다. 그렇다면드라이버를사용하는제품에서유저모드모듈들도모두 64비트로포팅해야할까? 물론모두 64비트로포팅하면아주좋겠지만, 일반적인제품들은드라이버모듈의수보다유저모드모듈의수가월등히많을
|
|
- 정호 판
- 6 years ago
- Views:
Transcription
1 실 전! 강 의 실 개발자를위한실전 64 비트! 64 비트윈도우커널탐구 연 + 재 + 순 + 서 1회 윈도우커널모드드라이버 64비트포팅 2회 64비트윈도우커널분석 AMD64 3회 64비트윈도우커널분석 IA64 연 + 재 + 가 + 이 + 드운영체제 64비트윈도우 XP, 64비트윈도우 2003 개발도구 윈도우 DDK 최신판기반지식 윈도우커널모드드라이버개발응용분야 응용프로그램및드라이버 64비트포팅 김성현 shkim@ahnlab.com 안철수연구소에서 V3, SpyZero 개발에참여하고있는커널모드드라이버개발자이다. 우리나라에서도평생소트프웨어엔지니어로살아가면서식구들을먹여살릴수있는날이올수있다는꿈을안고그길을닦아나가고있다. 올해의목표로 Code Complete 2nd Edition Windows Internals 4th Edition 읽기, 몸무게 10kg 증량하기, 당구 250 만들기, 외국식당에서영어로원하는거주문하기등을가지고있다. 개발자를위한실전 64비트! 64비트윈도우커널탐구 64비트시대를향한첫걸음, 커널모드드라이버포팅 독자들은올해초부터마소에여러번게재된 64비트기사들을한번쯤읽어봤을것이다. 불행히도아직읽어보지못했다면한번쯤찾아서읽어보는것도 64비트포팅을이해하는데좋은방법이다. 이미앞선기사에서포팅에신경써야할많은내용들이언급되었는데이것들을잘이해하고있다면응용프로그램이나드라이버를 64비트로포팅하는데든든한밑천이될것이다. 이번기사에서는예제를설명하는데반드시필요한내용에대해꼼꼼히살펴볼것이다. 올해들어마소에많은 64비트관련기사들이나왔다. 그만큼 64비트환경이우리에게가까이다가왔다는것을의미하는것이아닌가생각해본다. 이번연재에서는 64비트윈도우에서유저모드모듈들과는달리반드시 64비트포팅을해야만하는커널모드드라이버를실제로포팅해보면서 64비트포팅에대한감각을익혀보도록하겠다. 또한 64비트윈도우커널을살짝들여다보고 64비트커널에대해서조금더심도있는이해를하는시간을가져본다. 64비트드라이버를포팅하는이유 64비트윈도우는 32비트호환성을제공하기때문에 32비트응용프로그램들을수정없이그대로사용할수있다. 이것이가능한이유는 64비트윈도우가 WOW64라는 32비트에뮬레이션레이어를운영하고있기때문이다. 이 WOW64를이용해서대부분의 32비트응용프로그램은 64비트윈도우에서수정없이그대로동작할수있다. 그러나 32비트커널모드드라이버는유저모드레이어인 WOW64가해결해주지못한다. 그렇다고커널모드에 WOW64 같은레이어가존재하는것도아니다. 따라서 32비트커널모드드라이버는 64비트윈도우에발붙이지도못하는비운의주인공이되어버리고말았다. 무협지를보면대부분처음에는주인공이가지각색의시련을겪다가나중에는환골탈태 (?) 하여강력한무공의소유자로변신하는장면이나온다. 32비트로남아있어서는아무런의미가없는우리의드라이버도 64비트로환골탈태해야한다. 이제부터비운의주인공인 32비트드라이버를 64비트윈도우라는거대한중원의주인공으로만들어보자. 제품포팅계획현재자신의회사가 64비트버전출시를계획하고있다면현재 32비트인제품을어떻게수정해야할까? 물론드라이버를포함하고있는제품에대해서말이다. 드라이버는 32비트호환모드라는것
2 64 비트시대를향한첫걸음, 커널모드드라이버포팅 이없기때문에무조건 64비트로포팅해야한다고이미말했다. 그렇다면드라이버를사용하는제품에서유저모드모듈들도모두 64비트로포팅해야할까? 물론모두 64비트로포팅하면아주좋겠지만, 일반적인제품들은드라이버모듈의수보다유저모드모듈의수가월등히많을것이다. 이런경우많은수의유저모드모듈들을모두포팅하는데에는시간이너무많이걸릴수있으므로드라이버만 64비트로포팅하는방법을선택할수있다. < 그림 1> 에서첫번째와같은 32비트애플리케이션 + 64비트드라이버 구성의경우가드라이버만 64비트로포팅한경우이다. 어떤제품을빨리 64비트를지원하도록만들려면이와같은방법을취하는것이가장빠른방법일것이다. 가급적이면 32비트애플리케이션은수정을가하지않고드라이버만 64비트로포팅한다. 이방법에는다음과같은두가지주의사항이있다. 32 비트애플리케이션은 64비트환경을완전히이용하지못하는제약사항을가질수있다. 64 비트드라이버는자신을제어하는프로세스가 32비트프로세스인것을정확히인지하도록포팅돼야한다. < 그림 1> 제품포팅계획 32비트애플리케이션 64비트애플리케이션유저모드커널모드 64비트드라이버 64비트드라이버 로그램이고 C:\Program Files(x86) 에들어가는것들은 32비트응용프로그램이라는것을알수있다. 시스템폴더도마찬가지로 C:\Windows\system32는 64 비트응용프로그램들이사용하고 C:\Windows\syswow64는 32 비트응용프로그램들이사용하게된다. 이것은 WOW64에의해자동으로이뤄진다. 자신은 C:\Windows\system32에접근한다고생각하지만실제로는 C:\Windows\syswow64로접근된다. 그렇다면 32비트프로세스는 C:\Windows\system32에접근하지못하는것일까? 이것을가능하게해주는 API를 64비트윈도우에서제공한다. 즉 32비트애플리케이션 + 64비트드라이버 는완전한 64비트로가는중간단계라고볼수있다. 결국완전하게 64비트제품을구성하는것은두번째그림인 64비트애플리케이션 + 64비트드라이버 라는구성이다. 시간과비용이허락한다면당장애플리케이션, 드라이버모두 64비트로포팅하는것이바람직할것이다. 하지만현실적인이유로대부분의업체들은첫번째단계를선택하게된다. 뒤에다루게될포팅예제에서는두가지상황에대해모두살펴본다. 설치패스 32비트애플리케이션 + 64비트드라이버 구성을선택하여제품을만들경우제품이설치되는위치에대해정확히이해하고있어야한다. 설치프로세스도 32비트프로세스일것이기때문에 WOW64가제공하는 File System Redirection과 Registry Redirection의영향을받는다. File System Redirection은 32 비트프로세스가파일시스템에접근할때특정폴더에대해자동으로다른위치를참조하게하는기능이다. 32비트설치프로그램을아무런수정없이 64비트윈도우에서실행했을경우에 C:\Program Files로파일들을설치하게되어있었다면실제로는 C:\Program Files(x86) 에파일들이들어가게된다. C:\Program Files에들어가서아무리찾아봐야아무것도나오지않는다. 따라서 C:\Program Files에들어가는것들은 64비트응용프 BOOL Wow64DisableWow64FsRedirection( PVOID* OldValue ); Wow64DisableWow64FsRedirection(&OldValue); 와같이호출하면 redirection이꺼지면서원하는대로접근이가능해진다. 기본적으로 32비트프로세스는 redirection이동작하고있는게정상이므로특별한이유가있을경우에만이 API를사용해서처리를해주면된다. 예를들어 32비트설치프로그램이드라이버를설치하는위치가 C:\Windows\system32\drivers였다면 64비트윈도우상에서실제로드라이버파일이복사되는위치는 File System Redirection에의해 C:\Windows\syswow64\drivers가된다. 드라이버가이위치에있다고특별히실행에문제가있는것은아니다. 하지만어차피 64비트로포팅한드라이버이고나중에 64비트응용프로그램이사용할수도있으니 64비트원래시스템폴더인 C:\Windows\system32\ drivers로드라이버가복사되게하고싶다면앞에서설명한방법으로 < 표 1> File System Redirection 32비트프로세스접근위치 64비트윈도우 Redirection 위치 C:\Program Files C:\Program Files(x86) C:\Windows\system32 C:\Windows\syswow64 마이크로소프트웨어 239
3 실 전! 강 의 실 개발자를위한실전 64 비트! 64 비트윈도우커널탐구 처리할수있다. Registry Redirection은 32 비트프로세스가레지스트리에접근할때특정키에대해자동으로다른위치를참조하게하는기능이다. 역시 32비트설치프로그램에서 HKLM\Software에무엇을기록하려고했다면그것은 WOW64에의해 HKLM\Software\Wow 6432Node에기록된다. 32비트프로세스들이접근하는레지스트리는 WoW6432Node로별도관리된다. 특별한이유가없다면그냥이정도사실만알고그대로사용하면된다. 하지만특별한상황에는이것을무시할수있는방법이있다. RegOpenKeyEx(), RegCreateKey Ex() 에다음과같은플래그를주면된다. KEY_WoW64_64KEY - 64비트레지스트리에접근할때 KEY_WoW64_32KEY - 32비트레지스트리에접근할때이 API들은프로세스가 32비트건 64비트건상관없이플래그에따라동작한다. 주로설치시파일복사나레지스트리기록이많으므로 File System Redirection과 Registry Redirection은정확하게이해하고있어야한다. 물론설치시가아니라응용프로그램동작중에도마찬가지로적용되는내용들이다. 32비트프로세스에서파일이나레지스트리를다루는작업이어디에어떻게반영되어야하는지생각해보고특별한상황에서는앞에서설명한특별한방법들을사용해야한다. 64비트 CPU 종류 64비트포팅을하게되는제품이지원하는 CPU의범위는어떻게결정할것인지생각해보자. 현재 64비트윈도우가지원하는 CPU의종류는다음과같다. AMD 옵테론, AMD 애슬론64, 인텔제온 EM64T, 인텔펜티엄 4 with EM64T, 인텔아이태니엄프로세서 ( 아이태니엄2 포함 ) < 표 2> Registry Redirection 32비트프로세스접근위치 64비트윈도우 Redirection 위치 HKLM\Software HKLM\Software\WoW6432Node HKCR HKCR\Wow6432Node < 표 3> CPU 별생성해야할바이너리종류 지원대상 CPU 생성할바이너리종류 AMD 옵테론 AMD64 바이너리 AMD 애슬론64 AMD64 바이너리 인텔제온 EM64T AMD64 바이너리 인텔펜티엄 4 with EM64T AMD64 바이너리 인텔아이태니엄프로세서 ( 아이태니엄2 포함 ) IA64 바이너리 AMD 옵테론과 AMD 애슬론64는통틀어서 AMD64라고도하는데옵테론은서버용, 애슬론64는클라이언트용이다. 포팅시에는두가지를구분하지않고그냥 AMD64로작업하면된다. AMD64는과거 x86 계열이 8비트에서 16비트로갈때나, 16 비트에서 32비트로갈때나하위호환을중시하면서발전해온것처럼 32비트하위호환을제공한다. 32비트모드로사용할수도있으며 64비트모드로사용할경우에도기존의 32비트코드들을자연스럽게동작시킬수있는방법도제공한다. 인텔은진정한 64비트컴퓨팅을보여주겠다는일념으로과감하게하위호환성을버리고진보적인아키텍처의 CPU를설계하고자했다. 그렇게탄생한것이아이태니엄이다. 아이태니엄은 CISC 구조를따랐던 x86 호환시스템과달리 RISC 구조를채택하면서인스트럭션구조, 레지스터셋을전혀새롭게구성하여성능향상을꾀하였다. 통상아이태니엄1, 2를통틀어 IA64라고하는데최근에는대체로아이태니엄2가주류라고보면될것이다. 그러면인텔의 EM64T(Extended Memory 64 Technology) 라는것은무엇일까? 앞에서설명했듯이 AMD와인텔은 64비트시대를준비하면서전혀다른노선을걷게된다. AMD는인텔호환칩을만들던회사답게 (?) 64비트에서도 x86 호환이라는노선을그대로가져가면서 64비트확장과약간의기능추가로 64비트 CPU를만들어냈다. 실제로 AMD64는레지스터셋이모두과거와똑같고레지스터가 64 비트로확장되면서몇개만추가됐다. 레지스터가 64비트로확장됐을뿐인스트럭션도거의비슷하다. 반면에인텔은계속해서발목을잡아오던하위호환을버리고기본구조를새로설계하는노선을선택한다. 레지스터셋, 인스트럭션셋, 내부구조가모두새롭게구성됐다. IA64의디스어셈블리코드를본적이있는독자들은느꼈겠지만처음그것을접하면 생뚱맞다 라는표현이절로나올만큼대단히새롭다. 하지만인텔이너무앞서간것인지 AMD가시장을잘파악한것인지는모르겠지만 AMD64 쪽이오히려주목받는상황이되었다. 아이태니엄은서버급에서점진적으로공급되고있는반면에애슬론64는클라이언트 PC에채용되어많은일반대중들사이를순식간에파고드는상황이되어버린것이다. 여기에서재미있는일이벌어지는데인텔이 EM64T라는하위호환 64비트기술을들고나온것이다. 이것을재미있다고표현하는이유는사실 EM64T는 AMD64 호환 CPU 라고봐야하기때문이다. AMD가인텔호환 CPU를만드는회사였는데이번에는인텔에서 AMD 호환 CPU를만드는상황이벌어진것이다. 역사는돌고돈다고했던가? 64비트커널모드드라이버개발시 EM64T는 AMD64 계열로분류되며 EM64T 플랫폼을지원하려고한다면 AMD64 바이너리를생성해내야한다. 게다가요즘 AMD, 인텔의최신 CPU들에서악성코드실행을방지하는기능이라고말하는
4 64 비트시대를향한첫걸음, 커널모드드라이버포팅 NX(No Execution) 역시 AMD64가먼저선보인기능이라는점까지감안하면 64비트 CPU 전쟁에서는 AMD가기선제압을한셈이다. 64비트드라이버빌드는무엇으로? 64비트드라이버를빌드하려면 64비트빌드가지원되는 DDK를사용하면된다. 몇년전부터나오는 DDK들은이미 64비트빌드환경을포함하고있다. 이것을통해 64비트드라이버를빌드할수도있으나아무래도최신버전의 DDK를이용하는것이좋다. 현재최신 DDK 는윈도우서버 2003 SP1 DDK이다. 뉴스그룹이나개발자포럼의게시판을보면최신 DDK를어떻게구하는지묻는질문이심심치않게올라오는데, 이것은당연히마이크로소프트 ( 이하 MS) 사이트에서구할수있다. search.microsoft.com에 DDK 또는 Driver Development Kit 등을입력하여잘찾아보면나오지만결국우리가찾고자하는 URL은다음과같다. 이페이지에서 Order the DDK Suite or the current DDK 를선택해진행하면된다. 다음단계에서 DDK Suite가아니라윈도우서버 2003 SP1 DDK를선택해야한다. DDK Suite이란 DDK + OS 심볼 + 테스트툴 + 기타를모아놓은패키지인데이것은유료이다. 다행히윈도우서버 2003 SP1 DDK는무료로제공하고있다. 하지만예전같이웹에서바로다운받을수있는방법은없어졌고 CD를신청하여배송받는형태만제공된다. 64비트드라이버빌드하기이렇게구한최신 DDK를설치하고나면시작메뉴에 Development Kits 항목이생기는데이를따라들어가보면빌드가능한환경은윈도우 2000, XP, 서버 2003이다 (< 화면 1>). 자주보는질문중하나가어떤빌드를사용해서드라이버를만들어야하는지에대한질문인데, 간단히답변하면그것은지원할 OS에따른다. 윈도우 2000에서동작하는드라이버는윈도우 2000 빌드환경을사용하고 XP에서동작하는드라이버는 XP 빌드환경을사용하면좋다는뜻이다. 하지만대부분하나의드라이버를빌드해서모든 < 표 4> 64비트빌드환경의종류와용도 DDK 빌드종류 용도 윈도우서버 2003 Checked IA-64비트빌드환경 IA64용디버그버전빌드 윈도우서버 2003 Free IA-64비트빌드환경 IA64용릴리즈버전빌드 윈도우서버 2003 Checked x64비트빌드환경 AMD64, EM64T 디버그버전빌드 윈도우서버 2003 Free x64비트빌드환경 AMD64, EM64T 릴리즈버전빌드 < 화면 1> DDK 설치후시작메뉴화면 OS를다커버하고싶어하니이런경우라면윈도우 2000 빌드환경을사용해서드라이버를빌드하고이드라이버를 XP, 서버 2003 등에사용하는방법을취해야한다. OS가하위호환성을보장하므로셋중에버전이가장낮은윈도우 2000 빌드환경으로만들어진드라이버는상위버전 OS 들에서동작이가능하다. 반면에 XP 빌드환경으로빌드한드라이버를윈도우 2000에서사용할수있긴하지만 100% 보장되지않기때문에주의해야한다. 대표적인예로 XP 빌드환경을이용하면서 XP 에서추가된 API를사용했다면이렇게만들어진드라이버는윈도우 2000에서는동작하지않기때문이다. 64비트빌드를위해사용할수있는빌드환경을 < 표 4> 에서살펴보자. 64 비트드라이버빌드를위해서는 < 표 4> 에서설명하는것처럼용도에맞는빌드환경을실행하고소스코드가존재하는폴더로이동한후에 build 명령으로빌드하면된다. 여기서등장한 X64라는용어는 x86 호환성을유지하면서 64비트확장을한 CPU를지칭하는것이다. 원래는 AMD64비트빌드라는용어였으나 EM64T라는것이나오면서 x64라고정리하게된것이다. 주의할것은 DDK 내부에는 x64라는용어가없다는것이다. 현재출시되고있는 64비트윈도우중 x64 에디션이라는용어가붙은것들은처음부터 AMD64를타겟으로개발된것들이었다. AMD64용커널을 [ 64비트포팅과인라인어셈블리 ] 64비트컴파일러는인라인어셈블리를지원하지않는다. 기존의소스코드에 x86 인라인어셈블리가있었다면이것은완전히제거하고 C 언어로다시작성해야하는포팅대상이된다. 이에대한이유는본문에서설명한 CPU 종류들로설명할수있다. X86, AMD64, IA64는 CPU 자체가모두다르고각각의어셈블리언어도다르다. 띠라서컴파일러가인라인어셈블리를지원하더라도어차피 CPU마다인라인어셈블리는모두다르게작성되어야한다. 인라인어셈블리을지원하지않는 64비트컴파일러는결과적으로프로그래머에게 C 언어만이용해서 CPU 독립적인소스코드를작성하라고권장하는것이다. 어셈블리언어를꼭써야만하는경우가있다면어셈블리소스파일을별도로만드는방법을사용할수있다. 이것을컴파일하여만들어진오브젝트파일을 C 언어로만들어진나머지오브젝트파일들과링크하여바이너리를생성하면된다. 마이크로소프트웨어 241
5 실 전! 강 의 실 개발자를위한실전 64 비트! 64 비트윈도우커널탐구 개발하고있을당시에는 EM64T도없었고 x64라는용어도없었다. DDK 내부에서사용하는 64비트 CPU에대한디파인을찾아보면여전히 _M_IA64, _M_AMD64만으로구분되고있다. MS에서는향후에도 _M_AMD64 디파인을 _M_X64 같은것으로바꿀계획이없다고한다. 이미만들어진소스코드들을용어때문에고치기도어렵고어차피 EM64T처럼 x64로분류되는것들은이미 AMD64의클론일테니말이다. 드라이버포팅예제이제실제로 DDK 샘플중하나를골라포팅하면서 64비트포팅에대한감각을본격적으로익혀보자. 최신 DDK에는 64비트빌드환경이기본적으로포함되어있는것에서알수있듯이최신 DDK의샘플들은대부분 64비트빌드를고려해만들어졌다. 즉, 이미 64 비트포팅을마친상태라고볼수있다. 따라서 64비트환경에대한고려가되기전에만들어진샘플을가지고작업해야의미가있을것이다. 그래서 NT4 DDK의샘플중에하나를골랐다. 이제부터 NT4 DDK에포함 되어있는샘플소스중에서 DDK\src\general\portio를직접포팅해보자. 다음과같은절차로진행하면된다. 1단계 - 빌드환경중윈도우서버 2003 Checked IA-64( 또는 x64) 비트빌드환경을선택하여커맨드창을띄운다. 2단계 - 샘플소스중에서 DDK\src\general\portio 폴더로이동한다. 3단계 - portio\sys, portio\gpdread, portio\gpdwrite 폴더에서각각 sources 파일을열어서 targetpath를다음과같이편집한다. TARGETPATH=. 현재작업폴더밑에바이너리가생성되게하려는것이다. 4단계 - 다음과같이명령하여빌드한다. Build -cef < 리스트 1> Sys 드라이버모듈에서발생하는오류내용 1>errors in directory e:\homework\test\general\portio\sys 1>sys\genport.c(223) : error C4312: type cast : conversion from ULONG to PVOID of greater size 1>sys\genport.c(513) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(526) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(526) : error C4312: type cast : conversion from unsigned long to PUCHAR of greater size 1>sys\genport.c(530) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(530) : error C4312: type cast : conversion from unsigned long to PUSHORT of greater size 1>sys\genport.c(534) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(534) : error C4312: type cast : conversion from unsigned long to PULONG of greater size 1>sys\genport.c(544) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(544) : error C4312: type cast : conversion from unsigned long to PUCHAR of greater size 1>sys\genport.c(548) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(548) : error C4312: type cast : conversion from unsigned long to PUSHORT of greater size 1>sys\genport.c(552) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(552) : error C4312: type cast : conversion from unsigned long to PULONG of greater size 1>sys\genport.c(652) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(665) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(665) : error C4312: type cast : conversion from unsigned long to PUCHAR of greater size 1>sys\genport.c(670) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(670) : error C4312: type cast : conversion from unsigned long to PUSHORT of greater size 1>sys\genport.c(675) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(675) : error C4312: type cast : conversion from unsigned long to PULONG of greater size 1>sys\genport.c(687) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(687) : error C4312: type cast : conversion from unsigned long to PUCHAR of greater size 1>sys\genport.c(692) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(692) : error C4312: type cast : conversion from unsigned long to PUSHORT of greater size 1>sys\genport.c(697) : error C4311: type cast : pointer truncation from PVOID 1>sys\genport.c(697) : error C4312: type cast : conversion from unsigned long to PULONG of greater size
6 64 비트시대를향한첫걸음, 커널모드드라이버포팅 5단계 - 빌드오류를확인한다. 빌드후에생성된 buildchk_wnet_ia64( 또는 AMD64).err 파일을열어서확인해본다. 6단계 - 오류가발생한소스코드를수정 ( 포팅 ) 하고 4단계부터다시반복한다. 포인터의타입캐스팅빌드를해보면 APP 모듈들은모두빌드가잘되고, Sys 드라이버모듈에서오류가발생하는데그내용들은 < 리스트 1> 과같다. 얼핏보면복잡해보이지만자세히보면같은오류들이반복되고있다. 모두 error C4312 또는 error C4311 오류들인데이것들이바로 64 비트포팅작업에서가장많이나오는오류중에하나이다. 오류의내용은 32비트정수를 64비트포인터로대입하는경우와그반대의경우에대한것이다. 오류와이에해당하는소스코드를보면상황을조금더쉽게이해할수있다. 1>sys\genport.c(513) : error C4311: type cast : pointer truncation from PVOID 511 : if (nport >= pldi->portcount 512 : (nport + DataBufferSize) > pldi->portcount 513 : (((ULONG)pLDI->PortBase + nport) & (DataBufferSize - 1))!= 0) 헤더파일에서 PVOID로선언되어있는 pldi->portbase을 ULONG으로캐스팅하다가발생한오류이다. 포인터를항상 32비트로가정하고코드를작성했던 32비트시대의잔재이다. 64비트환경에서포인터는 64비트이므로이런것들은빨리사라져줘야한다. 그런데코드를자세히보면좀이상한생각이든다. PVOID를 ULONG으로캐스팅했는데왜오류가발생할까? 상위 4바이트가잘리면서타입캐스팅이되어야할것만같은데말이다. 하지만 64비트컴파일러는 32비트처럼친절하게캐스팅해주기보다는깐깐하게오류를발생시킨다. 64비트환경에서가장크게바뀐것이포인터크기이므로포팅시가장주의해야할부분이바로포인터를다루는부분이기때문이다. 포인터를크기가다른타입으로캐스팅하면포인터가손상될우려가있으므로포인터를캐스팅하는작업에서는컴파일러가오류를표시하여코드작성자에게확인을요구하는것이다. 코드작성자의의도가포인터를손상시키면서캐스팅하는것이맞다면새롭게제공된캐스팅하는매크로를통해서명시적으로알려줘야컴파일러가오류를발생시키지않는다. 하지만포인터가손상되는것을원하지않았다면컴파일러에게고마워하면서적절하게코드를수정해줘야한다. 포팅을어떤식으로하느냐는그때그때다르다. 상황에맞춰서신중하게잘판단해야한다. 이번경우는어떻게수정해야할까? 513 라인의소스코드를천천히 분석해보면 PortBase는 64비트포인터이지만 32비트정수인 nport 와정수연산이되어야한다. 이런경우 64비트포인터를 64비트정수인것처럼처리해주는 ULONG_PTR 타입캐스팅을사용하면된다. ULONG_PTR은정수이지만그크기는현재빌드되는환경의포인터크기에따라달라진다. 32비트빌드환경에서 ULONG_PTR은 4바이트의크기를가지지만 64비트빌드환경에서는 8바이트의크기를가진다. 포인터를정수로취급하여사용하고싶은경우 ULONG_PTR 로선언된변수에저장하면 32비트에서나 64비트에서나안전하게동작하는코드를작성할수있다. 결과적으로다음과같이수정된다. 513 : (((ULONG_PTR)pLDI->PortBase + nport) & (DataBufferSize - 1))!= 0) 첫번째수정예는이와같다. 포팅을어떤식으로하느냐는그때그때다르다고했으므로다른어떤방법도있을수있는지두번째방법을보여줘야할것같다. 문법적인측면만따지는것에서벗어나서코드의내용을보고어떻게수정할지결정할수도있다. 앞의예에서코드를잘살펴보면 pldi->portbase는 I/O 포트의주소로여겨진다. 대부분의 I/O 포트의주소는낮은주소공간에맵핑된다. 높은주소공간에맵핑될수도있겠지만여기서는낮은주소를사용하는포트라는것을여러분이알고있다고가정해보자. 32비트만으로충분하고굳이 64비트일필요가없는상황말이다. 이런경우는원래코드에서 ULONG 캐스팅을했던것처럼명시적으로 32비트만캐스팅하게해도전혀문제가되지않는다. 그런데 ULONG 캐스팅을하면컴파일오류가발생한다. 어떻게해야할까? 이런것을가능하게하기위해서는이런의미를명확히나타내는매크로를사용하도록되어있다. 그것이바로 PtrToUlong() 이다. PtrToUlong() 매크로를사용해서다음과같이수정할수도있다. 513 : ((PtrToUlong(pLDI->PortBase) + nport) & (DataBufferSize - 1))!= 0) [ ULONG_PTR 의의미 ] ULONG_PTR은이름만보면 ULONG형포인터를나타내는것으로오해할수있다. 하지만 ULONG형포인터는이미알고있듯이 PULONG이다. ULONG_PTR 은이런의미가아니다. ULONG_PTR에서 _PTR은변수의크기를의미한다고이해하기바란다. ULONG 타입인데그크기는포인터크기를따라간다는뜻이다. 64비트환경에서는 64비트 ULONG이고 32 비트환경에서는 32비트 ULONG이된다는말이다. 그렇다면 PULONG_PTR은무엇일까? 그렇다. 그냥 ULONG_PTR 타입을가리키는포인터일뿐이다. 마이크로소프트웨어 243
7 실 전! 강 의 실 개발자를위한실전 64 비트! 64 비트윈도우커널탐구 PtrToUlong() 매크로를사용하면 pldi->portbase은 PVOID이지만 ULONG 캐스팅이된다. PtrToUlong() 매크로의선언을찾아보면그이유를알게될것이다. 여하튼이코드도첫번째코드와마찬가지로아무런문제없이컴파일되지만의미는확연히다르다. 첫번째코드는결과가 64비트로나오는데비해이두번째코드는결과가 32비트로나온다는점이다. 둘다문법적으로는문제없이수정된것이맞는데동작시에도문제가없는지는신중히생각해봐야할사안이다. 1>sys\genport.c(526) : error C4311: type cast : pointer truncation from PVOID to ULONG 1>sys\genport.c(526) : error C4312: type cast : conversion from unsigned long to PUCHAR of greater size 1>sys\genport.c(530) : error C4311: type cast : pointer truncation from PVOID to ULONG 1>sys\genport.c(530) : error C4312: type cast : conversion from unsigned long to PUSHORT of greater size 1>sys\genport.c(534) : error C4311: type cast : pointer truncation from PVOID to ULONG 1>sys\genport.c(534) : error C4312: type cast : conversion from unsigned long to PULONG of greater size 1>sys\genport.c(544) : error C4311: type cast : pointer truncation from PVOID to ULONG 1>sys\genport.c(544) : error C4312: type cast : conversion from unsigned long to PUCHAR of greater size 1>sys\genport.c(548) : error C4311: type cast : pointer truncation from PVOID to ULONG 1>sys\genport.c(548) : error C4312: type cast : conversion from unsigned long to PUSHORT of greater size 1>sys\genport.c(552) : error C4311: type cast : pointer truncation from PVOID to ULONG 1>sys\genport.c(552) : error C4312: type cast : conversion from unsigned long to PULONG of greater size 다음에나오는오류메시지들의경우들도코드를보면모두같은상황으로볼수있다. 524 : case IOCTL_GPD_READ_PORT_UCHAR: 525: *(PUCHAR)pIOBuffer = READ_PORT_UCHAR( 526: (PUCHAR)((ULONG)pLDI->PortBase + nport) ); 527: break; 528: case IOCTL_GPD_READ_PORT_USHORT: 529: *(PUSHORT)pIOBuffer = READ_PORT_USHORT( 530: (PUSHORT)((ULONG)pLDI->PortBase + nport) ); 531: break; 532: case IOCTL_GPD_READ_PORT_ULONG: 533: *(PULONG)pIOBuffer = READ_PORT_ULONG( 534: (PULONG)((ULONG)pLDI->PortBase + nport) ); 535: break; 모두 nport라는 ULONG 값을 PVOID와연산하기위해캐스팅하는것이므로 ULONG_PTR로캐스팅하여해결할수있다. 또다른방법으로 PtrToUlong() 매크로도사용할수있다. 방법1 526: (PUCHAR)((ULONG_PTR)pLDI->PortBase + nport) ); 방법2 526: (PUCHAR)(PtrToUlong(pLDI->PortBase) + nport) ); 어떤것을선택할지신중히생각해보기바란다. 나머지많은오류메시지들도모두똑같이처리하면된다. 단, 반복적인오류들에대해정신없이포팅을진행하다보면앞서설명한선택적인부분들을제대로인지하지못하고넘어가는경우도있는데그런것이재앙의원인이될수도있으므로주의해서살펴봐야한다. 타입캐스팅을넘어서아직첫번째오류를처리하지않았다. 다시첫번째오류메시지로돌아가보자. 1>sys\genport.c(223) : error C4312: type cast : conversion from ULONG to PVOID of greater size 223 : plocalinfo->portbase = (PVOID)MappedAddress.LowPart; 오류메시지로부터 MappedAddress.LowPart는 ULONG 타입임을알수있다. ULONG을 PVOID로캐스팅하다가오류가발생한것이다. 이미설명한바와비슷하게 32비트 ULONG을 64비트인 PVOID로캐스팅하지못하게되어있다. 32비트에저장되어있던값을그대로 64비트포인터로인정하지못하겠다는의미이다. 이번케이스도앞에서처리했던것과비슷한방법으로처리하면 UlongToPtr 매크로를사용해서수정할수있다. PortBase는낮은주소값만사용된다는것을코드작성자가보장한다면말이다. 수정된코드는다음과같다. 223: plocalinfo->portbase = UlongToPtr( MappedAddress.LowPart ); 다른방법을하나더고려해보자. 이번에는 PortBase에낮은주소값만사용된다는것을코드작성자가보장하지못하는상황이라서 MappedAddress는 64 비트환경에서 64비트주소값을가지고있을수있다고가정해보자. 이번경우는 MappedAddress의형태까지고
8 64 비트시대를향한첫걸음, 커널모드드라이버포팅 려해야하는고급상황이라고할수있다. 눈치빠른독자들은이미 LowPart라는게나온것에서눈치챘겠지만이구조체는 HighPart 라는필드도있을것이고두개를합치면 64비트이므로역시 QuadPart라는필드도존재할것이다. 그렇다면어떻게수정해야할까? 정확하게확인해보기위해 MappedAddress 데이터의선언을살펴보자. 199: 0, 200: PortAddress, 201: &MemType, 202: &MappedAddress ); 응용프로그램과드라이버가공유하는구조체 Gdpwrite.c를보면다음과같은코드가있다. PHYSICAL_ADDRESS MappedAddress; sscanf(argv[2], %x, &InputBuffer.PortNumber); // Get the port number sscanf(argv[3], %x, &DataValue); // Get the data to be written. PHYSICAL_ADDRESS 는 Ntdef.h 에다음과같이선언되어있다. switch (argv[1][1]) { typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS; 또 LARGE_INTEGER 는다음과같이선언되어있다. #if defined(midl_pass) typedef struct _LARGE_INTEGER { #else // MIDL_PASS typedef union _LARGE_INTEGER { struct { ULONG LowPart; LONG HighPart; }; struct { ULONG LowPart; LONG HighPart; } u; #endif //MIDL_PASS LONGLONG QuadPart; } LARGE_INTEGER; case d : IoctlCode = IOCTL_GPD_WRITE_PORT_ULONG; InputBuffer.LongData = (ULONG)DataValue; DataLength = offsetof(, LongData) + sizeof(inputbuffer.longdata); break; } IoctlResult = DeviceIoControl( hndfile, // Handle to device IoctlCode, // IO Control code for Write &InputBuffer, // Buffer to driver. Holds port & data. DataLength, // Length of buffer in bytes. NULL, // Buffer from driver. Not used. 0, // Length of buffer in bytes. &ReturnedLength, // Bytes placed in outbuf. Should be 0. NULL // NULL means wait till I/O completes. ); 64비트크기를가지는 LONGLONG으로선언된 QuadPart를확인할수있다. 그렇다면수정은아주간단하다. 이번에는캐스팅으로코드를수정하는것이아니라제대로된데이터를 PVOID에대입하는방법으로코드를수정하는것이다. 수정된코드는다음과같다. 223: plocalinfo->portbase = (PVOID)MappedAddress.QuadPart; InputBuffer라는것을드라이버로넘기는데이것은다음과같이선언된변수이다. InputBuffer; // Input buffer for DeviceIoControl 구조체는 GPIOCTL.h에다음과같이선언되어있다. 64비트머신에서 198 라인에있는다음의코드가 MappedAddress 변수에 64비트주소를얻어줄가능성을인정한다면 QuadPart를사용하도록수정하는게확실한 64비트포팅이라고할수있다. 198: HalTranslateBusAddress( Isa, typedef struct _ { ULONG PortNumber; // Port # to write to union { // Data to be output to port ULONG LongData; USHORT ShortData; UCHAR CharData; 마이크로소프트웨어 245
9 실 전! 강 의 실 개발자를위한실전 64 비트! 64 비트윈도우커널탐구 < 그림 2> 32 비트와 64 비트에서의 구조체 32 비트 gpdwrite.exe < 그림 3> 64 비트에서크기가변하는수정된 구조체 32 비트 gpdwrite.exe (ULONG 4 바이트, union 4 바이트 ) (PVOID 4 바이트, union 4 바이트 ) 64 비트 gpdwrite.sys 64 비트 genport.sys (ULONG 4 바이트, union 4 바이트 ) (PVOID 8 바이트, union 4 바이트 ) }; } ; 이 portio 예제에서응용프로그램은앞의구조체를사용해서데이터를전달하지만드라이버에서는구조체를사용하지않고응용프로그램에서전달한메모리주소를옵셋으로계산하면서값을읽거나쓴다. 왜이렇게작성되어있는지알수없지만, 드라이버에서도이구조체를사용했으면훨씬코드가깔끔해지지않았을까싶다. 어쨌튼응용프로그램과드라이버가구조체를공유하는상황을설명하기위해서드라이버에서도이구조체를다음과같이사용한다고가정해보자. *pinputbuffer pinputbuffer = (*) pirp->associatedirp.systembuffer; switch (IoctlCode) { case IOCTL_GPD_WRITE_PORT_ULONG: nportnum = pinputbuffer->portnumber; nlongdata = pinputbuffer->longdata; break; } 응용프로그램과드라이버가공유하는구조체가있을때문제가생길수있는경우는드라이버만 64비트포팅하고응용프로그램은 32 비트그대로사용하는경우이다. Gpdwrite.exe는 32비트이고 gen < 리스트 2> PortNumber 타입을 PVOID로수정한 GEN_WRITE_INPUT 구조체 typedef struct _ { PVOID PortNumber; // Port # to write to union { // Data to be output to port ULONG LongData; USHORT ShortData; UCHAR CharData; }; } ; port.sys는 64비트라면어떤상황이될까? 32비트 gpdwrite.exe가 DeviceIoControl로전달한 InputBuffer가 64비트 genport.sys에서제대로처리가될것인지생각해보자. < 그림 2> 와같이 는아무런문제를가지고있지않다. 32비트빌드를하거나 64비트빌드를하거나모두같은크기의필드만가지고있기때문이다. 이제본격적으로문제의상황을설명하기위해서 < 리스트 2> 와같이구조체를약간바꾸어보자. 첫번째필드인 PortNumber의자료형을 32비트와 64비트에서다른크기를가지는 PVOID로바꿨다. 이와같은구조체가있었다면어떤문제가발생한다는것일까? < 그림 3> 에서볼수있듯이 32비트 gpdwrite.exe는 8바이트의데이터를내려보냈는데이를받아서해석하는 64비트 genport.sys는 12 바이트데이터인것처럼액세스하려고한다. 64비트 Genport.sys에서 PortNumber를읽으면 32비트 gpdwrite.exe가전달한 8바이트가다읽힐것이고 LongData, ShortData, CharData 등을읽으면 32비트 gpdwrite.exe가전달한 8바이트뒤에있는영역에서쓰레기값이읽힐것이다. 이는곧드라이버가오동작을할상황이라는것을의미한다. PVOID가 32비트로빌드한 gpdwrite.exe와 64 비트로빌드한 genport.sys에서다른크기를가지기때문에구조체의크기가달라지고각필드의옵셋도달라지는것을보여주고있다. 이런상황을해결하기위해서는어쩔수없이구조체의공유를포기해야한다. 64비트 genport.sys는 32 비트 gpdwrite.exe가자신을사용하고있다는것을알고있으므로 DeviceIoControl이호출되었을때다음과같이명시적인 32비트구조체를정의해서데이터를액세스해야한다. typedef struct 32 { ULONG PortNumber; // Port # to write to union { // Data to be output to port ULONG LongData; USHORT ShortData; UCHAR CharData; }; } _32;
10 64 비트시대를향한첫걸음, 커널모드드라이버포팅 < 그림 4> 32 비트프로세스를위한 _32 구조체 32 비트 gpdwrite.exe < 그림 5> 64 비트에서의 구조체 32 비트 gpdwrite.exe (PVOID 4 바이트, union 4 바이트 ) (PVOID 8 바이트, union 4 바이트 ) 64 비트 genport.sys 64 비트 genport.sys _32 (ULONG 4 바이트, union 4 바이트 ) (PVOID 8 바이트, union 4 바이트 ) < 그림 4> 는 64비트 genport.sys 드라이버가 GENPORT_WRITE _INPUT_32를사용해서 32비트 gpdwrite.exe로부터전달되는 구조체를정확히인식하는것을보여주고있다. IoIs32bitProcess() 를사용하자앞의예에서는응용프로그램은 32비트그대로사용하고드라이버만 64비트로포팅하는작업을진행했다. 이번에는이상태에서응용프로그램도 64비트로포팅하는상황이발생했다고가정해보자. 응용프로그램의 64비트포팅자체는앞에서드라이버를포팅했던것과마찬가지로몇가지만신경써주면어렵지않게진행할수있다. 정작문제는드라이버가갑자기 32비트응용프로그램과 64비트응용프로그램두가지를지원해야하는운명을맞이했다는것이다. 다른것들은크게문제가없으니이미 < 리스트 2> 에서예로들었던구조체를 DeviceIoControl로전달할때에대한문제만살펴보고넘어가도록하자. 64비트 gpdwrite.exe와 64 비트 genport.sys만동작하게한다면다음과같이아무런문제가없는상태가된다. 문제는하나의 64비트드라이버를만들어놓고이것을 32비트응용프로그램과 64비트응용프로그램에서모두사용할경우에발생한다. 32비트 gpdwrite.exe와 64 비트 gdpwrite.exe가모두하나의소스코드로빌드되어만들어진경우 64비트 genport.sys는 IoctlCode IOCTL_GPD_WRITE_PORT_ULONG을받았을때이것이 32비트로부터온것인지 64비트로부터온것인지구분해서처리해야한다. 64비트로부터온것이라면 < 그림 5> 와같이 GENPORT_WRITE_ INPUT을사용해야하고 32비트로부터온것이라면 GENPORT_ WRITE_INPUT_32를사용해야한다. 이것을어떻게구분할수있을까? 여기에대한답이바로 IoIs32bitProcess() 이다. 다음의코드에서사용예를보인다. *pinputbuffer _32 *pinputbuffer32 If (IoIs32bitProcess( Irp ) == TRUE) pinputbuffer32 = (_32*) pirp->associatedirp.systembuffer; else pinputbuffer = (*) pirp->associatedirp.systembuffer; switch (IoctlCode) { case IOCTL_GPD_WRITE_PORT_ULONG: If (IoIs32bitProcess( Irp ) == TRUE) { nportnum = pinputbuffer32->portnumber; nlongdata = pinputbuffer32->longdata; } Else // 64비트 { nportnum = pinputbuffer->portnumber; nlongdata = pinputbuffer->longdata; } break; } 이와같이 IoIs32bitProcess() 를사용하면 32비트프로세스에서발생한 Irp인지 64비트프로세스에서발생한 Irp인지판단할수있다. 여러분의 64비트드라이버가어떤모드의프로세스로부터 Irp를받고있는지확인해야한다면 IoIs32bitProcess() 를사용하자. 데이터미정렬문제 IA64에서포팅하면서특히신경써야할부분이있는데이것이바로데이터미정렬 (data misalignment) 문제이다. AMD64는 x86과마찬가지로별다른문제가없지만 IA64는이부분에서명백한제약을가지고있기때문이다. IA64는메모리주소경계에맞지않는주소를액세스할경우데이터미정렬예외 (data misalignment exception) 를발생시킨다. 이것은응용프로그램이나커널모두드라이버모두마찬가지여서데이터미정렬문제를잘고려하지않는다면응용프로그램은비정상종료가될수있고드라이버는블루스크린을발생시킬수있다. < 리스트 2> 를변형하여이문제를설명해보자. #pragma pack(1) 은 1바이트패킹, 즉구조체의필드들을모두바이트단위로붙여달라는뜻이다. 컴파일옵션중 /Zp1을사용했다면 pack(1) 과마찬가지의미이고소스내의모든구조체에적용될것이 마이크로소프트웨어 247
11 실 전! 강 의 실 개발자를위한실전 64 비트! 64 비트윈도우커널탐구 < 그림 6> 1 바이트정렬된 구조체의메모리구조 < 그림 7> 8 바이트정렬된 구조체의메모리구조 btest PortNumber LongData btest Padding PortNumber LongData 다. 이구조체는메모리상에어떻게존재하게되고무엇이문제가되는것일까? 1바이트패킹으로컴파일된구조체는메모리상에 < 그림 6> 과같이 13바이트길이로존재하게된다. 여기서두번째필드인 PVOID PortNumber를액세스할때 IA64에서는데이터미정렬예외가발생한다. 예외가발생하는이유는 PortNumer에해당하는 8바이트를참조하려고하는데이필드가메모리상에서첫번째 8바이트와두번째 8바이트경계에걸쳐있기때문이다. 좀더자세히설명하면 IA64는 64 비트 CPU이기때문에 8바이트단위로메모리어드레싱을하는것이기본구조로되어있다. 어떤메모리를참조하든지 8바이트씩참조하게되어있다. 8의배수인메모리주소에서 8바이트를참조하는것은참조단위에맞기때문에허용되지만다른주소에서 8바이트를참조하는것은 8바이트씩두번읽어야하는상황이발생하므로허용되지않는다. 이와같은구조체에서 PortNumber를제대로참조하려면 0부터 7 까지 8바이트를읽어서 PortNumber의 7바이트를취하고 8부터 15 까지 8바이트를읽어서 PortNumber의나머지 1바이트를취해서다시 8바이트로조합하는과정이이루어져야한다. AMD64는문제가없다고했는데 AMD64는실제로 CPU 내부에서이런작업을해주기때문에문제가없는것이다. 이런방식은사실 x86 계열의동작방식이다. AMD64도 x86 확장 CPU이기때문에이런특성을그대로계승 < 리스트 3> 1바이트패킹되고 btest가추가된 구조체 #pragma pack(1) typedef struct _ { BOOLEAN btest; PVOID PortNumber; // Port # to write to union { // Data to be output to port ULONG LongData; USHORT ShortData; UCHAR CharData; }; } ; #pragma pack() 하고있는것이다. 반면에 IA64는새로운설계를하면서 CPU에서이런기능이제거됐다. 따라서메모리주소경계에맞춰메모리를참조하는모든책임은 IA64를사용하는소프트웨어의몫으로넘어가게되었다. 이와같은상황에서우리가해줄수있는일은다음 3가지정도로볼수있다. 예외핸들링처리 정렬되지않은 (misaligned) 형태의구조체를정렬된 (aligned) 형태의구조체로수정 컴파일러에게도움요청데이터미정렬예외가발생하면예외핸들러에서이것을잡아서문제의상황을분석하여바로잡아주고정상적으로진행하게하는것도하나의방법일수있으나좀더쉬운다른방법들이있으므로이방법은거의사용할일이없을것같다. 두번째방법을주로사용하면되는데구조체의형태를문제가없도록수정하는방법이다. 사실 < 리스트 3> 에서 #pragma pack(1) 만제거하면문제는바로해결된다. 어떻게해결이되는지는메모리구성을보면쉽게이해할수있다. 1바이트패킹으로지정하지않으면컴파일러는기본값은 8바이트패킹이기때문에 < 그림 7> 과같이 8바이트정렬된형태의 20바이트짜리구조체를만들어낸다. 구조체의길이가좀길어지기는했지만 PortNumber를참조할때 8~15를정확히참조하기때문에데이터미정렬문제가발생하지않는다. Padding에의해늘어난길이가비효율적으로보인다면구조체의모양을조금바꾸는것도괜찮은방법이다. < 리스트 3> 에서 btest의위치만바꾸어다음과같이수정하면구조체의모양은 < 그림 8> 과같이바뀐다. typedef struct _ { PVOID PortNumber; // Port # to write to union { // Data to be output to port ULONG LongData; USHORT ShortData; UCHAR CharData; }; BOOLEAN btest;
12 64 비트시대를향한첫걸음, 커널모드드라이버포팅 } ; < 그림 8> 8 바이트정렬되고 btest 를맨뒤로배치한메모리구조 처음과같이 13바이트를차지하는구조체이면서 PortNumber를참조할때데이터미정렬문제가발생하지않는구조체가되었다. 사실구조체의필드를잘배열해서메모리주소경계에걸친데이터가존재하지않게하고구조체가차지하는메모리를줄이는것은 64비트포팅에서만존재하는문제는아니다. 일반적으로구조체를만들때늘염두에둬야하는사항이라고할수있다. 다시정리하면 64비트포팅에서데이터미정렬문제를해결하려면 #pragma pack(1) 같은것을제거하여구조체의필드들이 8바이트정렬 (alignment) 을준수하도록해야한다는것이다. 세번째컴파일러에게도움을요청해야하는상황은죽어도 #prag ma pack(1) 을사용해야만하는상황일것이다. 경우에따라하위버전과의데이터호환성과같은기타구구절절한사연에의해 1바이트정렬 (alignment) 을유지해야만하는상황도있을것이다. 이런상황이라면어쩔수없이컴파일러에게도움을요청해야한다. < 리스트 3> 과같은구조체를어쩔수없이사용해야할경우 UNALIGNED 매크로를이용할수있다. 다음코드에서 UNALIGNED 매크로의사용예를보인다. 데이터미정렬예외 (data misalignment exception) 가발생하는코드 pinputbuffer->portnumber = p; 데이터미정렬예외 (data misalignment exception) 가발생하지않는코드 *(UNALIGNED PVOID)&pInputBuffer->PortNumber = p; PortNumber 절반의성공필자는이포팅예제에서컴파일은성공했지만동작테스트는수행하지않았다. 컴파일을성공적으로완료한것만으로 64비트포팅이완전히끝났다고할수있을까? 당연히그렇지않다. 이것은절반정도의작업을마친것이라고보면될것이다. 프로그래머라면모두다느끼겠지만테스트되지않은코드는그냥코드일뿐이다. 어떤동작도보장할수없는코드일뿐이다. 테스트를통해코드를검증해야만가치있는코드로인정받을수있다. 앞에서 64비트포팅된드라이버를실제로동작시키려고하다보면어떤문제가발생할수도있다. 이런것들은컴파일러레벨에서잡을수없는논리적인오류들이거나 IA64의데이터미정렬문제이거나기타의어떤오류들일것이다. 하지만이제는이런문제를두려워하지않아도된다. 앞서설명한포팅의원칙들과과거 64비트기사들에서다뤘던내용들을숙지하고있다면수정할수있는방법을어렵지않게찾아낼수있을것이다. 따라서나머지부분은여러분의숙제로남겨놓을것이다. 이제부터커널모드드라이버 64비트포팅을향한발걸음을힘껏내디뎌보자. m a s o LongData btest 정리 김세미 semsem@imaso.co.kr 과같은형태의코드를 와같은형태의코드로수정하면데이터미정렬예외가발생하지않는다. UNALIGNED 매크로는무슨마법을부리고있는것일까? 우리가 UNALIGNED 매크로를사용하는것은컴파일러에게 이것은메모리주소경계에정렬되지않은메모리포인터입니다. 잘처리해주세요 라고요청하는것이다. 이럴경우컴파일러는한꺼번에 8바이트액세스를하는코드를생성하지않고친절하게도 1바이트씩메모리를읽어서 8바이트로조합해주는코드를생성해준다. 이렇게되면오류는발생하지않지만코드양이늘어나게된다. 코드의양이늘어나게된다는것은하는일이많아지는것이므로성능에영향을미친다는것을의미한다. DDK를보더라도 UNALINED 매크로를사용하는것은성능에많은영향을주는작업이므로가급적사용하지말라고권고한다. 이런사항들을모두알고있어도어쩔수없는경우라면성능을희생해서라도 UNALINGED를써야할수밖에없다. 마이크로소프트웨어 249
Microsoft PowerPoint - chap01-C언어개요.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 프로그래밍의 기본 개념을
More informationWindows 8에서 BioStar 1 설치하기
/ 콘텐츠 테이블... PC에 BioStar 1 설치 방법... Microsoft SQL Server 2012 Express 설치하기... Running SQL 2012 Express Studio... DBSetup.exe 설정하기... BioStar 서버와 클라이언트 시작하기... 1 1 2 2 6 7 1/11 BioStar 1, Windows 8 BioStar
More informationISP and CodeVisionAVR C Compiler.hwp
USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler http://www.avrmall.com/ November 12, 2007 Copyright (c) 2003-2008 All Rights Reserved. USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler
More informationMicrosoft PowerPoint - chap02-C프로그램시작하기.pptx
#include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의
More informationPowerPoint 프레젠테이션
KeyPad Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 에는 16 개의 Tack Switch 를사용하여 4 행 4 열의 Keypad 가장착 4x4 Keypad 2 KeyPad 를제어하기위하여 FPGA 내부에 KeyPad controller 가구현 KeyPad controller 16bit 로구성된
More informationChapter ...
Chapter 4 프로세서 (4.9절, 4.12절, 4.13절) Contents 4.1 소개 4.2 논리 설계 기초 4.3 데이터패스 설계 4.4 단순한 구현 방법 4.5 파이프라이닝 개요*** 4.6 파이프라이닝 데이터패스 및 제어*** 4.7 데이터 해저드: 포워딩 vs. 스톨링*** 4.8 제어 해저드*** 4.9 예외 처리*** 4.10 명령어 수준
More informationvRealize Automation용 VMware Remote Console - VMware
vrealize Automation 용 VMware Remote Console VMware Remote Console 9.0 이문서는새버전으로교체되기전까지나열된각제품버전및모든이후버전을지원합니다. 이문서에대한최신버전을확인하려면 http://www.vmware.com/kr/support/pubs 를참조하십시오. KO-002230-00 vrealize Automation
More informationBMP 파일 처리
BMP 파일처리 김성영교수 금오공과대학교 컴퓨터공학과 학습내용 영상반전프로그램제작 2 Inverting images out = 255 - in 3 /* 이프로그램은 8bit gray-scale 영상을입력으로사용하여반전한후동일포맷의영상으로저장한다. */ #include #include #define WIDTHBYTES(bytes)
More informationChapter #01 Subject
Device Driver March 24, 2004 Kim, ki-hyeon 목차 1. 인터럽트처리복습 1. 인터럽트복습 입력검출방법 인터럽트방식, 폴링 (polling) 방식 인터럽트서비스등록함수 ( 커널에등록 ) int request_irq(unsigned int irq, void(*handler)(int,void*,struct pt_regs*), unsigned
More informationMicrosoft Word - ntasFrameBuilderInstallGuide2.5.doc
NTAS and FRAME BUILDER Install Guide NTAS and FRAME BUILDER Version 2.5 Copyright 2003 Ari System, Inc. All Rights reserved. NTAS and FRAME BUILDER are trademarks or registered trademarks of Ari System,
More informationMicrosoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100
2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack
More information<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>
SIMATIC S7 Siemens AG 2004. All rights reserved. Date: 22.03.2006 File: PRO1_17E.1 차례... 2 심벌리스트... 3 Ch3 Ex2: 프로젝트생성...... 4 Ch3 Ex3: S7 프로그램삽입... 5 Ch3 Ex4: 표준라이브러리에서블록복사... 6 Ch4 Ex1: 실제구성을 PG 로업로드하고이름변경......
More information슬라이드 1
CCS v4 사용자안내서 CCSv4 사용자용예제따라하기안내 0. CCS v4.x 사용자 - 준비사항 예제에사용된 CCS 버전은 V4..3 버전이며, CCS 버전에따라메뉴화면이조금다를수있습니다. 예제실습전준비하기 처음시작하기예제모음집 CD 를 PC 의 CD-ROM 드라이브에삽입합니다. 아래안내에따라, 예제소스와헤더파일들을 PC 에설치합니다. CD 드라이브 \SW\TIDCS\TIDCS_DSP80x.exe
More informationuntitled
시스템소프트웨어 : 운영체제, 컴파일러, 어셈블러, 링커, 로더, 프로그래밍도구등 소프트웨어 응용소프트웨어 : 워드프로세서, 스프레드쉬트, 그래픽프로그램, 미디어재생기등 1 n ( x + x +... + ) 1 2 x n 00001111 10111111 01000101 11111000 00001111 10111111 01001101 11111000
More information목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.
소프트웨어매뉴얼 윈도우드라이버 Rev. 3.03 SLP-TX220 / TX223 SLP-TX420 / TX423 SLP-TX400 / TX403 SLP-DX220 / DX223 SLP-DX420 / DX423 SLP-DL410 / DL413 SLP-T400 / T403 SLP-T400R / T403R SLP-D220 / D223 SLP-D420 / D423
More information금오공대 컴퓨터공학전공 강의자료
C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include
More information슬라이드 1
Delino EVM 용처음시작하기 - 프로젝트만들기 (85) Delfino EVM 처음시작하기앞서 이예제는타겟보드와개발홖경이반드시갖추어져있어야실습이가능합니다. 타겟보드 : Delfino EVM + TMS0F85 초소형모듈 개발소프트웨어 : Code Composer Studio 4 ( 이자료에서사용된버전은 v4..입니다. ) 하드웨어장비 : TI 정식 JTAG
More informationchap 5: Trees
5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경
More informationK&R2 Reference Manual 번역본
typewriter structunion struct union if-else if if else if if else if if if if else else ; auto register static extern typedef void char short int long float double signed unsigned const volatile { } struct
More information11장 포인터
Dynamic Memory and Linked List 1 동적할당메모리의개념 프로그램이메모리를할당받는방법 정적 (static) 동적 (dynamic) 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 int i, j; int buffer[80]; char name[] = data structure"; 처음에결정된크기보다더큰입력이들어온다면처리하지못함
More informationMicrosoft PowerPoint - 권장 사양
Autodesk 제품컴퓨터사양 PRONETSOFT.CO 박경현 1 AutoCAD 시스템사양 시스템요구사양 32 비트 AutoCAD 2009 를위한시스템요구사항 Intel Pentium 4 프로세서 2.2GHz 이상, 또는 Intel 또는 AMD 듀얼 코어프로세서 16GH 1.6GHz 이상 Microsoft Windows Vista, Windows XP Home
More information03_queue
Queue Data Structures and Algorithms 목차 큐의이해와 ADT 정의 큐의배열기반구현 큐의연결리스트기반구현 큐의활용 덱 (Deque) 의이해와구현 Data Structures and Algorithms 2 큐의이해와 ADT 정의 Data Structures and Algorithms 3 큐 (Stack) 의이해와 ADT 정의 큐는 LIFO(Last-in,
More information임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과
임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수
More informationPowerPoint Template
JavaScript 회원정보 입력양식만들기 HTML & JavaScript Contents 1. Form 객체 2. 일반적인입력양식 3. 선택입력양식 4. 회원정보입력양식만들기 2 Form 객체 Form 객체 입력양식의틀이되는 태그에접근할수있도록지원 Document 객체의하위에위치 속성들은모두 태그의속성들의정보에관련된것
More information<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>
VHDL 프로그래밍 D. 논리합성및 Xilinx ISE 툴사용법 학습목표 Xilinx ISE Tool 을이용하여 Xilinx 사에서지원하는해당 FPGA Board 에맞는논리합성과정을숙지 논리합성이가능한코드와그렇지않은코드를구분 Xilinx Block Memory Generator를이용한 RAM/ ROM 생성하는과정을숙지 2/31 Content Xilinx ISE
More informationWindows 10 General Announcement v1.0-KO
Windows 10 Fuji Xerox 장비와의호환성 v1.0 7 July, 2015 머리말 Microsoft 는 Windows 10 이 Windows 자동업데이트기능을통해예약되어질수있다고 6 월 1 일발표했다. 고객들은 윈도우 10 공지알림을받기 를표시하는새로운아이콘을알아차릴수있습니다. Fuji Xerox 는 Microsoft 에서가장최신운영시스템인 Windows
More informationMicrosoft PowerPoint - CSharp-10-예외처리
10 장. 예외처리 예외처리개념 예외처리구문 사용자정의예외클래스와예외전파 순천향대학교컴퓨터학부이상정 1 예외처리개념 순천향대학교컴퓨터학부이상정 2 예외처리 오류 컴파일타임오류 (Compile-Time Error) 구문오류이기때문에컴파일러의구문오류메시지에의해쉽게교정 런타임오류 (Run-Time Error) 디버깅의절차를거치지않으면잡기어려운심각한오류 시스템에심각한문제를줄수도있다.
More information금오공대 컴퓨터공학전공 강의자료
C 프로그래밍프로젝트 Chap 13. 포인터와배열! 함께이해하기 2013.10.02. 오병우 컴퓨터공학과 13-1 포인터와배열의관계 Programming in C, 정재은저, 사이텍미디어. 9 장참조 ( 교재의 13-1 은읽지말것 ) 배열이름의정체 배열이름은 Compile 시의 Symbol 로서첫번째요소의주소값을나타낸다. Symbol 로서컴파일시에만유효함 실행시에는메모리에잡히지않음
More informationC# Programming Guide - Types
C# Programming Guide - Types 최도경 lifeisforu@wemade.com 이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx Types, Variables, and Values C# 은 type 에민감한언어이다. 모든
More informationMicrosoft Word - windows server 2003 수동설치_non pro support_.doc
Windows Server 2003 수동 설치 가이드 INDEX 운영체제 설치 준비과정 1 드라이버를 위한 플로피 디스크 작성 2 드라이버를 위한 USB 메모리 작성 7 운영체제 설치 과정 14 Boot Sequence 변경 14 컨트롤러 드라이버 수동 설치 15 운영체제 설치 17 운영체제 설치 준비 과정 Windows Server 2003 에는 기본적으로
More information슬라이드 1
-Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역
More informationThe Pocket Guide to TCP/IP Sockets: C Version
인터넷프로토콜 5 장 데이터송수신 (3) 1 파일전송메시지구성예제 ( 고정크기메시지 ) 전송방식 : 고정크기 ( 바이너리전송 ) 필요한전송정보 파일이름 ( 최대 255 자 => 255byte 의메모리공간필요 ) 파일크기 (4byte 의경우최대 4GB 크기의파일처리가능 ) 파일내용 ( 가변길이, 0~4GB 크기 ) 메시지구성 FileName (255bytes)
More informationMicrosoft PowerPoint - ch07 - 포인터 pm0415
2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자
More information아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상
Android 용 Brother Image Viewer 설명서 버전 0 KOR 아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상표입니다. Android는
More information지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함. 한번은 intel CPU를위한 gcc로, 한번은 ARM CPU를위한 gcc로. AR
Configure Kernel Build Environment And kernel & root file system Build 2018-09-27 VLSI Design Lab 1 지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함.
More informationA Hierarchical Approach to Interactive Motion Editing for Human-like Figures
단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct
More information슬라이드 1
Software Verification #3 정적분석도구, 단위 / 시스템테스트도구 Software Verification Team 4 강 정 모 송 상 연 신 승 화 1 Software Verification #3 정적분석도구, 단위 / 시스템테스트도구 CONTENTS 01 Overall Structure 02 Static analyzer SonarQube
More information비디오 / 그래픽 아답터 네트워크 만약에 ArcGolbe를 사용하는 경우, 추가적인 디스크 공간 필요. ArcGlobe는 캐시파일을 생성하여 사용 24 비트 그래픽 가속기 Oepn GL 2.0 이상을 지원하는 비디오카드 최소 64 MB 이고 256 MB 이상을 메모리
ArcGIS for Desktop 10.4 Single Use 설치가이드 Software: ArcGIS for Desktop 10.4 Platforms: Windows 10, 8.1, 7, Server 2012, Server 2008 ArcGIS for Desktop 10.4 시스템 요구사항 1. 지원 플랫폼 운영체제 최소 OS 버전 최대 OS 버전 Windows
More information1. 안드로이드개발환경설정 안드로이드개발을위해선툴체인을비롯한다양한소프트웨어패키지가필요합니다 툴체인 (Cross-Compiler) 설치 안드로이드 2.2 프로요부터는소스에기본툴체인이 prebuilt 라는이름으로포함되어있지만, 리눅스 나부트로더 (U-boot)
1. 안드로이드개발환경설정 안드로이드개발을위해선툴체인을비롯한다양한소프트웨어패키지가필요합니다. 1.1. 툴체인 (Cross-Compiler) 설치 안드로이드 2.2 프로요부터는소스에기본툴체인이 prebuilt 라는이름으로포함되어있지만, 리눅스 나부트로더 (U-boot) 만별도로필요한경우도있어툴체인설치및설정에대해알아봅니다. 1.1.1. 툴체인설치 다음링크에서다운받을수있습니다.
More information[ 마이크로프로세서 1] 1 주차 1 차시. 마이크로프로세서개요 1 주차 1 차시마이크로프로세서개요 학습목표 1. 마이크로프로세서 (Microprocessor) 를설명할수있다. 2. 마이크로컨트롤러를성능에따라분류할수있다. 학습내용 1 : 마이크로프로세서 (Micropr
1 주차 1 차시마이크로프로세서개요 학습목표 1. 마이크로프로세서 (Microprocessor) 를설명할수있다. 2. 마이크로컨트롤러를성능에따라분류할수있다. 학습내용 1 : 마이크로프로세서 (Microprocessor) 1. 마이크로프로세서란? 1 작은실리콘칩위에트랜지스터를수천만개집적한소자 2 마이크로 [μ] 는매우작은크기, 프로세서는처리기혹은 CPU를뜻하므로
More informationAltibase Installation Manual
ALTIBASE HDB Application Development Windows ODBC Driver Installer User s Guide Release 6.3.1 (April 17, 2015) ----------------------------------------------------------- ALTIBASE Application Development
More informationMicrosoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt
변수와상수 1 변수란무엇인가? 변수 : 정보 (data) 를저장하는컴퓨터내의특정위치 ( 임시저장공간 ) 메모리, register 메모리주소 101 번지 102 번지 변수의크기에따라 주로 byte 단위 메모리 2 기본적인변수형및변수의크기 변수의크기 해당컴퓨터에서는항상일정 컴퓨터마다다를수있음 short
More informationMicrosoft PowerPoint - o8.pptx
메모리보호 (Memory Protection) 메모리보호를위해 page table entry에 protection bit와 valid bit 추가 Protection bits read-write / read-only / executable-only 정의 page 단위의 memory protection 제공 Valid bit (or valid-invalid bit)
More informationRHEV 2.2 인증서 만료 확인 및 갱신
2018/09/28 03:56 1/2 목차... 1 인증서 확인... 1 인증서 종류와 확인... 4 RHEVM CA... 5 FQDN 개인 인증서... 5 레드햇 인증서 - 코드 서명 인증서... 6 호스트 인증... 7 참고사항... 8 관련링크... 8 AllThatLinux! - http://allthatlinux.com/dokuwiki/ rhev_2.2_
More information제목
Development Technology Seminar 작 성 자 : 고형호 이 메 일 : hyungho.ko@gmail.com 최초작성일 : 2007.01.19 최종작성일 : 2007.02.05 버 전 : 01.05 홈 피 : www.innosigma.com Goal Exception Handling 1. SEH vs. CEH Exception Handling
More informationPowerPoint 프레젠테이션
System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소
More information이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2
제 17 장동적메모리와연결리스트 유준범 (JUNBEOM YOO) Ver. 2.0 jbyoo@konkuk.ac.kr http://dslab.konkuk.ac.kr 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다. 이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다.
More information다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");
다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp"); dispatcher.forward(request, response); - 위의예에서와같이 RequestDispatcher
More informationMicrosoft Word - Armjtag_문서1.doc
ARM JTAG (wiggler 호환 ) 사용방법 ( IAR EWARM 에서 ARM-JTAG 로 Debugging 하기 ) Test Board : AT91SAM7S256 IAR EWARM : Kickstart for ARM ARM-JTAG : ver 1.0 ( 씨링크테크 ) 1. IAR EWARM (Kickstart for ARM) 설치 2. Macraigor
More information<4D F736F F D D31312D30312D53572D30312DBBE7BFEBC0DABCB3B8EDBCAD5FBFDCBACEB9E8C6F7BFEB2E646F63>
SAM4S Printer Driver Installer 달리명시하지않은한, 인쇄또는복사된문서는통제하지않는문서임 목 차 1. 1. WINDOWS DRIVER INSTALLER 설치 설치...... 2 2. 프린터추가...... 5 3. 프린터제거...... 19 4. 프린터추가 / 제거선택...... 21 5. 프로그램추가 / 제거...... 21 SHC- 11-01-
More information1. Windows 설치 (Client 설치 ) 원하는위치에다운받은발송클라이언트압축파일을해제합니다. Step 2. /conf/config.xml 파일수정 conf 폴더에서 config.xml 파일을텍스트에디터를이용하여 Open 합니다. config.xml 파일에서, 아
LG U+ SMS/MMS 통합클라이언트 LG U+ SMS/MMS Client Simple Install Manual LG U+ SMS/MMS 통합클라이언트 - 1 - 간단설치매뉴얼 1. Windows 설치 (Client 설치 ) 원하는위치에다운받은발송클라이언트압축파일을해제합니다. Step 2. /conf/config.xml 파일수정 conf 폴더에서 config.xml
More informationMicrosoft PowerPoint - chap06-2pointer.ppt
2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.
More informationUSER GUIDE
Solution Package Volume II DATABASE MIGRATION 2010. 1. 9. U.Tu System 1 U.Tu System SeeMAGMA SYSTEM 차 례 1. INPUT & OUTPUT DATABASE LAYOUT...2 2. IPO 중 VB DATA DEFINE 자동작성...4 3. DATABASE UNLOAD...6 4.
More informationAPI 매뉴얼
PCI-DIO12 API Programming (Rev 1.0) Windows, Windows2000, Windows NT and Windows XP are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations mentioned
More information게시판 스팸 실시간 차단 시스템
오픈 API 2014. 11-1 - 목 차 1. 스팸지수측정요청프로토콜 3 1.1 스팸지수측정요청프로토콜개요 3 1.2 스팸지수측정요청방법 3 2. 게시판스팸차단도구오픈 API 활용 5 2.1 PHP 5 2.1.1 차단도구오픈 API 적용방법 5 2.1.2 차단도구오픈 API 스팸지수측정요청 5 2.1.3 차단도구오픈 API 스팸지수측정결과값 5 2.2 JSP
More informationwtu05_ÃÖÁ¾
한 눈에 보는 이달의 주요 글로벌 IT 트렌드 IDG World Tech Update May C o n t e n t s Cover Story 아이패드, 태블릿 컴퓨팅 시대를 열다 Monthly News Brief 이달의 주요 글로벌 IT 뉴스 IDG Insight 개발자 관점에서 본 윈도우 폰 7 vs. 아이폰 클라우드 컴퓨팅, 불만 검증 단계 돌입 기업의
More informationChap 6: Graphs
5. 작업네트워크 (Activity Networks) 작업 (Activity) 부분프로젝트 (divide and conquer) 각각의작업들이완료되어야전체프로젝트가성공적으로완료 두가지종류의네트워크 Activity on Vertex (AOV) Networks Activity on Edge (AOE) Networks 6 장. 그래프 (Page 1) 5.1 AOV
More information<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>
#include "stdafx.h" #include "Huffman.h" 1 /* 비트의부분을뽑아내는함수 */ unsigned HF::bits(unsigned x, int k, int j) return (x >> k) & ~(~0
More information1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할
15 장기타주제들 auto_ptr 변환함수 cast 연산자에의한명시적형변환실행시간타입정보알아내기 (RTTI) C++ 프로그래밍입문 1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout > *p; if (*p
More information커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서
커알못의 커널 탐방기 2015.12 이 세상의 모든 커알못을 위해서 개정 이력 버전/릴리스 0.1 작성일자 2015년 11월 30일 개요 최초 작성 0.2 2015년 12월 1일 보고서 구성 순서 변경 0.3 2015년 12월 3일 오탈자 수정 및 글자 교정 1.0 2015년 12월 7일 내용 추가 1.1 2015년 12월 10일 POC 코드 삽입 및 코드
More informationFrama-C/JESSIS 사용법 소개
Frama-C 프로그램검증시스템소개 박종현 @ POSTECH PL Frama-C? C 프로그램대상정적분석도구 플러그인구조 JESSIE Wp Aorai Frama-C 커널 2 ROSAEC 2011 동계워크샵 @ 통영 JESSIE? Frama-C 연역검증플러그인 프로그램분석 검증조건추출 증명 Hoare 논리에기초한프로그램검증도구 사용법 $ frama-c jessie
More information<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>
리눅스 오류처리하기 2007. 11. 28 안효창 라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스 라이브러리함수의오류번호얻기 19-1
More information주제별로명령들이따로있는것을보면주제끼리의순서는상관없어도명령들의위치를지 켜야할지도모른다. 하지만실험은해보지않았으니심심하면체크해봐도된다. [CRAB] CRAB 을하기위한가장기본적인세팅이다. jobtype = cmssw scheduler = glite 등이있다. 보통 CRAB
CRAB job 1. CRAB이란? CRAB: CMS Remote Analysis Builder 원격으로 Tier-2에접속해서일을하는프로그램이다. 사용자의컴퓨터가아닌외부의 Tier-2에서일이돌아가므로사용자의 terminal이꺼진다해도일이끊기지않는다. 2. 전제조건 private key 가있어야한다. VO member 여야한다. 3. sitedb CMS에서해당
More information목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4
ALTIBASE HDB 6.5.1.5.10 Patch Notes 목차 BUG-46183 DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG-46249 [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4 BUG-46266 [sm]
More informationActFax 4.31 Local Privilege Escalation Exploit
NSHC 2013. 05. 23 악성코드 분석 보고서 [ Ransomware 악성코드 ] 사용자의 컴퓨터를 강제로 잠그고 돈을 요구하는 형태의 공격이 기승을 부리고 있 습니다. 이러한 형태의 공격에 이용되는 악성코드는 Ransomware로 불리는 악성코 드 입니다. 한번 감염 시 치료절차가 복잡하며, 보고서 작성 시점을 기준으로 지속 적인 피해자가 발생되고
More informationSOFTBASE XFRAME DEVELOPMENT GUIDE SERIES ActiveX 컴포넌트가이드 서울특별시구로구구로 3 동한신 IT 타워 1215 호 Phone Fax
SOFTBASE XFRAME DEVELOPMENT GUIDE SERIES 2012.02.18 서울특별시구로구구로 3 동한신 IT 타워 1215 호 Phone 02-2108-8030 Fax 02-2108-8031 www.softbase.co.kr Copyright 2010 SOFTBase Inc. All rights reserved 목차 1 장 : ActiveX
More informationWindows Server 2012
Windows Server 2012 Shared Nothing Live Migration Shared Nothing Live Migration 은 SMB Live Migration 방식과다른점은 VM 데이터파일의위치입니다. Shared Nothing Live Migration 방식은 Hyper-V 호스트의로컬디스크에 VM 데이터파일이위치합니다. 반면에, SMB
More informationOCW_C언어 기초
초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주 학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2 목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향
More information슬라이드 1
Gradle 1. 도구개요 2. 설치및실행 3. 주요기능 4. 활용예제 1. 도구개요 1.1 도구정보요약 도구명 소개 특징 Gradle (http://www.gradle.org) 소프트웨어빌드자동화도구 라이선스 Apache License v2.0 Gradle 을통해소프트웨어패키지나프로젝트의빌드, 테스팅, 퍼블리슁, 배포등을자동화할수있다. Ant 의유연성과기능을
More informationMicrosoft Word - KPMC-400,401 SW 사용 설명서
LKP Ethernet Card SW 사용설명서 Version Information Tornado 2.0, 2.2 알 림 여기에실린내용은제품의성능향상과신뢰도의증대를위하여예고없이변경될수도있습니다. 여기에실린내용의일부라도엘케이일레븐의사전허락없이어떠한유형의매체에복사되거나저장될수없으며전기적, 기계적, 광학적, 화학적인어떤방법으로도전송될수없습니다. 엘케이일레븐경기도성남시중원구상대원동
More informationPowerPoint Presentation
객체지향프로그래밍 클래스, 객체, 메소드 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 필드만있는클래스 텔레비젼 2 예제 1. 필드만있는클래스 3 예제 2. 여러개의객체생성하기 4 5 예제 3. 메소드가추가된클래스 public class Television { int channel; // 채널번호 int volume; // 볼륨 boolean
More information[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi
2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,
More information< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>
Chap #2 펌웨어작성을위한 C 언어 I http://www.smartdisplay.co.kr 강의계획 Chap1. 강의계획및디지털논리이론 Chap2. 펌웨어작성을위한 C 언어 I Chap3. 펌웨어작성을위한 C 언어 II Chap4. AT89S52 메모리구조 Chap5. SD-52 보드구성과코드메모리프로그래밍방법 Chap6. 어드레스디코딩 ( 매핑 ) 과어셈블리어코딩방법
More informationSharing Memory Between Drivers and Applications
본컬럼에대한모든저작권은 DevGuru에있습니다. 컬럼을타사이트등에기재및링크또는컬럼내용을인용시반드시출처를밝히셔야합니다. 컬럼들을 CD나기타매체로배포하고자할경우 DevGuru에동의를얻으셔야합니다. c DevGuru Corporation. All rights reserved 기타자세한질문사항들은웹게시판이나 support@devguru.co.kr 으로 문의하기바랍니다.
More information학습목차 2.1 다차원배열이란 차원배열의주소와값의참조
- Part2- 제 2 장다차원배열이란무엇인가 학습목차 2.1 다차원배열이란 2. 2 2 차원배열의주소와값의참조 2.1 다차원배열이란 2.1 다차원배열이란 (1/14) 다차원배열 : 2 차원이상의배열을의미 1 차원배열과다차원배열의비교 1 차원배열 int array [12] 행 2 차원배열 int array [4][3] 행 열 3 차원배열 int array [2][2][3]
More informationMicrosoft PowerPoint - additional01.ppt [호환 모드]
1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park 함수 Jong Hyuk Park 함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능
More informationMicrosoft Word - src.doc
IPTV 서비스탐색및콘텐츠가이드 RI 시스템운용매뉴얼 목차 1. 서버설정방법... 5 1.1. 서비스탐색서버설정... 5 1.2. 컨텐츠가이드서버설정... 6 2. 서버운용방법... 7 2.1. 서비스탐색서버운용... 7 2.1.1. 서비스가이드서버실행... 7 2.1.2. 서비스가이드정보확인... 8 2.1.3. 서비스가이드정보추가... 9 2.1.4. 서비스가이드정보삭제...
More information<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>
연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.
More informationA Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning
C Programming Practice (II) Contents 배열 문자와문자열 구조체 포인터와메모리관리 구조체 2/17 배열 (Array) (1/2) 배열 동일한자료형을가지고있으며같은이름으로참조되는변수들의집합 배열의크기는반드시상수이어야한다. type var_name[size]; 예 ) int myarray[5] 배열의원소는원소의번호를 0 부터시작하는색인을사용
More informationvi 사용법
네트워크프로그래밍 6 장과제샘플코드 - 1:1 채팅 (udp 버전 ) 과제 서버에서먼저 bind 하고그포트를다른사람에게알려줄것 클라이언트에서알려준포트로접속 서로간에키보드입력을받아상대방에게메시지전송 2 Makefile 1 SRC_DIR =../../common 2 COM_OBJS = $(SRC_DIR)/addressUtility.o $(SRC_DIR)/dieWithMessage.o
More informationMicrosoft PowerPoint - 02_Linux_Fedora_Core_8_Vmware_Installation [호환 모드]
리눅스 설치 Vmware를 이용한 Fedora Core 8 설치 소프트웨어실습 1 Contents 가상 머신 실습 환경 구축 Fedora Core 8 설치 가상 머신 가상 머신 가상 머신의 개념 VMware의 설치 VMware : 가상 머신 생성 VMware의 특징 실습 환경 구축 실습 환경 구축 Fedora Core 8 설치 가상 머신의 개념 가상 머신 (Virtual
More informationMango-IMX6Q mfgtool을 이용한 이미지 Write하기
Mango-IMX6Q mfgtool 을 이용한이미지 Write 하기 http://www.mangoboard.com/ http://cafe.naver.com/embeddedcrazyboys Crazy Embedded Laboratory www.mangoboard.com cafe.naver.com/embeddedcrazyboys CRZ Technology 1 Document
More informationSpotlight on Oracle V10.x 트라이얼프로그램설치가이드 DELL SOFTWARE KOREA
Spotlight on Oracle V10.x DELL SOFTWARE KOREA 2016-11-15 Spotlight on Oracle 목차 1. 시스템요구사항... 2 1.1 지원하는데이터베이스...2 1.2 사용자설치홖경...2 2. 프로그램설치... 3 2.1 설치프로그램실행...3 2.2 라이선스사용관련내용확인및사용동의...3 2.3 프로그램설치경로지정...4
More informationMicrosoft Word - 임베디드월드_WindowsEmbeddedCompact7_rev
글 : 김재형팀장, MDS테크놀로지 ES사업부 SE팀 www.mdstec.com 진보된기술과화려한사용자환경, 다양한응용프로그램들로무장한 스마트폰쓰나미 가몰려오고있다. 이쓰나미의영향은단지휴대용통신기기에만미치지않고, 주저하던임베디드시스템에도막대한영향을끼치고있다. 하지만임베디드시스템개발자와사용자라면누구나이 스마트폰쓰나미 의시초가임베디드시스템이었음을인정할것이다. 수많은미래지향적아이디어들을현실화하면서새로운
More information슬라이드 1
강력한성능! 인터넷 / 업무용데스크탑 PC NX-H Series Desktop PC NX1- H700/H800/H900 NX2- H700/H800/H900 NX1-H Series 사양 Series 제품설명 ( 모델명 ) NX1-H Series, 슬림타입 기본형모델중보급형모델고급형모델 NX1-H800:112SN NX1-H800:324SN NX1-H800:534MS
More information메일서버등록제(SPF) 인증기능적용안내서 (Exchange Windows 2000) OS Mail Server SPF 적용모듈 작성기준 Windows Server 2000 Exchange Server 2003 GFI MailEssentials 14 for
메일서버등록제(SPF) 인증기능적용안내서 (Exchange 2003 - Windows 2000) OS Mail Server SPF 적용모듈 작성기준 Windows Server 2000 Exchange Server 2003 GFI MailEssentials 14 for Exchange 2016 년 6 월 - 1 - 목 차 I. 개요 1 1. SPF( 메일서버등록제)
More informationLab 3. 실습문제 (Single linked list)_해답.hwp
Lab 3. Singly-linked list 의구현 실험실습일시 : 2009. 3. 30. 담당교수 : 정진우 담당조교 : 곽문상 보고서제출기한 : 2009. 4. 5. 학과 : 학번 : 성명 : 실습과제목적 : 이론시간에배운 Singly-linked list를실제로구현할수있다. 실습과제내용 : 주어진소스를이용해 Singly-linked list의각함수를구현한다.
More informationMicrosoft Word - FunctionCall
Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack
More informationPowerPoint 프레젠테이션
Web server porting 2 Jo, Heeseung Web 을이용한 LED 제어 Web 을이용한 LED 제어프로그램 web 에서데이터를전송받아타겟보드의 LED 를조작하는프로그램을작성하기위해다음과같은소스파일을생성 2 Web 을이용한 LED 제어 LED 제어프로그램작성 8bitled.html 파일을작성 root@ubuntu:/working/web# vi
More information디지털영상처리3
비트맵개요 BMP 파일의이해실제 BMP 파일의분석 BMP 파일을화면에출력 } 비트맵 (bitmap) 윈도우즈에서영상을표현하기위해사용되는윈도우즈 GDI(Graphic Device Interface) 오브젝트의하나 } 벡터그래픽 (vector graphics) 점, 선, 면등의기본적인그리기도구를이용하여그림을그리는방식 } 윈도우즈 GDI(Graphic Device
More informationJVM 메모리구조
조명이정도면괜찮조! 주제 JVM 메모리구조 설미라자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조장. 최지성자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조원 이용열자료조사, 자료작성, PPT 작성, 보고서작성. 이윤경 자료조사, 자료작성, PPT작성, 보고서작성. 이수은 자료조사, 자료작성, PPT작성, 보고서작성. 발표일 2013. 05.
More informationC 프로그래밍 언어 입문 C 프로그래밍 언어 입문 김명호저 숭실대학교 출판국 머리말..... C, C++, Java, Fortran, Python, Ruby,.. C. C 1972. 40 C.. C. 1999 C99. C99. C. C. C., kmh ssu.ac.kr.. ,. 2013 12 Contents 1장 프로그래밍 시작 1.1 C 10 1.2 12
More informationCODESYS 런타임 설치과정
CODESYS 런타임설치과정 CODESYS Control RTE / SoftMotion RTE Setup Web: www.altsoft.kr E-mail: altsoft@altsoft.kr Tel: 02-547-2344 목 차 CODESYS 런타임 - Control RTE, SoftMotion RTE... 2 다운로드및설치과정... 2 CODESYS EtherCAT
More information<B1E2BCFAB9AEBCAD28C0CCB5BFBCF6295F494454486F6F6B696E672E687770>
IDT Hooking을 이용한 Simple KeyLogger 이동수 alonglog@is119.jnu.ac.kr 개 요 커널 Hooking에 관하여 공부하는 중에 IDT Hooking에 관하여 알게 되었다. 이전에 공부하 였던 SSDT Hooking과는 다른 요소가 많다. IDT Hooking을 공부하면서 컴퓨터의 인터럽트 과정을 이해할 수 있는 좋은 계기가
More informationMicrosoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx
To be an Android Expert 문양세강원대학교 IT 대학컴퓨터학부 Eclipse (IDE) JDK Android SDK with ADT IDE: Integrated Development Environment JDK: Java Development Kit (Java SDK) ADT: Android Development Tools 2 JDK 설치 Eclipse
More informationMicrosoft Word - PLC제어응용-2차시.doc
과정명 PLC 제어응용차시명 2 차시. 접점명령 학습목표 1. 연산개시명령 (LOAD, LOAD NOT) 에대하여설명할수있다. 2. 직렬접속명령 (AND, AND NOT) 에대하여설명할수있다. 3. 병렬접속명령 (OR, OR NOT) 에대하여설명할수있다. 4.PLC의접점명령을가지고간단한프로그램을작성할수있다. 학습내용 1. 연산개시명령 1) 연산개시명령 (LOAD,
More informationLab 4. 실습문제 (Circular singly linked list)_해답.hwp
Lab 4. Circular singly-linked list 의구현 실험실습일시 : 2009. 4. 6. 담당교수 : 정진우 담당조교 : 곽문상 보고서제출기한 : 2009. 4. 12. 학과 : 학번 : 성명 : 실습과제목적 : 이론시간에배운 Circular Singly-linked list를실제로구현할수있다. 실습과제내용 : 주어진소스를이용해 Circular
More information1. 도구개요 STAF Testing 소개 각테스트대상분산환경에데몬을사용하여테스트대상프로그램을통해테스트를수행하고, 통합하며자동화하는 프레임워크 주요기능 테스트통합및자동화 카테고리 Testing 세부카테고리테스트설계및실행 커버리지 Test Integration / Aut
1. 도구개요 소개 각테스트대상분산환경에데몬을사용하여테스트대상프로그램을통해테스트를수행하고, 통합하며자동화하는 프레임워크 주요기능 테스트통합및자동화 카테고리 세부카테고리테스트설계및실행 커버리지 Test Integration / Automation 도구난이도상 라이선스형태 / 비용 Eclipse Public License / 무료사전설치도구 JDK 운영체제 Windows,
More information11장 포인터
누구나즐기는 C 언어콘서트 제 9 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 변수와메모리
More informationMicrosoft Word doc
2. 디바이스드라이버 [ DIO ] 2.1. 개요 타겟보드의데이터버스를이용하여 LED 및스위치동작을제어하는방법을설명하겠다. 2.2. 회로도 2.3. 준비조건 ARM 용크로스컴파일러가설치되어있어야한다. 하드웨어적인점검을하여정상적인동작을한다고가정한다. NFS(Network File System) 를사용할경우에는 NFS가마운트되어있어야한다. 여기서는소스전문을포함하지않았다.
More information