Media Log

PAGED_CODE 매크로

2011/02/27 19:09 | Programming
PAGED_CODE 는 다음과 같이 생긴 간단한 매크로이다.
#define PAGED_CODE() { \
    if (KeGetCurrentIrql() > APC_LEVEL) { \
        KdPrint(("EX: Pageable code called at IRQL %d\n", KeGetCurrentIrql())); \
        PAGED_ASSERT(FALSE); \
    } \
}
현재 IRQL을 체크해보고 IRQL이 APC_LEVEL 보다 높다면 시스템을 종료시킨다.

디바이스 드라이버는 유저 모드 프로그램들과는 다르게 텍스트 영역이 페이지 파일로 빠져나가지 않도록 설정된다. 즉 코드가 기본적으로 nonpaged 영역에 할당된다.
Making Drivers Pageable

물론 드라이버 프로그래머에게는 이를 제어할 수 있는 방법 또한 주어지며 코드나 데이터를 페이징 가능하도록 설정 할 수도 있다. #pragma alloc_text나 #pragma data_seg 디렉티브를 사용하면 컴파일 타임에 코드나 데이터들에 대한 페이징 여부를 결정할 수 있다.

드라이버 내의 특정 함수들을 페이징 가능하게 만들고 싶다면 다음처럼 쓴다.
#pragma alloc_text(PAGE, functionName)
이 구문은 해당 함수의 선언보다는 아래에 있어야 하고 정의보다는 위에 있어야 한다. 보통 c 모듈에서 헤더들을 include 한 뒤 그 바로 아래에 쓴다.

#pragma alloc_text 는 코드가 올라갈 섹션을 지정하는데, 섹션이란 PE 파일이 가지고 있는 바로 그 섹션을 뜻하며 위와 같이 쓰면 해당 PE파일에 PAGE라는 이름의 섹션이 새로 추가된다.
그리고 I/O 매니저는 드라이버 이미지를 로드할 때 이미지 내의 섹션 이름 중 앞의 4글자가 PAGE 또는 .EDA 가 있는지 찾아보고 있다면 해당 섹션을 paged pool에 넣어버린다.
이제 해당 코드는 시스템에 의해서 필요없을 땐 언제라도 페이지 파일로 빠져나가게 될 것이다.

디바이스 드라이버의 세계에서 중요한 규칙중 하나는 IRQL이 Dispatch 레벨 이상일 때는 페이지 폴트가 일어나서는 안된다는 것이다. IRQL >= DISPATCH_LEVEL 일 때 페이지 폴트가 일어나게 되면(페이지 폴트 뿐만아니라 다른 어떤 소프트웨어 예외라도 일어나게되면) 시스템은 크래시된다.

위 규칙을 알고 나면 #pragma alloc_text를 이용해서 코드를 페이징 가능하게 만들었을 경우에, IRQL이 DISPATCH_LEVEL 이상인 상태에서 해당 함수가 불릴 경우 페이지 폴트가 발생해서 블루스크린이 발생할 수도 있다는 것을 알 수 있다. 따라서 IRQL이 높을 때 불릴 수 있는 함수들은 paged pool에 할당해서는 안된다. 그런데 운이 좋아서 해당 시점에 코드가 램에 잘 존재하고 있어서 페이지 폴트가 일어나지 않는다면 이는 버그를 감추어주게 되고 나중에 더 골치아픈 문제를 가져다준다.

페이징 가능한 함수들에 PAGED_CODE 매크로를 사용하면 이런 운에 의해 감추어지는 버그들을 없애 버리고 곧장 시스템을 크래시 시켜 버림으로서 문제가 있는 부분을 쉽게 찾아낼 수 있다.
그래서 페이징 가능한 모든 코드에는 함수의 시작부에 PAGED_CODE() 매크로를 사용하는 것이다.

