헷갈렸던 부분인데 어디에도 명확하게 얘기해주지를 않네요. 얼마전 정확하게 정의해주는 곳을 찾아서 복사해 왔습니다. 



[ DLL 의 메모리 상주] 


흔히 얘기하기를 "DLL은 메모리에 한 번 올라가면, 이 DLL을 공유하는 프로세스가 모두 종료될 때까지 메모리에 존재한다" 고 한다.

상당히 애매하지 않나? 메모리라니? 가상 메모리? 물리 메모리? 명확하지 않네.

프로세스가 DLL을 로드한다는 것은 프로세스 가상 메모리에 DLL이 맵핑되었음을 의미하는 것이다.

위의 메모리 효율에서도 설명하였지만 이것이 물리 메모리 페이지에 어떠한 형식으로 남아 있는 것인지의 양상은 다르지만,

해당 프로세스가 종료되면 프로세스의 가상 메모리에서 라이브러리 또한 같이 소멸된다.

프로세스의 가상 메모리라는 것은 말 그대로 프로세스 소유의 가상 메모리이다. 즉, 프로세스별 독립적으로 존재하는 영역인 것이다.


다시 얘기해 "DLL은 물리 메모리에 한 번 올라가면, 이 DLL을 공유하는 프로세스가 모두 종료될 때까지 물리 메모리에 존재한다" 라고 해야 한다.


다음과 같은 단계를 거쳐 이해를 해 보자.

1. 프로세스 A가 실행되며 X.dll을 로드한다. 
    따라서 X.dll은 A의 가상 메모리 영역에 맵핑되면서 물리 메모리에 할당된다.

2. 프로세스 B가 실행되며 X.dll을 로드한다.
   이미 1단계에서 X.dll이 물리 메모리에 올라 있으므로 그대로 참조할 수 있도록 프로세스 B의 가상 메모리 영역에 맵핑만 한다.

   이 상황에서 유의할 것이 X.dll 이 할당된 가상 메모리 주소이다. 프로세스 A와 B가 동일한 주소에 할당한다.

 

   이것이 DLL 공유가 가능한 이유이다. 다시 말해서 두 프로세스가 동일한 DLL을 동일한 가상 주소에 맵핑했기 때문에,
   페이지 단위로 공유가 가능하다는 것이다.

3. 프로세스 A가 종료되었다. 그러나 B가 종료되지 않았기 때문에,
    X.dll은 여전히 물리 메모리에 남아있다.

4. 프로세스 B가 종료되었다. 이제 X.dll을 참조하는 프로세스가 하나도 존재하지 않기 때문에 X.dll도 할당된 물리 메모리에서 반환된다.


[ 중복 Loading] 

처음 DLL이 빌드될 때 DLL이 할당되어야 할 가상 메모리 주소가 Linker에 의해 결정된다.

 

만약 X.dll을 0x20000000 번지에 맵핑하기로 한다면, 모든 프로세스는 0x20000000 번지에 X.dll의 주소를 맵핑시킨다.

헌데 아래 상황을 한 번 살펴보자.

1. 프로세스 A가 X.dll을 로드하면서 가상 메모리 주소 0x10000000에 맵핑하였다.

2. 프로세스 B가 Y.dll을 로드하면서 가상 메모리 주소 0x10000000에 맵핑하였다.

3. 프로세스 B가 X.dll을 로드하게 되면, 이미 0x10000000에 Y.dll이 존재하고 있으므로,다른 주소의 메모리 영역에 X.dll을 올리게 된다. 

위와 같은 상황이 발생하면 두 개의 X.dll이 물리 메모리에 올라가게 된다. 즉, DLL도 물리 메모리에 중복적으로 올라갈 수 있음을

기억하자.

'OS > windows 여러가지' 카테고리의 다른 글

LG XTIC USB부팅영역만들기 도구  (0) 2011.08.03
[유틸] ShellcodeExec  (0) 2011.08.01
[유틸] exe to TXT  (0) 2011.08.01
[유틸]bat to exe  (0) 2011.08.01
VMware 아무나 모르는 인터페이스 연결방식의 원리  (0) 2011.06.03
AND

sshd_config 에 

Usedns 옵션을 no로 한다. 주석풀고.



수세 :  /etc/init.d/sshd restart

레드헷 : service sshd restart

freebsd : /etc/rc.d/ssh restart 

AND


/etc/network/interfaces  수정

auto eth0 
iface eth0 inet static
address IP주소
netmask 마스크주소
gateway gw주소

/etc/resolv.conf 생성후 수정
nameserver 168.126.63.1


#sudo /etc/init.d/networking restart

 
AND

윈도우는 기본적으로 시스템에 접속로그가 남지 않는다.!!!

