2014년 2월 12일 수요일

[Linux Kernel] 41주차 (2014.02.08) 후기

오래간만에 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 를 가리키게 된다.

그림 (사진) 참조

0208_1.jpg
0208-2.jpg

0208-03.jpg

댓글 없음:

댓글 쓰기