위에서 말한 내용들이 너무 복잡하다면 다음 규칙만 외워서 따라해도 좋다.
#pragma alloc_text를 사용했다면 짝이 맞는 함수를 찾아가 시작부분에 PAGED_CODE 매크로를 써준다.
이 둘을 항상 짝으로 같이 다니게 하면 된다.(둘다 있거나 둘다 없거나)

여기까지 읽었으면,
"빌어먹을, 코드이든 데이터이든간에 무조건 nonpaged pool에 할당하는게 편한 것 아닌가?"
하는 생각이 드는게 정상일 것이다. 물론 그렇게 하면 프로그래머는 좀 더 편해지겠지만, 오랫동안 사용되지 않고 있는 코드와 데이터들이 계속 물리 메모리를 점유하고 있기 때문에 시스템의 성능을 떨어뜨릴 수 있다. 특히 넷북같은 꼬물 컴퓨터에서는 더 많은 영향을 끼칠 것이다.
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

'Programming' 카테고리의 다른 글

_countof 매크로  (0) 2011/03/15
FIELD_OFFSET 매크로  (0) 2011/03/01
PAGED_CODE 매크로  (0) 2011/02/27
디렉터리의 읽기 전용 속성  (4) 2011/02/20
알쏭달쏭한 typedef  (7) 2011/01/04
하위 디렉터리의 파일이 변경 되었는지 감지하는 법  (5) 2010/12/20

http://www.benjaminlog.com/trackback/181 관련글 쓰기

submit
디렉터리의 읽기 전용 속성은 약간 특별하다.

윈도우 탐색기에서 디렉터리에 읽기 전용 속성을 지정하는 것은 그 디렉터리가 가진 하위 파일들(디렉터리는 제외하고)에 대한 속성을 지정하는 것이지 해당 디렉터리의 속성을 바꾸는 것은 아니다.

예를 들어, 윈도우 탐색기에서 속성창을 켜서 디렉터리의 읽기 전용 속성을 체크하고 하위의 모든 파일에 적용을 선택한다면, 해당 디렉터리의 하위와 그 모든 서브 디렉터리가 가진 파일(디렉터리가 아니라)들의 속성을 업데이트 한다. 디렉터리는 전혀 업데이트 되지 않는다.
'현재 폴더에만 적용'을 선택한다면, 해당 디렉터리의 속성을 바꾸는 것이 아니라 해당 디렉터리 바로 하위의 파일들에 대해 속성을 적용한다는 뜻이다.

비록 윈도우 탐색기에는 디렉터리의 읽기 전용 속성을 셋팅 시켜줄 수 있는 인터페이스가 없지만, 윈도우 Api(SetFileAttributes, SetFileInformationByHandle)를 사용해서 디렉터리의 읽기 전용 속성 플래그(FILE_ATTRIBUTE_READONLY)를 셋팅 시켜 줄 수는 있다. 단, 그렇게 하더라도 그것이 해당 디렉터리를 읽기 전용으로 만든다는 뜻은 아니다.
디렉터리의 읽기 전용 속성이 켜져있는 것은 윈도우 탐색기에게, 나는 특별히 커스터마이징 된 폴더이니 내 안의 desktop.ini를 열어서 읽어보고 거기에 적혀진대로 나를 꾸며줘(폴더 아이콘 따위들) 라고 말하는 것이다.

몇몇 잘못 만들어진 애플리케이션들은 디렉터리가 읽기 전용이면 삭제하지 않도록 코딩 되어져 있을 수도 있지만, 그것은 애플리케이션 구현의 오류이다.

디렉터리의 시스템 속성(FILE_ATTRIBUTE_SYSTEM) 또한 읽기 전용 속성과 같은 의미를 지닌다.
즉, 디렉터리에 대해서 읽기 전용이나 시스템 플래그가 둘 중 하나라도 켜져 있다면, 윈도우 탐색기는 그 디렉터리가 가진 desktop.ini를 스캔 한다.

