항상 공부하고 나면 먼가가 남아야 하는데 그냥 스치고 지나가는
기억들이 항상 아쉽지 않으시나요?? (ㅋㅋ 저만 그런가??)
조금이나마 더 남아있으라고 공부한 내용에 대해서 정리를 해볼까하는데....
여러분들은 어떻게 생각들 하시는지 의견이 궁금하네요.
혼자서 하려면 힘들고 지칠테니 자신이 맞았던 부분에 대해서 올리는 걸로 했으면
합니다.
혹시 다른 좋은 의견이 있으신분은 바로 바로 답장올려주세요.. !!!
그럼 힘차고 즐거운 일주일의 시작 되시길... ㅎㅎ 이번주는 쉬는날이 하나더 있네요..
댓글 8
-
원민수
2007.02.26 22:17
-
송형주
2007.02.27 04:50
간만에 학부 때의 컴퓨터 구조 전공책을 찾아봤다는..
DMA의 전송 방식은 크게 두가지가 있더군요..
burst transfer 방식과 cycle stealing 방식
스터디에서 DMA에 대한 내용 중에 cycle stealing 방식이 의문에 해답이 될 수 있을듯 싶네요.
- DMA 전송시간 중에 CPU와 Memory는 데이터를 상호 전송할 수
없으므로, CPU의 버스는 HOLD상태에 있게 된다.
- 이와 같이 되면 CPU가 처리할 명령어 및 처리할 데이터가 메모리에
있으므로, 원래의 목적 ( 입출력 데이터 전송에 관계 없이 CPU가 계속
동작)에 문제가 있게 된다.
- 이러한 문제를 해결하기 위하여 CPU 동작 시 메모리와 관계없는
사이클에 만 DMA의 수행을 하게 하며, 이 밥법은 CPU의 Cycle을
도용한다고 하여 Cycle Stealing이라고 한다.
-
송형주
2007.02.27 04:51
정수씨..멋지넹 ^^ ㅋㅋ
이제..퇴근해서, 공부해야징..~~ 수고여.. -
김정수
2007.02.27 08:03
ㅋㅋㅋ 별말씀을요..
이제부터가 더중요한데요..
자자 열공합시다.
백창우님의 포도주 먹어야죠~~~
맛있겠다..
송형주님 뒷풀이 못가셔서 아쉬워요..
나중에 따로 좋은자리..?? ㅋㅋㅋ -
지현구
2007.02.27 19:10
제가 메모해 두었던 질문들입니다.
1. 리눅스 커널에 x86 TLB를 관리하는 코드가 따로 있는가, 아니면 TLB는 완전히 하드웨어적으로만 관리되고 kernel에게는 투명한가? (x86에서 TLB를 관리하기 위한 기계어 인스트럭션 및 CPU레지스터들은 존재한다고 알고 있습니다)
2. 'TLK' 본문에 의하면, 프로세스에 pend된 signal이 실제로 처리되는 시점이 "시스템 콜 처리를 마치고 유저 모드로 돌아가기 직전" 이라고 되어 있는 것 같다 (pdf 58페이지 네 번째 단락). 이 말이 맞는가? (hardware interrupt나 exception 처리를 마친 후에도 signal pend 여부를 체크하지 않는지요?)
3. DMA 전송 중에 CPU가 어떤 종류의 다른 일을 할 수 있는가?
4. DMA와 cache coherency 문제
5. "Kernel mode에서는 page table을 사용하지 않는다" 라는 문장이 맞는가? -
선준규
2007.02.27 23:37
정말 대단하시군요^^ 다들 열심이시네요..
전 아는게 없어서 더 열심히 해야하는데 하루종일 뭐하고 지내는지...;;
저도 지난번 스터디때 생겼던 질문거리들에 대해서 생각해 보다가 지현구님이 올리신 스터디중 나왔던 의문점들에 대해 두가지 정도 알아보았습니다. 제가 워낙 부족하다보니 제가 이해한것이 맞는지 모르겠네요
1. 먼저 리눅스 커널에 tlb를 관리하는 코드가 있는 걸 보니 완전히 하드웨어적으로 관리되는것은 아닌것 같네요.. 다만 TLB miss가 나는 경우에 아키텍쳐 별로 핸들링 하는 부분이 두가지로 나뉘더군요..
Hardware TLB miss handling 와
Software TLB miss handling
가 바로 그것인데 첫번째 방법은 하드웨어가 tlb miss를 처리하는경우로 cpu가 페이지 테이블로 직접가서 해당 페이지테이블 엔트리를 가져옵니다. 만약 해당페이지가 없을땐 페이지 폴트를 발생시키고 제어가 운영체제로 넘어갑니다.
그리고 두번째 방법은 소프트웨어적으로 tlb miss 를 처리하는 경우로 cpu는 단순히 TLB miss fault를 발생시키고 이를 운영체제가 처리하게 됩니다.
좀더 자세한 내용은
target=_blank>http://www.phptr.com/articles/article.asp?p=29961&seqNum=4&rl=1
을 참고하시기 바랍니다. 이 링크에 TLB관리 관련 코드들이 약식으로나마 나와있네요.
3. 제가 알기로 DMA가 버스를 잡고 있을 땐 CPU는 그냥 '논다'가 맞는 것 같습니다. 간단히 레지스터에 어떤값을 로드하는 것에도 버스가 필요한데 버스없이 CPU가 할수 있는일은 거의 없다고 생각됩니다. 송형주님이 말씀하신 것처럼 파일을 카피중 다른 작업을 할수 있는것은 dma가 싸이클 스틸링방식을 이용하기때문인 것 같습니다
(어디까제나 제 생각입니다. 틀리면 말씀해주세요 ㅜㅜ)
5. "Kernel mode에서는 page table을 사용하지 않는다"가 맞는것 같습니다.
target=_blank>http://kerneltrap.org/node/6404
이 쓰레드가 그에대한 대답이 될수 있을것 같군요...
-
지현구
2007.02.28 11:51
1. 커널의 TLB 관리와 관련해서는 '리눅스 커널의 이해' 개정3판 (ULK 책의 번역본을 말합니다) 의 p.95~p.97에 나오네요.
2. 위 책의 p. 198~p.203 및 p.424를 보면, 시스템 콜을 처리하고 유저모드로 복귀할 때 뿐만 아니라 인터럽트나 익셉션을 처리하고 유저모드로 복귀할 때에도 대기 중인 시그널이 있는지 검사하여 있으면 그것을 처리하는 것으로 보입니다.
3. 위 책 p.559를 보면 "CPU와 DMA 회로가 동시에 같은 메모리 위치에 접근하려 할 때 발생하는 충돌은 메모리 중자자라는 하드웨어 회로가 해결한다" 라는 문장이 있습니다 (그 뒤의 괄호에서 참고하라는 "원자적인 연산"은 p.211에 나옵니다). 이 내용들로부터 미루어 짐작컨대, CPU"들"과 DMA 버스마스터가 동시에 메모리 버스를 사용하는 것 같습니다. 그러다가 그 중 복수개가 같은 주소를 액세스하려 하면 메모리 중재자 회로가 알아서 그 액세스들을 serialize해주는 것으로 보입니다.
4. DMA와 cache coherency에 대해서는 위 책 p.561의 "캐시 일관성"부터 p.562까지에 나오네요.
5. 커널에서 사용하는 페이지 테이블에 대해서는, 같은 책의 p. 88 마지막 단락부터 나오기 시작합니다. 여기에서부터 다음 절("커널 페이지 테이블")까지를 읽어 보면, 커널 모드에서도 현재(current) 프로세스의 페이지 테이블을 그대로 사용하는 것 같습니다. 그런데 그 페이지 테이블 중에서 커널주소영역을 매핑하는 엔트리들(즉, 가상주소 0xc0000000~0xffffffff를 매핑하는 엔트리들)은 어떤 프로세스의 페이지 테이블에서든 모두 같은가봅니다 (커널 마스터pgd란 것의 카피라고 하는 것 같죠?)
결국 이 책에 따르면, 커널 모드에서도 페이지 테이블을 사용하고 가상 주소를 사용하는 게 맞다고 보입니다 (사실 그럴 법 한 것이, 만약 커널에서 물리 주소를 그대로 쓴다면 디바이스 드라이버 코드 등에서 자기 자신의 변수 주소를 virt_to_phys 따위의 함수에 넣어 줄 이유가 없겠지요). -
지현구
2007.03.23 10:09
3번에 대하여 추가합니다. 같은 책 p.58을 보면 중간뜸에 있는 단락에서 memory arbiter(메모리 중재자)에 대해 언급을 하고 있습니다. 그런데 여기를 읽어보아도 명확하진 않네요.
DMA가 이루어질 때에 실제로 하드웨어가 어떤 식으로 작동하는지 정말 궁금하네요.
.
일단 메모리에서 페이지 단위(기본적으론 4k)로 하는 이유는 internal fragmentaion과 External fragmentation을 위한 것입니다. 이 부분에 대해서 각자 찾아보시기 바랍니다. OS 이론에 대부분 나오는 내용이니 OS 관련 책자를 참고하시면 될거 같습니다.
그리고 두번째로 DMA에 대한 내용이 나왔었는데 어떤 분이 DMA 컨트롤러를 사용하기 때문에 메모리 버스 역시 따로 사용한다 라고 말씀하신 걸로 기억합니다. 실제로 i/o 작업을 수행시킬 경우 i/o 버스에다가 명령을 내려놓고 다른 잡을 수행합니다. 즉 i/o 작업은 cpu와 별개로 이루어지지요. 물론 i/o가 모두 일어나면 그 이후에 interrupt를 이용해서 cpu에게 알려주고 그 이후의 작업을 다시 하도록 되어 있습니다. 몇가지 좀더 있었던거 같은데, 기억이 나질 않네요. 이 부분에 대해서 기억하시는 분은 리플로 달아주시면 그것에 대해서 다시 한번 토론을 해보는 것도 좋을거 같습니다.
제가 알고 있는 내용에서 틀린 점이 있다면 정정 부탁드립니다.