ndows에서는 내부적으로 엄청나게 많은 일들이 일어나게 되는데, 이를 사용자가 파악하기란 불가능합니다. 물론 Windows라는 운영체제에만 국한되는 것은 아닙니다. 그렇기 때문에 컴퓨터에서 일어나는 ‘중요한 이벤트’들은 자동적으로 기록되도록 하는 것이지요. 그러나 기록되는 로그 역시 역시도 일부에 지나지 않습니다.

Windows의 로그 파일들대부분의 사용자들은 Windows가 정상적으로 작동하지 못하는 경우, 단순히 출력되는 오류 메시지만을 가지고 해결하려고 하는데요. 이미 알려진 오류로써 이슈가 된 경우라면 비교적 쉽게 해결이 가능합니다만, 그렇지 않다면 마이크로소프트의 문서들을 참조해서 해결을 해야 합니다. 

이벤트 오류는 보고되는 메시지 자체로도 쉽게 해결이 가능한 경우도 있습니다만, 실제적으로 Windows에 대한 많은 지식이 있지 않다면, 메시지가 무엇을 의미하는지 파악하기가 힘든 경우도 있습니다. 그러나 파워유저라면 기본적인 로그들이 무엇인지는 알고 있어야 할 것입니다.


자주 접할 수 있는 기본 로그들

전역 로그 - 응용 프로그램, 시스템, 설치, 보안과 함께 전달된 이벤트 로그(orwardedEvents)를 포함하는 것으로써 이벤트 뷰어의 보기(View)에서 관리 이벤트 상에 나타나는 로그를 칭합니다. 전체 로그를 카테고리 분류 없이 일목요연하게 발생시간 별로 나열해 주게 됩니다.

응용 프로그램 로그 - Windows 번들 소프트웨어를 비롯해서 사용자의 어플리케이션의 이벤트를 저장합니다. 사용자가 구입한 어플리케이션들의 경우 설치는 물론 작동 시에도 로그가 기록 되도록 개발된 것이 좋은 어플리케이션이라고 할 수 있습니다. 

보안 로그 - 이 로그는 보안 관련된 이벤트 로그만을 기록합니다. 보안 관련된 프로그램의 동작을 모니터링하면서 그 외에도 Windows 로그온, 네트워크 등 다양한 보안 로드들이 기록됩니다.

설치 로그 - 어플리케이션 설치 시 발생하는 이벤트를 기록합니다. 프로그램이 잘 설치되었는지 그리고 호환성문제가 일어나지 않는지 이 기록을 보면 알 수 있습니다.

전달된 이벤트(ForwardedEvents) 로그 - 로컬 컴퓨터의 이벤트뿐만이 아닌 원격 컴퓨터에서 전달된 이벤트도 수집이 가능합니다. 이를 이용하면, 로그만을 기록하는 전용 컴퓨터, 로그 서버도 가능합니다. 사고 시에를 대비해서 로그는 별도의 컴퓨터로 구성하는 것이 좋습니다.


이벤트 로그가 기록되는 경로와 로그 확장자

로컬 컴퓨터의 경우 로그 파일이 저장되는 경로는 아래와 같습니다.
%systemroot%system32\winevt\Logs이고 확장자는 evtx를 사용하며, dir 명령어 파일 목록을 확인하면 아래와 같은 파일들을 보여주게 됩니다.

appliacation.evtx = 응용 프로그램 로그파일
system.evtx = 시스템 로그파일
setup.evtx = 설치 로그파일
security.evtx = 보안 로그파일


로그 파일 유틸리티 wevtutil (Windows Event Viewer Utility)

wevtutil는 Windows가 제공하는 명령줄 도구입니다. 이를 이용하면 로그 파일을 관리할 수 있습니다. 아래는 어플리케이션 로그를 삭제하려는 ‘명령 샘플’입니다.
(wevtutil에 대한 좀 더 자세한 사항은 usages 차원에서 자세히 다루겠습니다.)

wevtutil cl application
;위에 명령은 응용 프로그램 로그파일의 내용을 비우므로 로그 삭제와 동일합니다. 배치파일을 이용해서 동시에 여러 개의 로그파일도 삭제할 수 있습니다. 예를들면 ‘clear_all_log.bat’을 아랴와 같이 작성합니다.

type clear_all_log.bat
wevtutil cl application
wevtutil cl setup
wevtutil cl security
wevtutil cl system

간단하게 이벤트 로그에 대해서 살펴보았지만 시스템 관리자나 서버 관리자 수준에 도달하려면 vbs와 같은 스크립트를 언어를 통해서 이러한 시스템 관리 전용 스크립트를 직접 개발하거나 잘 다룰 줄 알아야 할 것입니다.
AND

