ucore-project5: linker script

2179 단어 project
내부 핵을 페이지로 비추려면 먼저 내부 핵이 메모리에 있는 위치와 내부 핵의 크기를 알아야 한다.메모리에 있는 핵의 위치는 잘 알고 있습니다. 부팅 코드가 복사되어 들어갔기 때문에 핵의 크기가 좋지 않습니다. 마지막으로 각obj파일을 핵파일로 조합하는ld명령만 알 수 있습니다.ld 명령의 명령행 매개 변수는 매개 변수 알림 코드를 정의하기 어려우므로 링크 스크립트 링크러 스크립트가 필요합니다.ld 명령 사용 - T 링크 지정
 
링크 기능이 매우 강해서 링크기가 어떻게 일을 해야 하는지 알려줄 수 있다. 링크기의 시작 코드 주소가 어디에 있는지, 어떤 cpu 기계 유형인지 알려주는 것 외에 가장 중요한 것은 링크기 각 파일의 각각section이 어떻게 조합되어야 하는지 알려주는 것이다. 어느 주소부터 넣어야 하는지, 각section은 어떤 순서로 놓아야 하는지, 각각 어떻게 정렬해야 하는지 등이다. 최종적으로 출력 파일을 구성하는 각각section
 
이 밖에 링크러 스크립트는 각종 기호를 정의하여 최종적으로 생성된 기호표에 넣을 수 있다.기호표는 기호의 목록으로 각 기호는 기호의 이름, 기호가 인용하는 메모리 주소, 그리고 기타 속성 정보를 포함한다.기호 자체는 프로그램의 메모리 공간을 차지하지 않고 실제로는 하나의 주소의 기호 표시이다.
 
C 언어에서 변수를 정의할 때 실제로는 두 가지 일을 했다. 1.하나의 기호를 정의하여 최종적으로 기호표에 넣고 그 주소를 연결한다.2. 이 변수에 메모리 공간을 분배하여 접근할 수 있습니다.예를 들면 다음과 같습니다.
int a;
a = 10;
printf("%d
", a); int *pa = &a;

 
int a;변수를 정의했습니다. 먼저 기호표에 기호 a를 만들고 a에 대응하는 주소를 저장한 다음에 메모리 공간에 a에 int 크기의 공간을 남겼습니다. 공간의 주소는 기호표에 대응하는 a의 주소로 지정됩니다.
 
두 번째 줄 a=10;기호 a가 대표하는 주소가 가리키는 int 크기의 메모리 공간에 10을 부여하고 세 번째 줄은 기호 a가 대표하는 주소가 가리키는 int 크기의 메모리 공간에 있는 데이터를 인용한다.
 
네 번째 줄 & a는 기호표에서 기호 a에 대응하는 주소를 직접 추출하는 값으로 이 값은 메모리의 실제 데이터와 상관없이 링크를 컴파일하는 동안 확정할 수 있다. (물론 본 예에서 a는 국부 변수이고 그 주소는 운행 기간이 확정되며 정적 변수와 전역 변수의 주소 컴파일러가 확정한다.)
 
linker script에 정의된 기호는 기호표의 기호일 뿐 대응하는 메모리 공간이 없고 주소 값만 표시합니다.따라서 linker script에 두 개의 기호가 정의되어 있는 경우
.text :
{
    _text_begin = .;
    *(.text)
    _text_end = .;
}

코드에서 다음과 같은 액세스가 잘못되었습니다.
extern int _begin_text, _end_text;

int a = _end_text - _begin_text;

 
위 참조begin_text 및end_text의 방식은 변수의 접근 방식을 사용하고 변수에 대응하는 메모리에 직접 접근하는 것이다. 실제로 이런 기호는 메모리에 대응하는 값이 없다.다음은 올바른 액세스입니다.
extern int _begin_text, _end_text;

int a = &_end_text - &_begin_text;

 
또한 그룹 이름은 사실상 하나의 기호 값으로 직접 가져와서 사용할 수 있으며 다음과 같은 접근도 정확하다.
extern char _begin_text[], _end_text[];

int a = _end_text - _begin_text;

좋은 웹페이지 즐겨찾기