아직 끼우지 못한 단추가 남았습니다.

박한범 2010.11.30 01:31 조회 수 : 8218 추천:1

 

안녕하세요 ^^

여러가지 과정을 거쳐 어느정도 프로세서 초기화에 대한 감을 잡았습니다.

요즘에는 오히려 윈도우보다 리눅스 소스를 보고 있는데 아직 찾지 못하겠는 부분이 있어 질문드리고자 합니다.

 

전 질답에서는 전원이 인가되고 부터 CPU 초기화가 이뤄지고 BSP가 부트코드를 실행한다는 것을 알게 되었고,

또한 프로세서 구조체를 세팅하고 윈도우 같은 경우는 FS레지스터에 이 값을 저장해서 스케쥴러와 같은 코드에서

이용한다는 것을 알게 되었는데, 아직 윈도우에서 FS레지스터를 세팅하는 부분을 못 찾은 것 처럼

 

리눅스에서도 각 프로세서 구조체를 세팅하는 것과 스케쥴링시에 각 프로세서의 Run Queue 를 얻어오는 부분은 알아냈습니다.

그런데 알지 못하겠는건, 각 프로세서에 어떻게 자신의 Unique 한 RunQueue 를 얻어내냐는 것입니다.

#define this_rq()               (&__get_cpu_var(runqueues))

 

#define __get_cpu_var(var)

         (*SHIFT_PERCPU_PTR(&per_cpu_var(var), my_cpu_offset))

 

#define SHIFT_PERCPU_PTR(__p, __offset) RELOC_HIDE((__p), (__offset))

 

#define RELOC_HIDE(ptr, off)                                   

   ( { unsigned long __ptr;                                      

      __asm__ ("" : "=r"(__ptr) : ""(ptr)); (typeof(ptr)) (__ptr + (off)); })

 

#define per_cpu(var, cpu)

          (*SHIFT_PERCPU_PTR(&per_cpu_var(var), per_cpu_offset(cpu)))

#define per_cpu_var(var) per_cpu__##var

#define per_cpu_offset(x) (__per_cpu_offset[x])

 

위 매크로들은 sched_init() 에서 this_rq() 를 통해 current rq 를 얻어내는 부분이라고 생각하는 코드입니다.

 

런큐든 PCR 이든 참 특이하게 메모리를 chunk 로 얻어와 cpu 아키텍쳐에 맞는 offset으로 나누고,

memcpy 를 통해서 초기화 데이터를 복사하는 과정은 재밌있더군요.

 

어쨌든 결과적으로 얘기해서 각자 자신의 런큐를 얻거나, 혹은 수 많은 런큐 중에 프로세서에서 실행될 런큐를 선택하든지 제 생각에 리눅스 커널에서는 setup_per_cpu_areas() 를 통해서 만들어놓은 CPU 공간을 각 프로세서에 배정을 해줄거라고 생각했는데, 그런 로직은 보지 못했습니다.

 

 

343   for (i = 0; i < NR_CPUS; i++, ptr += size) {

344     __per_cpu_offset[i] = ptr - __per_cpu_start;

345     memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start);

346   }

 

 

어느 코드를 보던 -_- 제 눈에는 메모리에 값을 대입하는 걸로 밖에 안보이는데요.

리눅스에서는 프로세서 를 도대체 어떻게 관리하는건지 혼란스러워지네요 @_@;;

 

답변 부탁드립니다.

 

 

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 프로그래밍 관련 Q&A 게시판 입니다. woos 2016.04.09 22245
118 C 문법을 위반하는 경우가 생긴건지도 모르겠네요...뭐가 이러지?.. [6] 김영일 2010.12.06 7738
117 모듈오류가 나는데 이유가 뭔지 안잡히네요.. [5] 김영일 2010.11.30 14557
» 아직 끼우지 못한 단추가 남았습니다. [6] 박한범 2010.11.30 8218
115 HVM 실험 좀 부탁합니다. [6] 백창우 2010.11.17 6454
114 리눅스에서 armulator 구동하는 방법 김성오 2010.11.08 7660
113 arm에서 mmu 설정 문제... [1] 유대철 2010.11.03 9741
112 멀티프로세서+멀티코어에 대해 궁금한게 있습니다. [14] 박한범 2010.11.01 8789
111 멀티프로세서+멀티코어에 대해 궁금한게 있습니다!? [8] 박한범 2010.10.30 7672
110 리눅스 인터럽트 금지 해제 관련 [9] 홍문화 2010.09.30 11634
109 gcc 디버깅방법 [1] 피승현 2010.09.27 8820
108 컴파일러 최적화 부분에서... [2] 김국진이 2010.09.04 8666
107 특정 라이브러리만 정적링킹하도록... [3] 김경태 2010.08.17 9812
106 8차 스터디 인원 모집에 대해 문의 드립니다. [1] 신창호 2010.08.17 4837
105 address_space 구조체에 대한 질문 [9] 송원준 2010.07.27 9948
104 S3c2440의 USB host 기능 실현에 대한 질문입니다. 이죽송 2010.07.16 9451
103 커널 스터디에 관해 질문드립니다. 김진수 2010.07.16 5119
102 pgd_offset_K() 커널함수에 대한 질문입니다. [2] 백철민 2010.06.23 9942
101 커널 스터디에 참여하고 싶은데요.. [1] 박영현 2010.06.22 5516
100 dd명령어 써서 디스크 카피 할 시 신재욱 2010.06.16 7362
99 linux에서partition분할하지 않고 포멧한 경우 신재욱 2010.06.16 6379
XE Login