Soft Ware/Windows Driver 11

디스패치 오브젝트 중 세마포어 오브젝트와 타이머 오브젝트에 대해서 !!!

뮤텍스 오브젝트는 특정한 스레드만 획득 할수 있었다면 세마포어 오브젝트는 하나 이상의 스레드가 동시에 공유된 자원을 사용 할 수 있도록 허락 합니다 ^^ 그럼으로서 드라이버는 뮤텍스 오브젝트와 달이 얼마나 많은 스레드가 동시에 세마포어 오브젝트를 얻을 수 있는지를 제어 할수 있습니다 . 세마포어 초기 함수를 보면 VOID KeInitializeSemaphore(IN PRKSEMAPHORE Semaphore, IN LONG Count, IN LONG Limit) 여기서 Count 는 커널에서 얼마나 많은 스레드가 세마포어 오브젝트를 사용할수 있는지를 Limit는 동시에 사용할수 있는지를 나타낸다 . ------------------------------------------------------------..

디스패처 오브젝트 중 뮤텍스 오브젝트

뮤텍스 오브젝트는 공유 자원을 사용 하기 위해 경쟁 상태에 있는 스레드들의 동기화를 위한 방법을 제공 한다 . 뮤텍스 오브젝트는 하나의 스레드만이 주어진 시간에 공유 된 자원을 접근할수 있다고 하네요 ^^ 뮤텍스 와 스핀 록의 차이점으로는 1. 뮤텍스는 특정한 스레드 컨텍스트에서만 획득할수 있습니다. 즉 그말은 해제할때고 특정한 스레드 컨텍스트에서만 해제 할수 있다는 말이죠 ㅎㅎ 2. 뮤텍스 오브젝트에 대한 제어를 얻으면 커널은 발생할수 있는 데드록을 피하기 위해 특별한 커널 APC 이외에는 다른 어떤 APC도 전달 되지 않도록 처리합니다 3. 모든 뮤텍스는 뮤텍스 오브젝트를 사용하기 전에 현재 사용중인 뮤텍스 보다 더 낮은 레벨이어야 만 합니다 . 4. 뮤텍스 오브젝트는 획득 한 순서대로 정확히 해제 ..

디스패처 오브젝트 중 이벤트 오브젝트

앞절에서 말한 디스패처 오브젝트 중에는 이벤트 , 뮤텍스, 세마포어 등이 있습니다 . 우선 이벤트 오브젝트 부터 알아 볼건데요 ㅎㅎ 이벤트 오브젝트는 여러 스레드들 사이에서 코드 실행의 동기화를 위해 사용되는데요 이게 무슨말이냐면요 예를 들어보겠습니다 스레는 A는 드라이버에서 사용할 데이터를 생성하고 그 데이터를 현재 사용하고 있습니다 . 스레드 B는 스레드 A가 사용중인 데이터를 사용하기 위해 데이터를 사용할수 있을때를 기달리는데요 스레드 A가 데이터의 사용을 끝났을때 이벤트 오브젝트를 사용하여 스레드 B에 데이터를 사용할수 있도록 알려준다고 하네요 ^^ 이벤트 오브젝트는 통지 이벤트 오브젝트 와 동기화 이벤트 오브젝트가 있는데요 1. 통지 이벤트 오브젝트는 자동으로 Non-Signaled 상태로 다시..

디스패처 오브젝트 !!

디스패처 오브젝트의 기본적인 속성은 Signaled 와 Non-Signaled 상태 중 하나를 가진다 Signaled 상태는 디스패처 오브젝트가 보호 하고 있는 데이터를 사용하는 스레드가 하나도 없으며 코드 의 임계 영역에 있는 디른 스레드 역시 하나도 없는 상태를 말한다. Non - Signaled 상태는 디스패처 오브젝트가 보호 하고 있는 데이터를 사용하고 , 코드 임계 영역에서 실행되고 있는 스레드가 있다는것을 말한다. 또한 드라이버는 디스패처 오브젝트를 사용하기 위해서는 페이징이 불가능한 영역에 오브젝트 변수를 선언해야 한다고 하네요 ㅎㅎ 하나의 스레드가 공유된 데이터를 사용할 필요가 있다면 KeWaitforSingleObject() 함수 와 KeWaitForMultipleObject(), KeW..

인스택 큐 스핀 록에 대해서 ~~!!

인스택 큐 스핀 록은 익스큐티브 스핀 록의 단점을 보안 하고자 나온 스핀 록이다 . 자 그럼 익스큐티브 스핀 록 에 단점에 대해서 알아 봐야 겠죠? ㅎㅎ 그래야 이해 하기 쉬우니깐요 ㅎㅎㅎㅎ 익스큐티브 스핀 록은 서로 경쟁 상태에 있는 프로세서가 스핀 록을 얻기 위해 같은 메모리 영역을 계속 수정해야 하며, 메모리 영역을 수정하게 되면 스핀 록을 얻고자 하는 프로세서는 동일한 캐시 라인을 반복해서 메모리로 가져와야 합니다. 즉 cpu가 메모리로부터 데이터를 가져올때 32바이트,64,128바이크 크기의 캐시 라인을 가져 오는데요 캐시 라인은 성능 향상을 위해 존재하는것이지만 멀티스레드 환경에서는 메모리의 갱신을 어렵게 합니다. 그 이유는 하나의 CPU 코어에서 읽어들인 캐시 라인 데이터를 변경하는 시점에서..

