[질문] linux kernel stack size 어떻게? ( 현재 8K -> 16K로 조정하고 싶어요)
글쓴이: tjtjddns / 작성시간: 목, 2008/02/28 - 5:46오후
현재 linux kernel을 시작한 지 얼마 안되는 초짜입니다.
업무 중 kernel stack overflow로 인해 kernel stack을 증가 시켜 달라는 요구를 받고있습니다.
회사내 linux 전문가가 없는 상태에서 중간에 제가 인계를 받은 상황이라 이 부분을 해결하기 쉽지가 않네요.
지금까지 자료를 찾아본 바로는 현재 linux에서 지원하는 kernel stack은 8K이며 이를 변경할 수 없는것처럼 보여지는데
정확히 알기 힘들군요.
제가 사용하고 있는 linux kernel 버전은 2.4.x 대 버전입니다.
알고 싶은 내용은
1) 현재 linux에서의 kernel stack을 8K이상 사용 가능 유무
2) 가능할 경우 어떻게 kernel stack size를 늘일 수 있는지 구체적인 설명
여러 고수분들의 도움을 요청드립니다. 얼른 해결하고 싶어요...ㅠㅠㅠ
Forums:
처하신 환경에서는
처하신 환경에서는 '고칠 수 없다'가 정답입니다.
2.4커널이라....
CPU 마다 조금씩 틀립니다.
arm,mips 는 4K, s390 은 16K 입니다.
대부분 include/asm-*/current.h 의 get_current() 에 하드코딩되어 있으니 참고하시고요.
물론, 여기만 고친다고해서 쉽게 변경되지는 않을 겁니다.
또 다른 어디에 하드코딩되어 있을지도 모르고, *.h 에 교묘한 이름으로 define 되어 있을 수도 있습니다.
어딘가에서 boundary 체크를 하고 있을지도 모르고, 교묘한 수식안에 감춰져 있을지도 모릅니다.
무엇보다도,
application 작성 중에 stack overflow 난다고 라이브러리,OS 를 뜯어고칠 생각을 하는 사람은 없습니다.
당연히 자기가 코드를 잘 못 만들었음을 인정합니다.
커널도 같습니다. 8K 면 무지하게 널널한 공간입니다.
가능하다면 어떻게해서든 줄이려고 노력하는 부분이고, 2.6 의 x86 엔 4K 로 줄이는 옵션이 있을 정도입니다.
보통은, 어쩔 수 없이 중첩 irq 를 허용한 상황에서 인터럽트 서비스 루틴이 채 끝마쳐지기도 전에 또 다시 인터럽트가 발생한다던가인데,
이런 경우라면 코드를 손 봐서 기능, 성능, 동작상의 튜닝을 하던가,
좀 더 빠른 CPU 로 바꾸세요.
OTL
답신 감사합니다.
우선 답변에 감사드립니다.
그리고 추가 질문도 드려봅니다. 제가 사용하는 CPU는 PPC-4XX 계열입니다. 말씀하신 current.h file에는
current가 pointer로 PPC의 r2(ppc에서는 r2가 current task를 가리킴)를 가리키는 task_struct로만 정의 되어 있네요.
다만 include/linux/sched.h 파일 내에
# define INIT_TASK_SIZE 2048*sizeof(long)
union task_union {
task_t task;
unsigned long stack[INIT_TASK_SIZE/sizeof(long)];
};
와 같은 define이 있고, 이 task_union은 init_task_union으로 초기화시 kernel stack size를 결정하는 것으로 생각되어
위 define문을
# define INIT_TASK_SIZE 4096*sizeof(long)
과 같이 바꾸어 보았지만 부팅이 정상적으로 수행되지 않았습니다.
아마도 다른 곳에도 걸리는 부분이 있는듯 한데 도저히 알 수가 없네요...ㅠㅠㅠ
Stack을 어떻게
Stack을 어떻게 키우냐는 질문에 답을 못 드리겠으나,
해당 문제는 Stack을 많이 사용하는 함수를 찾아 수정해야 할거라 생각합니다.
커널소스에 어떤 함수가 stack을 많이 먹는지 체크하는 스크립트가 있습니다.
커널소스/scripts/checkstack.pl 이고,
대략 사용법이 #objdump -d vmlinux | checkstak.pl ppc
입니다. (ppc용 objdump 사용하셔야 합니다.)
댓글 달기