한 프로세스의 스택이 8KB 단위로 작동되도록 만들어지므로 init task union은 8KB 단위로 정렬
되야 제대로 동작할 수 있다. init_task는 task_union이란 union type으로 만들어져 있고
$(TOPDIR)/include/linux/sched.h에 정의되어 있다.
union task_union {
struct task_struct task;
unsigned long stack[INIT_TASK_SIZE/sizeof(long)];
};
위에서 보듯이 task_union은 struct task_struct task;와 unsigned long stack[];으로 이뤄져
있다. 또 stack은 2048*sizeof(long)의 길이만큼을 차지하는데 SA1100에선 8192 바이트가 된다.
스택이 제대로 동작하려면 각 태스크는 적어도 8KB 단위로 정렬되야 제대로 동작할 수 있게 된다.
SA1100에 관계된 특정 명령을 수행한다. 우선 command line으로 입력된 것을 0xc0000000에 복사하고
캐시 관계된 일을 처리하고 시리얼로 연결된 호스트에 터미널 프로그램이 뜰 동안 좀 기다려준다.
4.2절에서 처럼 커널과 램디스크 이미지를 다운로드한 다음에 터미널을
실행하는데 기다려주지 않으면 터미널로는 초기부팅 과정에 대한 것을 볼 수 없게 된다.
4.3. ARM 리눅스 Makefile 분석
2장에서 분석한 것과 같이 ARM 리눅스의 Makefile도 i386의 것과 비슷하다. 그러나 부팅하는 과정 등의 일부가 PC가 아닌 다른 시스템이기 때문에 많이 다르다. 그럼에도 불구하고 대부분 비슷한 방법으로 만들어지고 실행된다.
arch/arm 이하의 것만 제외한다면 나머지는 i386의 것과 동일하므로 2장을 참조하고 나머지 ARM 리눅스에 관련된 부분만 다룬다.
4.3.1. $(TOPDIR)/arch/arm/Makefile
Assabet 보드용 기본 설정에 해당하는 .Config file의 내용은 아래와 같다. 이를 참조해 아래 Makefile 분석을 좇아가기 바란다. 세팅된 것만 추리고 나머지는 버렸다.
ARM 아키텍쳐에서 아키텍쳐에(v6포함) 대한 자세한 정보를 얻기 바란다. 간단히 정리하면 다음과 같다.
v3
32 비트 어드레싱 시작, 아래와 같은 종류가 있다.
T
Thumb 코드 실행
M
long multiply 지원, 이것은 v4에서 기본이 됐다.
v4
halfword load, store 지원
v5
개선된 ARM, Thumb 동작. CLZ 명령 지원. 종류는
E
개선된 DSP 명령
J
JAVA 지원
arch/arm/def-config에 가능한 모든 정보가 들어있다.
4.3.2. $(TOPDIR)/arch/arm/vmlinux.lds
ARM 프로세서 커널의 링크에 사용되는 링크 스크립트 vmlinux.lds를 분석해보자. 4.3.1절에서 본 것 처럼 vmlinux.lds는 설정된 아키텍쳐에따라 만들어진 것이다.
그림 4-8. SA-1110 메모리 맵
4.3.3. $(TOPDIR)/arch/arm/boot/compressed/vmlinux.lds
4.3.4. Log 분석
아래 Log는 vmlinux가 만들어지는 과정을 생략하고 vmlinux의 ld가 실행되는 것과 그 이후의 과정만을 실었다. i386에서 추적했던 것과 비슷하게 만들어진다.
Recent Posts
Archive Posts
Tags