가상메모리, 커널영역, 유저영역, 시스템콜함수
by #독개#가상메모리, 커널영역 , 유저영역
가상메모리
가상 메모리는 물리적인 메모리의 한계를 극복하기 위한 방법중 하나이다.
가상 메모리는 실제로 존재하지는 않지만, 하나의 큰 메모리가 존재하는 것과 같은 효과를 주어 프로그래머가
물리 메모리에 상관없이 프로그램을 만들 수 있게 해준다.
메모리는 '메모리의 주소'를 통해 접근이 가능한데,
주소는 각각 가상메모리의 가상 주소(Virtual address)와 물리 메모리의 물리주소(Pysical address)로 구분할 수 있다.
물리 주소는 메모리의 직접적인 위치를 가리키고 가상 주소는 물리주소와 상관없이 각 테스트마다 할당하는 논리주소를 뜻하며,
cpu가 만들어 내는 주소이다. 프로그램 안에서 포인터 변수 등이 보여주는 주소 또한 바로 이 가상 주소이다.
리눅스는 하나의 태스크마다 4GB(32bit기준)의 주소 공간을 할당하는데, 이것은 가상 주소를 의미한다.
실제로 리눅스는 각 테스크에게 3GB를 할당하고, 나머지 1GB는 모든 테스크들의 공통 영역인 커널 공간으로 사용한다.
이러한 가상 주소는 내부적인 메모리 관리 기능을 통해 물리주소로 변환되어 실제 메모리에 매핑된다.
따라서 가상 주소를 물리 주소로 변환하는 기법이 필요하며 이것이 바로 페이징(paging)기법이다.
하지만 주소 변환 과정은 프로그램 수행을 느리게 하는 오버헤드가 발생한다.
따라서 CPU내에는 MMU같은 하드웨어를 통해 오버헤드를 줄인다.
서로 다른 테스크의 가상주소는 충분히 같을 수 있다. (가상IP느낌)
유저영역과 커널영역의 개념
운영체제가 하는 일은 여러가지가 있지만, 컴퓨터의 메모리를 관리하는 일은
운영체제가 하는 여러 일들 가운데서도 가장 중요한 것들 중 하나 입니다.
운영체제는 컴퓨터에서 실행되는 여러가지 프로그램들이 동시에, 효율적으로 실행되도록 하기위해서 메모리를 관리합니다.
운영체제는 컴퓨터를 안전하게 관리하기 위해서 유저 영역과 커널영역으로 나눠서 관리합니다. 운영체제가 메모리를 나눠서
관리하는 이유와, 각각의 영역이 가진 특징, 그리고 둘 사이를 XX하는 시스템콜에 대해서 알아보려고 합니다.
나눠둔 이유
우리들은, 즉 사용자는 운영체제를 이용해서 게임, 인터넷, 워드 작성등 여러가지 많은 일을 합니다.
하지만 그 일들을 하기위해서는 꼭 필요한 메모리관리, 프로세스관리등의 복잡한 잡일은 우리가 하지않죠. 왜냐하면 그 복잡하고 어려운 일들은 운영 체제가 독자적으로 스스로 처리해주기 때문입니다.
운영체제는 왜 이렇게 설계되었을까요?
그 복잡하고 어려운 일들은 단순히 어렵다는 이유 하나 때문에 OS가 독자적으로 하는것은 아닙니다. OS가 '복잡한 잡일'을 스스로 알아서 처리하는 이유는 보안,사용자가 OS를 건들여서 컴퓨터에 치명적인 오류나 손상을 입히게하는 일을 막기 위해서도 있습니다.
운영체제의 가장 핵심적인 역할 중 하나인 '복잡한 잡일'들은 컴퓨터에서 매우 민감한 자원들을 직접적으로 조작하는 일입니다.
만일 이러한 부분에 대한 일을 사용자가 마음대로 할 수 있다면? 컴퓨터를 더욱 더 무궁무진하게 사용할 수 있을지도 모르죠. 그러나 그런 긍정적인 경우보다는 사용자의 미숙한 조작으로 컴퓨터를 망가트리거나,
악의적인 의도로 남의 정보를 감청해가거나 시스템을 불법적으로 조작하는 일이 더 많을것입니다.
유저영역
ㅁ공유라이브러리 영역
프로그램이 내부에서 사용하는 라이브러리 함수들과 관련된 공유 라이브러리 파일이 적재되는 영역, 스택과 힙 영역 중간에 위치
ㅁ힙 영역
낮은 주소에서 높은 메모리 주소 방향으로 증가 필요에 의해 동적으로 메모리를 할당 하고자 할때 위치하는 메모리 영역으로
동적 데이터 영역이라고 부르며, 메모리 주소 값에 의해서만 참조되고 사용되는 영역. 메모리를 할당 받고 사용하기 위해서는
malloc함수로 할당하고 free함수로 해제해야함.
ㅁData영역
-bss 영역 : 초기화되지 않은 전역 변수들이 저장.
-data영역 : 초기화된 전역변수, 상수, static 변수들이 저장되는 공간
ㅁ코드영역(=텍스트영역)
수정불가 읽기전용, 컴파일러가 생성한 실행파일의 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정.
컴파일 시에만 작성되고 프로세스에서 접근할 수 없는 부분. 때문에 이 부분에 저장된 부분을 프로세스 실행 시에 변경시키려고 하면
에러가 발생
높은주소 |
|
커널 영역 |
커널영역 |
스택 영역↓ |
유저영역 |
공유 라이브러리 영역 |
|
힙 영역↑ |
|
데이터(bss)영역 |
|
데이터(data) 영역 |
|
코드영역 |
|
낮은주소 |
커널모드 <-> 시스템콜함수 <-> 유저모드
'🧛♂️ 해킹 > 시스템해킹' 카테고리의 다른 글
DEP+ASCII Armor 우 (0) | 2020.06.29 |
---|---|
스텍 버퍼오버플로우 (0) | 2020.06.26 |
쉘코드 제작 (0) | 2020.06.24 |
쉘코드 (0) | 2020.06.23 |
백도어 ,백도어 탐지, 백도어숨기기 (0) | 2020.06.22 |
블로그의 정보
독한 개발자
#독개#