커널 프로그래밍시 동적 바인딩에 대해서

kws4679의 이미지

이런것도 동적 바인딩이라고 하는지 잘 모르겠습니다만;;;

커널을 만드는 중에 변수값 자체를 매개변수로 전달하면 문제가 없는데

포인터나, 주소를 매개변수로 전달하면 참조하지 못하는 경우가 있습니다.

예를들어

test.DrawMessage("test",10,10, 1);

했을시에 DrawMessage 에서는 "test" 의 주소를 제대로 못 따오더군요

원인을 나름대로 생각했는데

커널을 만들고 돌릴시에 kernel.cpp 를 컴파일하고 부트로더 asm 을 어셈해서 나온 boot.bin 와 단순결합 즉

copy /b boot.bin + kernel.bin 하기 때문에

주소가 kernel.cpp 컴파일시에서는 제대로 정해져있어도 실제로는 달라져 있을 것이라고 예측했는데요

예측대로 boot.bin 의 크기와 여러가지 기타 이미지 관련 오프셋을 더해주니까 잘 참조하는 것을 확인할수 있었습니다.

그래서 궁금한것이 컴파일 할 시에 여러가지 포인터 주소들이 물리적으로 기록되어서 실제 주소값으로 기록되어 컴파일되는지

아니면 상대주소(?) 예를들어 어디에서 어느정도 오프셋... 이런식으로 컴파일 되는지 여부와

위와 같은 문제를 해결할수 있는 방법 조언 부탁드립니다!!!!!

irondog의 이미지

컴파일 시에 포인터 주소는 물리적으로 정해진다기 보다는 offset 값이 들어 있다고 보시면 될겁니다.
모든 주소는 offset주소 다시말해 상대적인 주소값으로 컴파일되어 있고, segment값에 따라 물리적인 주소가 바뀔 수 있습니다. segment + offset이 물리적인 주소가 되겠죠.

위에서 처럼 loader없이 특정 영역에 고정되는 바이너리들은 링크시에 시작주소를 정해 놓은 겁니다. 아마 link쪽 메뉴얼을 찾아 보시면 mapping관련된 옵션들이 나올 겁니다. 너무 오래되서 기억이 잘 안나는데 메모리 map관련 텍스트 파일을 작성해서 link시에 linker에 정보를 제공 했던 것 같네요. 그리고 로더 없이 직접 메모리에 올라가는 raw형태이기 때문에 이 또한 linker에 설정을 해줬던 것 같습니다.

tj의 이미지

으음... 요즘엔 세그멘트는 별로 쓰진 않구요 (어차피 x86-64에선 cs/ds는 세그맨팅이 되지도 않고...). 보통은 링크할 때 로드 주소를 정해서 링크하고, 로드 주소가 가변이어야 하면, 이미지 로드후 간단한 리로케이터로 리로케이션을 하거나, 아키텍쳐에서 큰 패널티가 없으면 포지션 인디펜던트 코드로 뷜드할 수도 있어요.

말씀하신 텍스트 화일은 링커스크립트라고 하는데, 어플리케이션 링크할 때 쓰이는 기본 스크립트는 ld --verbose를 실행하면 볼 수 있고, 오에스 이미지 만들 때는 로더와 맞춰서 직접 만들어줘야해요. ld info 페이지에 보면 링커스크립트 설명이 있긴한데 아래쪽 툴체인들 문서화가 아주 잘 되어있는게 아니어서 삽질해야하는 경우가 많아요.

furmuwon의 이미지

uboot 에서는

다음과 같은 방법으로 처리 하더군요

FirstBoot.bin ( 16KB(0x4000) 크기로 고정, 실제 바이너리 크기가 1KB 나와도 16KB 까지 0xFF 로 채움 )

SecondBoot.bin 이 링크 될때 Text 시작 위치를 0x4000 로 설정.

그럼 SecondBoot.bin 의 code 들은 0x4000 부터 시작 동작하는 code 가 생성 됩니다.

kws4679의 이미지

문득 생각나서 ld 옵션에서 -Ttext 를 맞추어 주었더니 잘 작동하더군요

답변 감사합니다!!!

댓글 달기

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