오래간만에 C팀 후기를 올립니다. 내용이 전과 같을 수는 없겠지만, 후기를 적습니다.
42주차 스터디 : setup_arch() -> unflatten_device_tree();
장소 : 토즈 타워점
42주차 스터디는 네이버의 개발자 후원을 받아서 진행되었습니다.
주요 토론 내용 :
# 디바이스 트리를 읽어서 트리형 자료구조를 만드는 과정입니다.
두번 실행되며 삼중포인터 해석을 많은 시간을 들여서 분석했습니다.
# root node에서 왜 fpsize =1, allocl = 2로 설정하는가?
이것은 root node일때만 fpsize =1, allocl = 2, *pathp = ‘\0’ 으로 구분해서 선언을 한다.
choosen일 경우는 fpsize는 choosen의 문자열 크기인 7만큼 증가해서 fpsize = 1 + 7 = 8
allocl = 8로 되어 각 노드별로 문자열 크기만큼 증가해 가면서 alloc을 한다.
# dtb에서 @가 나오는 예시
@뒤에는 어드레스 값이 나오게 된다.
<code>
cpu0: cpu@0 {
device_type = "cpu";
compatible = "arm,cortex-a15";
reg = <0x0>;
clock-frequency = <1800000000>;
};
cpu1: cpu@ 1 {
device_type = "cpu";
compatible = "arm,cortex-a15";
reg = < 0x1>;
clock-frequency = <1800000000>;
};
</code>
# 그럼 언제 루프를 빠져 나가게 될까?
OF_DT_END_N 0x02 와
OF_DT_END 0x09 가 나오면 끝나게 된다.
# size = unflatten_dt_node(blob, 0, &start, NULL, NULL, 0);
노드마다 flat DTB 를 tree 자료 구조로 만들기 위한 size를 계산하려는 것이다.
이것은 DTB에 존재하는 모든 node와 property에 대해서 각각
struct node + node 이름 문자열 길이, struct property + property 이름 문자열 길이에
필요한 크기가 size가 된다.
# ((__be32 *)mem)[size / 4] = cpu_to_be32(0xdeadbeef);
mem 공간의 마지막 4바이트 위치(맨 마지막)에 BigEndian으로 deadbeef를 설정한다.
deadbeef는 STACK_MAGIC이다.
# 문제의 3중 포인터 시간
unflatten_dt_node(blob, mem, &start, NULL, &allnextp, 0);
이곳은 두번 반복하게 되는데 우리는 두번째 패쓰는 [Second.root] 로 주석을 표기한다.
# *allnextp = NULL;
allnextp는 어떤 노드에서도 할당하지 않았고. 따라서 추정컨데
의미로 보면 모든 node가 allnextp를 가리켜야 할듯 싶은데,
마지막 np->allnextp에 null을 넣는다.
근데 이게 이상해서 다들 생각보니.
처음은 *** allnextpp → ** allnextp → *of_allnodes
다음은 *** allnextpp → ** allnextp 에서 여기서 np->allnext를 가리키게 되고
그다음은 *** allnextpp -> **allnextp 에서 np-allnext -> allnext 를 가리키게 된다.
그림 (사진) 참조
댓글 없음:
댓글 쓰기