heap과 stack의 주소가 거꾸로 입니다

chocokeki의 이미지

안녕하세요
일단 환경이 리눅스가 아닙니다 그래도 이해가 가지 않는 부분이 있어 질문을 올립니다

ARM Cortex M7 계열이구요 OS 없이 사용중입니다

먼저 link script에 다음과 같은 순서로 설정이 되어있습니다
.heap
.stack

그리고 map 파일을 보면 위와 동일한 순서로 만들어져 있습니다
RAM 시작(lower memory address)
heap
stack
RAM END(higher memory address)

아래는 map 파일의 일부 입니다.

.heap           0x204012c4    0x14004 load address 0x004555a8
                0x204012c8                . = ALIGN (0x8)
 *fill*         0x204012c4        0x4 
                0x204012c8                _sheap = .
                0x204152c8                . = (. + HEAP_SIZE)
 *fill*         0x204012c8    0x14000 
                0x204152c8                . = ALIGN (0x8)
                0x204152c8                _eheap = .
 
.stack          0x204152c8     0x9000 load address 0x004695ac
                0x204152c8                . = ALIGN (0x8)
                0x204152c8                _sstack = .
                0x2041e2c8                . = (. + STACK_SIZE)
 *fill*         0x204152c8     0x9000 
                0x2041e2c8                . = ALIGN (0x8)
                0x2041e2c8                _estack = .
                0x2041e2c8                . = ALIGN (0x4)
                0x2041e2c8                _end = .
                0x2045ffff                _ram_end_ = ((ORIGIN (ram) + LENGTH (ram)) - 0x1)

그런데 문제는 말이죠 실행을 해서 malloc이랑 배열 선언으로 구한 stack 주소값을 보면 정반대로 되어있습니다
RAM 시작
stack
heap
RAM 끝

예시

int main()
{
    int   stack[1024];
    void  *heap;
 
    heap = malloc(1024);
 
    printf("heap: %p, stack: %p\n", heap, stack);
    //heap의 주소가 더 크다
...

이게 왜 뒤집혀 있을까요? 시스템 동작이 이상하거나 하지는 않습니다

goforit의 이미지

알다시피 malloc 정해진 양의 메모리 관리하는 로직입니다.

대부분 RTOS는 별도의 malloc 로직을 가지고 있는데 힙의 주소와 크기를 명시적으로 주어야합니다.

따라서 지금의 힙의 주소가 memory allocator (malloc) 에게 정확하게 전달되었는지 확인할 필요가 있습니다.

댓글 달기

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