EEPROM 과 NVRAM 의 차이

작성자 : 유창훈(dbckdgns0515@hotmail.com)

 

먼저 EEPROM과 NVRAM의 구조를 그림으로 살펴보도록 하자


 

솔라리스의 부팅 프로세스 순서는 다음과 같다.

1. PROM

.1 POST

.2 BOOT-device 동작

.3 BOOT block LOAD

2. Boot Program usfboot = kernel 의 시작 함수 호출

3. Kernel초기화( 모듈로드)

4. init process동작

 

여기서 1. PROM 과정을 수행하는 도중 PROM에서 NVRAM으로 어떤 정보가 넘어가는지 살펴보도록 하자.

 

전원을 켜고 POST 과정을 수행한다.

이후 부팅과정에 필요한 하드웨어적인 셋팅값들을 NVRAM안에 EEPROM으로 던져준다.

(POST코드가 EEPROM으로 넘어가는지 여부와 Device driver코드가 어떤식으로 적용되는지궁금하다. 아시는분은 메일로답변부탁바랍니다.)

 

NVRAM은 x86/64 머신의 CMOS와 같다고 생각하면된다.

NVRAM의 구성은 위와 같고 Time of day clock 값과 NIC, HOST ID정보는 하드웨어적으로 초기값이 저장되어 공장에서 나온값이다. 이를 사용자가 setenv 과 같은 명령어로 바꾸게 되면 EEPROM에 변경된 값이 저장되어 있다.

가끔 NVRAM의 리튬 베터리가 방전되면 삑삑거리며 에러를 발생시키는걸 볼 수 있는데, 이때 EEPROM의 안에 값들은 NVRAM이 가지고있는 공장초기값들로 변경된걸 볼 수있다.

추가) HOST ID는 NVRAM칩에 내장된 하드웨어 고유의 식별값으로써, 라이센스 방식의 소프트웨어 패키지에서 HOST ID를 기준으로 라이센스를 발급한다.


AND

터미널에서

$ sudo apt-get install gisomount

gisomount를 설치한다.
프로그램-시스템메뉴-gisomount 를 실행시키면


위 그림 프로그램이 실행된다.
브라우저를 눌러서 iso 이미지를 선택 후 'Monut'를 누르면
iso 마운트 끝!!


AND

sudo update-rc.d -f gdm remove (그래픽 모드에서 콘솔부팅) 

sudo update-rc.d gdm defaults    (그래픽 모드 부팅으로 다시 바꿀때...)

다른 리눅스에선

/etc/inittab을 런레벨을 2로 수정하면됨   런레벨관련은 이 블로그 어딘가에 정리되어있음
 
AND

'OS > windows 여러가지' 카테고리의 다른 글

DLL 메모리상주 헷갈리는부분.  (0) 2012.09.24
[유틸] ShellcodeExec  (0) 2011.08.01
[유틸] exe to TXT  (0) 2011.08.01
[유틸]bat to exe  (0) 2011.08.01
VMware 아무나 모르는 인터페이스 연결방식의 원리  (0) 2011.06.03
AND

서버는 서비스를 제공 해주는 입장이기때문에, 기본적으로 모든 포트를 닫고 제공해줄 서비스
(웹이면 80) 포트만 열어두는 것을 기본으로 한다. 


클라이언트는 서비스를 받는 입장이기 때문에 프리빌리지드 (privileged)port를 제외한 임의의  포트를  서비스를 제공받는데 사용한다.   나중에 포트관련 정리가 필요함....

따라서 서버쪽에서는 제공하는 서비스에 해당하는 포트를 닫으면 되지만
클라이언트쪽에서는 임의의 포트가 임의의 서비스를 이용하는데 사용된다.

특히나 estabilish나 listen이 되어 있는 포트들을 보고있자면 도대체 어디서 이용하는 포트들인지 의심이 들 때가 많다

포트 = 서비스 이다.



따라서 클라이언트에서는 악성프로그램이 사용한다고 알려진 포트나나 의심되는 포트들은 방화벽에서 닫아주던가( " http://dbckdgns0515.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%AC-%ED%8F%AC%ED%8A%B8%EC%97%B4%EA%B8%B0")    아니면 다음과 같은 명령어로 해당 포트에서 사용하는 프로세서를 죽인다. 

프로세가 죽으면 포트는 닫힌다. 


 먼저 netstat 명령어로 특정포트가 어떠한 상태인지를 확인한다음

# lsof -i tcp:[ portnumber ]  


을 통해서 해당 PID를 확인 하고 의심되는  것들은 kill   
또한 pstree를 통해서 연관된 모든 프로세스를 확인하고 같이 죽여주자.
 
AND

AND