[완료]idt_table 초기화
글쓴이: jungwook / 작성시간: 토, 2009/09/26 - 10:56오후
안녕하세요. 현재 UTLK로 커널을 공부하고 있는 학생입니다.
4장의 인터럽트 벡터 테이블 초기화 부분인데 이해가 안되는 부분이 있어서요.
이 코드의 요점이 idt_table을 ignore_int() 인터럽트 핸들러를 가리킨가는 거라는데,
rp_sidt: 부분은 루프로 알겠는데
setup_idt 부분이 이해가 되지 안네요..
setup_idt:
lea ignore_int, %edx <------------ 요 줄부터
movl $(_ _KERNEL_CS << 16), %eax
movw %dx, %ax /* selector = 0x0010 = cs */
movw $0x8e00, %dx /* interrupt gate, dpl=0, present */
lea idt_table, %edi <------------- 요줄까지..
mov $256, %ecx
rp_sidt:
movl %eax, (%edi)
movl %edx, 4(%edi)
addl $8, %edi
dec %ecx
jne rp_sidt
ret
도움 좀 부탁드립니다.좋은 밤 되세요.
Forums:
간단히 설명하면
인터럽트 게이트 디스크립터의 형식에 맞게 정보를 설정하는 것입니다.
디스크립터는 8 바이트 크기이므로 eax는 하위 4바이트, edx는 상위 4바이트에 대응합니다.
; ignore_int()의 주소를 edx에 저장
lea ignore_int, %edx
; 세그먼트 셀렉터를 eax의 상위 2바이트에 저장
movl $(__KERNEL_CS << 16), %eax
; edx의 하위 2바이트(dx)를 eax의 하위 2바이트(ax)에 저장
; -> offset[0:15]에 해당 (주석 위치가 바뀐 듯)
movw %dx, %ax /* selector = 0x0010 = cs */
; edx의 하위 2바이트에 각종 플래그들을 설정
; 상위 2바이트는 그대로 남아있으므로 offset[16:31]에 해당
movw $0x8e00, %dx /* interrupt gate, dpl=0, present */
; edi에 idt_table의 주소를 저장
lea idt_table, %edi
댓글 달기