이것은 응용 프로그래머들이나 네트워크 파일 시스템 프로그래머들에게 중요한 정보를 전달한다.
  • 디렉터리의 읽기 전용 속성을 잘못 이해한채 응용 프로그램을 이상한 방식으로 구현하지 말 것.
  • 읽기 전용 속성이 켜있으면 탐색기가 desktop.ini를 열어보려 시도하는데, 네트워크 리디렉터 같은 경우에는 이것이 성능에 상당한 영향을 끼칠 수도 있음을 숙지하고 있을 것.

이 글의 주제와는 상관이 없지만 다음 내용 역시 읽어볼만하며 재미있다.
디렉터리와 폴더의 차이점.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/180 관련글 쓰기

  1. 윈도우개발자 at 2011/02/20 15:37 [edit/del]

    오 그렇군요!
    말씀하신 것처럼 잘못 코딩한 적은 없었지만, 앞으로 잘 알고 있어야겠네요 ^_^;

    Reply
  2. 박태환 at 2011/02/23 13:53 [edit/del]

    재호씨 잘 지내시죠??블러그 잘 보고 갑니다. 가끔 놀러올께요^^

    Reply

submit
내몸 젊게 만들기 - 10점
마이클 로이젠.메멧 오즈 지음, 유태우 옮김/김영사
새 해가 되면 올해는 뭘 해야지 하고 이런 저런 계획을 세운다.
늘 그 계획에는 무슨 책들을 읽을껀지 무슨 공부를 할껀지가 주된 내용이였는데, 올해는 그런 것들을 한발짝 뒤로 하고 건강을 최우선 목표로 잡았다.

작년 말 쯤에 읽었던 한 책이 내 마음을 변화시켰는데, 이승윤이라는 개그맨이 쓴 웰컴 투 식스팩이라는 책이었다.
웰컴 투 식스팩 - 10점
이승윤 지음/타임POP

도서관에서 보이길래 심심풀이 땅콩으로 집어든 책이었는데, 글을 유머스럽게 잘써서 아주 재밌게 읽기도 했지만 그가 얼마나 독하게 마음먹고 운동했는지가 내 마음속에 고스란히 전달되어서 많은 자극을 받았다.
책 내용 중에 남자로 태어나서 제대로 몸 한번 못 만들어보고 죽는다는 것은 부끄러운 일이라는 내용이 있었는데 많은 공감을 했다.
그 때부터는 진지하게 내 몸의 건강에 관심을 갖기 시작했고 운동도 열심히 하고 있다. 덕분에 살이 7kg나 쪄서 아주 기분이 좋다.

마이클 로이젠은 꽤 유명한 의사인데, 잘 알고 있는 사람이 썼기 때문에 이 책에 나오는 내용들은 믿을만하다. 그는 이 책 외에도 내 몸 사용 설명서, 내 몸 아름답게 만들기, 내 몸 다이어트 설명서 등의 책을 쓰기도 하였다.

책을 읽으면서 앞으로 잊지않고 기억하고 싶은 것들을 정리해보았다.

  • 물은 내 몸의 혈관과 장기들에 대한 최고의 선물이다. 하루에 7잔 이상 먹는다.
  • 살면서 돈을 아끼지 말아야할 것이 3가지 있다. 베개와 침대 매트리스 그리고 부엌칼이다.
  • 포도를 많이 먹어라.(남자에게 좋다)
  • 생선을 많이 먹어라. 뇌가 좋아진다.(오메가-3) 특히 연어와 청어.