익큐티브 스핀 록에 대해서 ~~~

익스큐티브 스핀 록은 드라이버에서 가장 많이 사용되는 스핀 록으로서 주로 데이터 구조체를 보호하기 위해 사용된다고 하네요 ^^ 익스큐티브 스핀 록은 디스패치 레벨이하에서 실행 되는 스레드만이 획득 가능하구요. 익스큐티브 스핀 록을 사용하기 위해서는 스핀 록 구조체를 위한 변수를 선언 해야 하며 이 변수는 전역 변수나 페이징이 불가능한 Device_Extension 구조체 내에 스핀 록 변수를 선언 해야 합니다 ^^ 스핀 록을 획득 하기 위해서 스핀 록 변수를 초기화 해야되는데 초기화 함수로는 KeInitializeSpinLock()함수를 사용하여 처리하고 사용하기 위해서는 KeAcquireSpinLock() 함수를 호출 합니다 ^^ KeAcquireSpinLock() 이 함수는 IRQL를 조사 하여 스레..

스핀록에 대해서 ~~

스핀 록은 상호배제를 형태로 제공되는데요 상호 배제란 하나의 스레드가 자원을 소유하고 사용하고 있으면 그 자원을 사용하는 다른 스레드는 자원을 쓰고 있는 스레드가 자원을 반납했을시 그 자원을 쓸수 있다는 방식입니다 ^^ 자 그럼 자원을 기다리는 스레드는 자원을 기달리는 동안 무슨일을 할 까요?ㅎㅎㅎ 자원을 기달리는 스레드는 검사와 설정 과정을 반복 하면서 스핀락을 획득할려고 합니다 ^^ 이처럼 자원을 획득할때까지 검사와 설정과정을 반복하면서 어떤 동작도 실행하지 않는것을 비지 웨이팅(busy-Waiting)이라고 하네요 ^^ 스핀락을 원리와 사용시에 항상 같이 나오는 놈이 있는데요 바로 데드락 이라는 놈이죠 ^^ㅋㅋ 데드락은 멀티 프로세서에서 하나의 프로세서에서 하나의 스레드가 자원A를 획득하고 다른 하..

디바이스 정리

디바이스 드라이버 의 개념 및 정리 드라이버들은 자신들을 나타낼수 있는 Device_Object를 만든다. 그 Device_Object는 구조의 형식은 그 틀이 정해져 있다. 틀이 정해져 있으면 무슨 문제가 있을까? 한번 생각봐야겠다. 그럼 내가 더 필요한 정보를 삽입할수 없다는 문제점이 있네요.. 그래서 그 방법을 해결하기 위해서 Device_Object 구조체를 살펴 보면 .... Device_Extension이라는 포인터 변수가 있다 +.+ 이 녀석이 무엇을 하는 녀석인가 하고 보면 위의 문제점을 해결해 줄수 있는 녀석이였다 !!!!. 그 녀석을 따라가면 메모리 공간이 있다 바로 거기가 사용자가 사용할수 있는 공간이다 !!!.. 이해가 안되시죠? 저도 많이 힘들었습니다. 머리로 그릴려고 계속 해도 ..

윈도우 디바이스 드라이버 & Simple

- SIMPLE_DriverUnload() - - SIMPLE_Unload() 가 호출된다는것을 SIMPLE 드라이버가 생성한 Device_Object가 메모리에 없다는 뜻이다. 이시기에는 Driver_Object만을 드라이버에 전달 가능 - 드라이버는 이 구조체 안(Driver_Object)에 츨정 필드를 적당한 값으로 채워줘야한다 - RegistryPath는 SIMPLE 드라이버가 등록되어 있는 시스템 레지스트리 상에 키값을 담고 있다. - 디바이스 드라이버는 자신을 메모리에 로딩하면서 여러가지 선택적인 작업을 할수있다, 이것은 이와 같은 레지스트리 키가 제공 되며, 이 키 아래에 하위키로 여러가지 파라미터를 개발자가 보관해 두며 드라이버는 로딩되는 과정중에서 레지스트리 키에 접근해 파라미터를 읽어서..

윈도우 디바이스 드라이버 & Simple

- SIMPLE_PnpDispatch() - - 이 함수는 윈도상의 pnp 관리자 모듈이 SIMPLE 드라이버에게 pnp 사건이 발생 될때마다 이를 통지하는 역할로 사용 - pnp 관리자 : 사용자 모드 컴포넌트의 도움을 받아 디바이스 의 드라이버를 식별 - 여기서 인자값 DeviceObject는 이전에 SIMPLE_AddDevice함수에서 SIMPLE 드라이버가 만들어서 디바이스 스택에 올렸던 바로 그 Device_Object가 여기에 해당 - IRP는 내부적으로 자료구조 스택과 같은 형태의 메모리를 가진다. - pStack 은 현재 스택의 Top 포인터가 가르키는 메모리 주소를 가져와서 보관 - IoGetCurrenIrpStackLocation() 함수는 IRP 내의 스택 메모리를 찾아서 현재 TOP..