[질문] linux kernel stack size 어떻게? ( 현재 8K -> 16K로 조정하고 싶어요)

tjtjddns의 이미지

현재 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를 늘일 수 있는지 구체적인 설명

여러 고수분들의 도움을 요청드립니다. 얼른 해결하고 싶어요...ㅠㅠㅠ

bushi의 이미지

처하신 환경에서는 '고칠 수 없다'가 정답입니다.

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

tjtjddns의 이미지

우선 답변에 감사드립니다.

그리고 추가 질문도 드려봅니다. 제가 사용하는 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)

과 같이 바꾸어 보았지만 부팅이 정상적으로 수행되지 않았습니다.
아마도 다른 곳에도 걸리는 부분이 있는듯 한데 도저히 알 수가 없네요...ㅠㅠㅠ

mon12key의 이미지

Stack을 어떻게 키우냐는 질문에 답을 못 드리겠으나,

해당 문제는 Stack을 많이 사용하는 함수를 찾아 수정해야 할거라 생각합니다.

커널소스에 어떤 함수가 stack을 많이 먹는지 체크하는 스크립트가 있습니다.

커널소스/scripts/checkstack.pl 이고,

대략 사용법이 #objdump -d vmlinux | checkstak.pl ppc

입니다. (ppc용 objdump 사용하셔야 합니다.)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.