커널 소스에서 지역 변수와 자동 변수를 많이 사용하는 이유는

gurugio의 이미지

예를 들어서 __alloc_pages 함수를 보면

for (;;) {
zone_t *z = *(zone++);
if (!z)
break;
...

이런 부분이 있는데요 왜 z 변수를 함수 초기에 선언해서 다음과 같이

하지 않은걸까요?

__alloc_pages(..)
zone_t *z;
..
for (;z++;z != NULL)
{
..
}

스택 사용에 있어서 조금 다르겠지만 속도가 좀더 나오거나하는

장점이 있나요?

커널 곳곳에 보면 쉬프트나 &등을 이용해서 산술 연산을 하는 것은

속도에 장점이 있겠지만 이런 특징들은 단순히 코딩 습관이 아니라

뭔가 이유가 있는것 같습니다.

hb_kim의 이미지

별 차이 없습니다.

컴파일만 해서 *.s 파일만 보셔도 금새 아시겠지만요.

gurugio의 이미지

제 생각에는 루프안에 지역 변수 선언이 있다면

스택을 다루는 횟수가 많아져서 손해일것 같습니다.

만약 함수 안에 한번만 선언하면 스택을 한번만 잡으면 되지만

루프안에 있으면 루프를 돌때마다 스택을 잡았다가 해제해야할것 같습니다.

만약 컴파일러가 최적화를 해서 그걸 한번만 선언해서 계속

사용한다면 문제가 없겠지만요.

커널 소스가 이상하게 보이는 것은 제가 이해하지 못해서 이겠죠? oops

cwryu의 이미지

gurugio wrote:
제 생각에는 루프안에 지역 변수 선언이 있다면

스택을 다루는 횟수가 많아져서 손해일것 같습니다.

만약 함수 안에 한번만 선언하면 스택을 한번만 잡으면 되지만

루프안에 있으면 루프를 돌때마다 스택을 잡았다가 해제해야할것 같습니다.

만약 컴파일러가 최적화를 해서 그걸 한번만 선언해서 계속

사용한다면 문제가 없겠지만요.

커널 소스가 이상하게 보이는 것은 제가 이해하지 못해서 이겠죠? :oops:

저도 블록 안에서 선언한 변수에 필요한 스택은 그 블록에 들어갈 때 잡힌다고 생각하고 있었는데.. 아니더군요. 예전에 아주 작은 스택에서 작업할 일이 있을 때 스택을 절약한답시고 여러개 블록을 만들어서 그 안에 변수를 선언했는데.. 실제로는 함수 전체에 한 덩어리로 잡혔었습니다.

요즘에 제가 블록 안에 변수를 선언하는 이유는 스택을 절약하기 위한 것도 아니고 읽기 좋게 하기 위한 용도인 것 같습니다.

gurugio의 이미지

아.. 저는 어셈블된 소스를 확인안해봤는데

역시 한번에 잡아주는 군요..

고맙습니다 D

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.