심장에 좋은 음식
과일 및 야채 - 포도 크렌베리, 토마토, 양파, 그리고 토마토주스 같은 과일 및 야채에는 플라보노이드와 카로티노이드라는 항산화성분이 들어있다. 색깔이 있는 자연식품에 많이 존재하는 플라보노이드와 카로티노이드는 비타민과 유사한 물질로, 활성산소로 인산 손상을 줄이고 소변을 통한 배출을 촉진해 염증을 낮춘다.
마늘 - 논란의 여지가 있긴 하지만 하루에 한 쪽의 마늘을 섭취하면 혈액이 묽어지고 혈압을 낮춘다. 마늘 냄새가 문제라면 알약 형태로 섭취할 수도 있으나 냄새가 땀으로 배어나오기도 한다. 하루에 마늘의 주성분인 알리신을 400밀리그램 정도 섭취하는 것이 좋다.
올리브 오일- 특히 엑스트라버진은 식물성 영양분을 많이 함유하고 있어 몸에 좋은 HDL을 높여준다. 따라서 하루에 섭취하는 지방 중 25퍼센트는 올리브오일처럼 건강에 좋은 지방으로 구성해야 한다.
오메가-3 지방산. 생선이나 해초에 많이 함유된 이 영양소는 혈관을 수리하는 팔방미인이다. 우선 혈액 속의 중성지방 수치를 낮추고심장 발작 이후의 부정맥 위험을 감소시킨다. 또한 혈압을 낮추고 혈소판의 점성을 줄여 응고를 막는다. 일주일에 3회 이상 생선을 섭취하라. 가장 좋은 식단은 연어, 메기, 가자미, 송어 등의 등푸른 생선으로 구성된 것이다.
마그네슘- 100퍼센트 통밀빵과 시리얼, 콩, 아욱콩, 아보카도, 사탕무, 건포도 등에 많으며 동맥을 확장시켜 혈압을 낮추고 부정맥을 줄여준다. 마그네슘은 하루에 400밀리그램을 섭취하는 것이 좋은데 아욱콩 한 접시에는 100밀리그램, 시금치 반 컵에는 80밀리그램, 30알의 땅콩에는 50밀리그램이 들어있다.
콩단백질 식품 - 두부나 기타 콩을 재료로 만든 식품을 섭취해 하루 25그램의 콩단백질을 먹으면 LDL과 중성지방 수치를 낮출수 있다.
스태놀과 스테롤- 식물성 콜레스테롤로 혈액 속의 LDL과 대체되어 혈관을 건강하게 해준다.
다크초콜릿 - 최근의 연구에 따르면 다크초콜릿은 고혈압에 좋은 약의 효과만큼이나 혈압을 낮추며 HDL을 높이고 LDL을 낮춘다고 한다.

아래는 면역체계에 좋은 것들이다. 이런 것들을 많이 먹어야 병에 잘 안걸린다는 뜻이다.

의사 수준까지는 아니더라도 어느 정도 자신의 몸을 이해하고 있으면 살면서 이로운 일들이 셀 수 없이 많이 생길 것이다. 우리가 빨리 이 책의 시리즈를 사서 읽어야 할 이유이다.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/179 관련글 쓰기

  1. 내몸 아름답게 만들기 -마이클 로이젠
    // 김재호의 디지털보단 아날로그 2011/03/29 10:32 x
  1. 재호님 팬 at 2011/02/10 13:39 [edit/del]

    재호님 안녕하세요!
    궁금한게 있는데, 포스팅 하실때 어떤 그래픽 편집툴 쓰시는건가요?
    공부내용 정리할때 이용하려고 하는데 이왕이면 이쁘게 정리하려구요..

    Reply
    • Favicon of http://www.benjaminlog.com BlogIcon 김재호 at 2011/02/10 17:27 [edit/del]

      위에 있는 테이블 그림은 워드 2010에서 만들어서 이미지로 붙여넣었어요. 그림 그리는 툴들을 워낙 못 다뤄서 거의 텍스트로만 정리하는데, 꼭 필요한 경우에는 파워포인트 2010 으로 대충 그립니다. 그런데 파워포인트보다는 다른 좋은 벡터 편집툴 사용하시는게 나을 꺼에요.

  2. 재호님 팬 at 2011/02/11 09:56 [edit/del]

    네.. 감사합니다. ^^

    Reply
  3. one at 2012/01/15 10:11 [edit/del]

    마늘 한쪽이 마늘 몇알인가요

    Reply

submit