답글형식으로 매회 모임때마다 발생한는 이슈정리를 하기로 했습니다.
댓글 9
-
유경환
2011.09.25 09:42
-
유경환
2011.09.25 09:49
1. .pv_table은 64bit virtual address를 사용하게 될경우 생성해야할 page table의 size가 기하급수적으로 커지기때문에 virtual to physical address table을 만들어서 이문제를 해결해 보자는 아이디어에서 발생한것으로 보입니다. 구글링 결과 FREEBSD쪽에는 이부분관련 구현부분이 보이는데 linux쪽에서는 관련내용이 안보여서 쓰이는지 조차 의문입니다.
그리고 32bit address를 쓰는경우 이부분을 안거치는것 같습니다. 따라서 우리쪽 분석에서는 빠져도 무방할것으로 보입니다.
자세한 내용은 첨부파일 참고하세요
2. UBOOT 에서 ATAG
do_bootm_linux 함수에서
setup_start_tag (bd);setup_serial_tag (¶ms);
setup_revision_tag (¶ms);
setup_memory_tags (bd);
setup_commandline_tag (bd, commandline);
setup_initrd_tag (bd, images->rd_start, images->rd_end);
setup_end_tag(bd);
로 tag list를 만든다. (리스트의 생성은 코드참조)
(ATAG_CORE ~ ATAG_NOE의 포맷으로 tag 생성)
++++++++++++++++++++++
+ ATAG_CORE +
++++++++++++++++++++++
+ ATAG_SERIAL +
++++++++++++++++++++++
+ ATAG_INITRD2 +
++++++++++++++++++++++
+ ~ +
++++++++++++++++++++++
+ ATAG_NONE +
++++++++++++++++++++++
kernel_entry(0, machid, bd->bi_boot_params);
를 call 하면서 parameter 1(0) = r0, parameter 2(machine id) = r1, parameter 3(atags) = r2로 넘어가 kernel로 전달한다.atag의 주소는 아래와 같이 SoC에 따라 다르게 설정한다.
u-bootboardSoC: gd->bd->bi_boot_params = 0x0C000100;
-
홍문화
2011.09.27 20:19
ATAG의 구조와 역할
참고 : http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html#d0e428
ATAG 라는게 있는지도 몰랐네요. 제가 사용한 로더에서는 사용을 안하던데...
커널 페이지 테이블 아래 16KB 공간을 사용합니다.
일반적으로 물리메모리 시작 주소 + 0x100 이 ATAG의 시작입니다.
ATAG_CORE 크기가 왜 5인지 잘 이해가 안되네요.
4바이트 변수 세개이니 12가 되어야 하는거 아닌가요?
-
홍문화
2011.09.28 15:15
struct atag_header { u32 size; /* legth of tag in words including this header */ u32 tag; /* tag value */ };
해더 변수 2개를 기본적으로 포함하나 봅니다.
다른 테그들 사이즈 계산 해보니 4바이트를 한개로 쳐서 나온 개수와 해더 2개하고 더하네요.
-
정현철
2011.09.28 07:15
그 사이즈가 sizeof로 나오는 구조체 크기가 아니라 구조체의 갯수인거 같습니다. 적어도 다른 atag 사이즈 찍어보니까 그런거 같구요. 거기다 atag_core는 기본적으로 사이즈 2개를 먹고 들어갑니다.(아무런 리스트가 없을 경우). 왜 2개를 먹는지는 좀 더 봐야 확실히 알 수 있을거 같네요.
-
홍문화
2011.09.27 20:55
DTB (Device Tree Blob or Flat Device Tree)
참고 : http://www.informit.com/articles/article.aspx?p=1647051&seqNum=5
The DTB is a database that represents the hardware components on a given board.
기본적인 역할은 ATAG와 같습니다.
가장 큰 차이점은 컴파일을 통해 바이너리 이미지로 만들어 진다는거 같습니다.
ATAG든 DTB든 실제 사용을 해봐야 제대로 알거 같네요.ㅋ
-
유경환
2011.09.29 10:04
.alt.smp.init 를 검색해봤는데 도저히 단서를 찾을수가없네요. 밑에는 전부 저의 개인적인 추측입니다.
ifdef 가 CONIG_SMP_ON_UP 인것으로봐서 UP시스템에서 SMP를 on했다 인데.. 이것도 참 논리적으로 설명이 힘든
define입니다. fixup_smp 함수 모듈에서 이걸 설정 하고 .alt.smp.init 영역의 특정 데이터들을 가져와서 무엇인가를
설정하는것으로 보이는데,
따라서 .alt.smp.init의 영역의 이미 설정된 고정데이터들을 UP시스템에서 SMP기능을 사용하기위해 가져와서
쓴다라는 추측이 성립됩니다. alt.smp.에서 alt는 alternative smp 의 약자로 보입니다.
추측을 종합해보면 "하드웨어적으로 UP시스템이지만 OS에서의 SMP기능을 사용하기위해
컴파일 타임에 생성된 static한 대안적인 SMP용 데이터를 가져다 설정한다" 입니다.
이 데이터가 어떻게 생성되는지 못찾았고, 이러한 설정을 쓰는데 대한 힌트도 못찾았습니다.
그러나 우리 스터디가 MP Core에 대한 커널분석이므로 이 설정은 거치지 않을것 같습니다.
자세히 아시는분 답글 좀 달아주세요 .
-
홍문화
2011.09.29 20:13
CONFIG_SMP_ON_UP
SMP kernels contain instructions which fail on non-SMP processors. Enabling this option allows the kernel to modify itself to make these instructions safe. Disabling it allows about 1K of space savings.
If you don't know what to do here, say Y.
출처 : http://cateee.net/lkddb/web-lkddb/SMP_ON_UP.html
SMP 용으로 컴파일 된 커널이 UP에서 돌아가도 문제가 생기지 않도록 해주는 기능인것 같습니다.
arch/arm/Kconfig 1334라인에 SMP_ON_UP 컴파일 옵션으로 들어가있습니다.
이 기능(컴파일 옵션)은 EXPERIMENTAL로 명시 되어있습니다.
EXPERIMENTAL
네트워크 드라이버, 파일 시스템, 네트워크 프로토콜 등 리눅스가 지원하는 여러 가지 기능들 중 기능,안정성, 테스트 단계 등의 이유로 시험 단계(EXPERIMENTAL)에 있는 것들을 사용할 수 있도록 커널에
포함시킨다. 일반적으로 개발자들 사이에서 "alpha-test" 라고 불리는 것이다. 만약 "alpha-test" 단계의
것들을 커널에 포함시킨다면 "이거 왜 동작 안하나염?" 같은 메일 메시지 같은 것들이 수시로 날아들
가능성이 있기 때문에 개발자들은 이 기능들을 충분한 고려 없이 사용하는 것을 주저한다. 아무튼 이
항목을 체크하면 안정성에 문제가 있거나 어떤 작업이 실패할 가능성도 있다는 점을 잘 알아두기 바란다.
출처 : http://androidpxa255.springnote.com/pages/3466489?print=1
어떤 원리로 이러한 동작이 가능한지는 좀 더 찾아봐야겠습니다.
-
홍문화
2011.09.30 12:23
일단 __fixup_pv_table으로 분기하기 위한 매크로 CONFIG_ARM_PATCH_PHYS_VIRT의 정의가
Kconfig에 다음과 같이 나와 있습니다.
config ARM_PATCH_PHYS_VIRT
bool "Patch physical to virtual translations at runtime (EXPERIMENTAL)"
depends on EXPERIMENTAL
depends on !XIP_KERNEL && MMU
depends on !ARCH_REALVIEW || !SPARSEMEM
help
Patch phys-to-virt and virt-to-phys translation functions at
boot and module load time according to the position of the
kernel in system memory.
This can only be used with non-XIP MMU kernels where the base
of physical memory is at a 16MB boundary, or theoretically 64K
for the MSM machine class.참고 : http://cateee.net/lkddb/web-lkddb/ARM_PATCH_PHYS_VIRT.html
글 내용만 봐서는 동적으로 가상주소 변환이 가능하도록 하는 패치라는거 같은데 그렇다면 기존에는
컴파일 타임에만 결정을 할 수 있었다는 얘기 같습니다.
주소변환 관련해서는 진짜 페이지 테이블을 완성 한 후에 제대로 이해 할 수 있지 않을까 생각 되네요.
.
2011/09/24 의문사항
1. loader에서 넘어가는 atags 의 구조, DTB의 구조
2. __fixup_smp 에서 사용되는 .alt.smp.init 의 정의 및 위치
3. __fixup_pv_table 에서 사용되는 .pv_table 의 정의 및 위치