2010-03-19 7 views
23

CPU 사용자 모드에서 커널 모드로 전환 : 정확히 무엇을합니까? 어떻게 전환됩니까?CPU 사용자 모드에서 커널 모드로 전환 : 정확히 무엇을합니까? 어떻게 전환됩니까?

는 편집 :

이 경우에도 아키텍처에 의존 답변 나를 주시기 바랍니다. 아키텍처는 당신에게 달려 있습니다. 당신이 알고있는 건축에 대해 말해봐.

나는 모든 것이 그것에 관련 될 것이라는 생각을 갖고 싶습니다.

+1

아키텍처에 따라 다르며 반드시 OS 종속적 일 필요는 없습니다. –

답변

28

참고 : 이것은 주로 x86 아키텍처와 관련이 있습니다. 다음은 다소 단순화 된 설명입니다.

전이는 일반적으로 다음 중 하나에 의해 발생

:

  • 장애 (예를 들면 페이지 오류 또는 명령의 실행에 의한 다른 예외)
  • 인터럽트 (예를 들어 키보드의 인터럽트, I/O 마무리)
  • 트랩 (예 : 시스템 호출)

무엇 일반적으로 발생하면 해당 시스템이 인터럽트 디스크립터 테이블 (IDT)를 확인합니다. 각 예외 (인터럽트, 오류 등)에는이 테이블에 대한 색인을 생성하는 데 사용되는 번호가 있습니다.

이 테이블에서 CPU는 실행할 인터럽트 처리기를 결정할 수 있습니다. 다음의 변경 (일반적으로) 적용의 전이의 일부로서

: 커널

  • 스위치
  • EFLAGS를 스택
  • 코드 세그먼트 선택기 저장되고 EIP가 저장된다.
  • 스택 세그먼트 셀렉터와 스택 포인터가
  • 시작
  • 범용 레지스터 저장 인터럽트 핸들러를 실행에 저장됩니다 (핸들러의 역할은)
  • 세그먼트 셀렉터는 커널 사람 (핸들러의 작업)
로 변경

이제 커널 모드입니다. 도움이 :)

+1

인터럽트 처리기를 실행하는 동안 인터럽트가 비활성화되어 있습니까? 또는 우선 순위가 높은 인터럽트가 이미 실행중인 인터럽트 처리기를 인터럽트 할 수 있습니까? 실행중인 인터럽트 처리기에서 컨텍스트 전환이 가능합니까? –

+0

명확히하기 : "시스템이 인터럽트 설명자 테이블을 검사"할 때 "운영 체제"를 의미합니까? –

+0

@MartinThoma, 예, 지금 작동하는 OS 코드입니다. – fante

4

시스템에 따라 다르지만 일반적으로 일부 사용자 랜드 작업은 소프트웨어 인터럽트를 유발합니다. 이 인터럽트는 프로세서가 모드를 전환하고 커널 코드로 점프하여 커널 코드로 건너 뛰고 프로그램이 무엇을하려고했는지 (시스템 호출?) 확인한 다음 요청 된 동작을 수행하고 사용자 모드 코드로 점프합니다. 소프트웨어 인터럽트 이외의 다른 메커니즘도 전환을 유발할 수 있습니다. 예를 들어 선점 형 멀티 태스킹 시스템에서 타이머 인터럽트가 스케줄러가 실행되도록 트리거 할 수 있습니다.

+0

그렇다면 CPU가 커널 모드로 들어가는 유일한 두 가지 상황입니까? – claws

+0

@claws, 그것은 완전히 프로세서, 운영 체제 및 구현에 달려 있습니다. –

+0

인터럽트를 통해 발생하는 시스템 호출에 대한 설명은 다소 날짜가 있습니다. 이전 Linux는 인터럽트 0x80을 사용하여 시스템 호출시 커널 모드로 전환하는 데 사용되었습니다. 그러나 새로운 프로세서 (새로운 것> 펜티엄 2)와 리눅스 커널을 사용하면 sysenter, sysexit 명령을 통해 제공되는 "빠른 시스템 호출"기능을 사용할 수있게되었습니다. http://articles.manugarg.com/systemcallinlinux2_6.html – Jasmeet

1

Windows에서 시스템 호출을 할 때 라이브러리 루틴은 운영 체제 주소 공간에있는 커널 시작점을 호출합니다. 그런 다음 sysenter과 같은 특정 목적의 명령을 실행하여 CPU를 관리자 모드로 전환합니다. 기본적으로 플래그 레지스터에 비트를 설정합니다. 이렇게하면 OS가 권한있는 지시를 사용할 수 있습니다.

3

나의 이해는 그 세그먼트 레지스터가 두 개 LSB가 제로 커널 모드에서 실행됩니다 세그먼트 레지스터 어떤 프로그램이 두 개 LSB있는 동안 모든 프로그램 = 1 사용자에서 실행됩니다 것을

희망 방법. 실제로, 세그먼트 rgeisters의 두 LSB는 특권 레벨을 정의합니다 (최고 0에서 최저 3)

따라서 커널 모드에서 실행하려면 세그먼트 레지스터를 0010 hex로 설정해야합니다.). 나는 다른 것을 덮어 쓰지 않고 그 메모리 공간에 어떻게 프로그램을 배치 할 수 있을지 확신하지 못한다. 즉 링커가 어떻게 그것을 보장 하는가? 또한 사용자 모드 코드에서 커널 모드 코드를 호출하려는 경우 매개 변수를 전달하는 방법을 알아야합니다. 즉, 동일한 메모리 소이스를 사용하지 않으므로 메모리 참조로 데이터를 전달할 수 없습니다. 나는 그것을 레지스터에 전달해야한다고 생각합니다.

아무도 위의 틈을 메울 수 있으면 매우 감사 할 것입니다.

관련 문제