유저스택과 커널스택
글쓴이: declspec / 작성시간: 토, 2012/02/04 - 12:44오전
안녕하세요
질문이 있습니다.
윈도우든 리눅스든
프로세스는 함수 호출과 지역변수 등을 위한 메모리공간으로
스택을 가지고 있습니다.
이것은 더 정확히는 쓰레드별로 가지고 있습니다.
(쓰레드들끼리 가지는 스택은 프로세스의 주소공간 내부에서 나눠쓰는 것이죠)
그런데 커널스택의 경우는 어떻게 되는건가요?
커널 오브젝트(디바이스 드라이버) 별로 스택이 하나씩 있는건가요
아니면 커널 전체가 커널 메모리공간(상위 2G) 에 어떤 거대한 스택 하나를 놓고
다같이 쓰는건가요? ㄱ-;;
커널 오브젝트마다 스택이 존재한다면
그런식으로 커널 오브젝트를 위한 환경을 구축해주는것도
또다른 커널 오브젝트겟죠?
그렇다면 그 또다른 커널 오브젝트를 위한 환경은 누가 셋업해주고
또 그 커널 오브젝트를 위한 환경은 누가....??
명쾌한 답변 기대합니다~~
Forums:
커널스택은 프로세스 당 하나씩 생성됩니다.
네, 별거 없습니다.
8086 구조에서는 프로세스가 실행되면 이 프로세스만의 page table과 커널스택을 할당해 줍니다.
이 커널스택의 크기는 보통 8kb로 비교적 작은 크기이며, 이렇게 떨렁 할당만 해줄 뿐 커널은 아무런 관리도 해주지 않습니다.
declspec님께서 상위 거대한 스택을 다같이 쓰는 것인지 질문하셨는데 어느정도는 맞는 말입니다.
프로세스별로 할당된 커널스택 구간이 정해져 있긴 하지만 이들 모두 상위1G(3G~4G) 주소범위 내에 밀집되어 있고
스택이 오버플로 되는 경우에 대한 어떠한 안전장치도 없다 생각하시면 되겠습니다.
이 좁디좁은 커널스택을 안전하게 사용하려면 큰 배열이나 구조체를 스택영역에 만들어서 사용하는 것을 피하고,
대신 kmalloc이나 최대한 유저모드 메모리를 사용하셔야 합니다.
아시다시피 OS의 핵심부분을 우리는 커널이라 부르고, 이 커널이 관리하는 자원들을 통칭하여 커널 오브젝트라 부릅니다.
따라서 커널 오브젝트를 위한 환경은 크게볼땐 OS가 셋업해 준다고 보시면 됩니다.
어떻게 유저모드 메모리를 사용할 수 있죠?
어떻게 유저모드 메모리를 사용할 수 있죠?
답변자가 아니라 다르게 답변할 수 있을지
답변자가 아니라 다르게 답변할 수 있을지 모르지만
커널에서 많은 메모리가 필요한 경우
해당부분을 유저영역 프로그램으로 만든뒤
커널에선 copy_from_user, copy_to_user로 접근해 사용하란 말씀으로 추측됩니다.^^
음.. 이렇게 무책임한 답변을 해도 되는건가요?
"이 커널스택의 크기는 보통 8kb로 비교적 작은 크기이며, 이렇게 떨렁 할당만 해줄 뿐 커널은 아무런 관리도 해주지 않습니다."
-> 커널스택의 크기가 8kb 라는 얘기는 처음들어보네요. 보통 커널 설정에 따라 틀리지만, 예들 들어 디폴트로 1M 로 설정되어 있다면 쓰레드 생성시 유저모드 영역 1M , 커널 모드 영역 1M 가 생성됩니다. 그리고 커널이 스택 관리를 하지 않는다니요. 스택이 풀되면 자동적으로 스택을 늘려줍니다. 스택은 항상 최상위 메모리에 위치되는데, 아래로 동적으로 확장될 수 있게 하기 위합니다.
"declspec님께서 상위 거대한 스택을 다같이 쓰는 것인지 질문하셨는데 어느정도는 맞는 말입니다.
프로세스별로 할당된 커널스택 구간이 정해져 있긴 하지만 이들 모두 상위1G(3G~4G) 주소범위 내에 밀집되어 있고
스택이 오버플로 되는 경우에 대한 어떠한 안전장치도 없다 생각하시면 되겠습니다."
논리적으로 쓰레드별로 구분되어 있습니다. 그리고 스택 오버플로나면 아무런 안전장치도 없다니요. 그것은 C언어와 같이 프로그래밍 언어 구현적으로 그럴수는 있지만, 운영체제에서는 당연히 안전장치를 제공해줍니다. 스택 풀나면 자동적으로 확장됩니다.
"이 좁디좁은 커널스택을 안전하게 사용하려면 큰 배열이나 구조체를 스택영역에 만들어서 사용하는 것을 피하고,
대신 kmalloc이나 최대한 유저모드 메모리를 사용하셔야 합니다."
커널스택이 좁다니요. 힙영역이나 스택이나 어차피 동적으로 할당가능한 메모리를 할당해서 씁니다. 단지 스택메모리는 재귀함수 작성시 호출스택이 너무 깊어져서 메모리 활용성이 떨어질 수가 있음으로 힙에서 할당받는 경우가 많은것이죠.
커널스택을 1메가나 주진 않을꺼에요. 윈도우에서는
커널스택을 1메가나 주진 않을꺼에요.
윈도우에서는 쓰레드 당 디폴트로 유저모드 1MB, 커널 스택 12K를 할당해줍니다. 64비트는 24K이고요.
무책임이란 과한 용어를 쓰시는건 좀... 그리고
무책임이란 과한 용어를 쓰시는건 좀...
그리고 커널스택은 8K 또는 4K를 쓰는게 일반적입니다.
https://www.google.com/search?q=linux+kernel+stack+size&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ko:unofficial&client=firefox-a
구글검색해보면 바로 나요는 내용..
http://kerneltrap.org/node/6399
여기 덧글에 보면 커널스택구조가 잠깐 설명되어있는데 커널스택끝부분에 task_struct가 있기때문에 overflow가 일어나면 process정보부터 깨져나갑니다. ㅜ.ㅠ
원래는 8K였는데 오버헤드를 줄이기위해 4K로 가는중이긴 하지만 몇몇 모듈들에서 스택변수를 크게 잡다보니 4K에선 오버플로우로 동작하지 않는 경우가 있습니다. 대표적으로 XFS가 4K에서 동작 안했었습니다. 최근엔 확인 안해봐서 모르겠...
aral1 님께 사과 드립니다.
aral1 님께 고개 숙여 사과 드립니다. 가끔 무책임한 답변을 하는 경우를 종종 보는데, 그때문에 제가 혼돈을 경은 적이 있어 조금 과민했던것 같습니다. 이번경우에는 제가 무책임한 사람이 되었네요.
아주 예전에 조금 공부한 내용이라, 확실히 안다고 생각했던 부분인데, 제가 이론서하고 혼돈을 했나봅니다.
다시 한번 사과드립니다.
이답글 삭제하고 싶은데, 삭제는 어떻게 하는지요?
감사합니다
답변 감사합니다~
즉 커널 오브젝트들은 각각 자신들만의 커널스택을 가지고있긴 하지만
그 스택들이 커널 메모리 영역에 밀집되어있으며 버퍼오버플로우가 발생하면
아무도 책임을 안져준다... 정도로 생각하면 되겠죠?
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.
댓글 달기