2013-09-27 5 views
16

내 운영 체제 클래스에서 사용자 모드에서 커널 모드로 전환하는 것이 권한이 있는지 묻습니다. 이것은 OS에 특정한 것이 아닙니다. 처음에 나는 네 생각하지만 내 교과서라고 큰 캐치 (22)처럼 보인다 : 하드웨어는 특권 명령은 커널 모드에서 실행 할 수 있습니다사용자 모드에서 커널 모드로 전환

. ...

커널 모드로 전환하는 명령은 권한이 부여 된 명령의 예입니다.

Gagne, Greg; 에이브 러햄 실 버스 셔츠; Peter B. Galvin (2010-01-26). 운영 체제 개념 (22 페이지 참조). Wiley Higher Ed. 킨들 에디션.

그래서 우리는 사용자 모드에서 시작합니다. 커널 모드로 전환하려면 권한이 부여 된 명령이 필요합니다. 권한이 부여 된 명령은 커널 모드에서 수행되어야하므로 커널 모드로 전환해야 커널 모드로 전환 할 수 있습니다.

나는 시스템이 사용자가 커널 모드로 직접 전환하는 것을 허용하지 않지만 사용자가 다른 권한있는 명령을 실행할 때 커널에 의해 수행된다고 생각하고 있습니다. 그 맞습니까?

+0

정말 오타입니다. – denis631

답변

6

이것은 제 8 판에서 소개되고 9 일에 보관 된 오타입니다. 일곱째 호에서는, 페이지 19 대신 말한다

는 "사용자 모드로 전환하도록 지시 특권 명령의 일례이다."

분명히 훨씬 더 의미가 있습니다.

+1

나는 그렇게 확신하지 않습니다. 제 7 판의 [정오표] (http://codex.cs.yale.edu/avi/os-book/OS7/os7c/online-dir/os7-errata.pdf)는 제 8 판 (따라서 제 9 판) 판이 맞다 ... (그것은 제 7 판에서 실수로 밝혀졌다.) – Ephemera

+0

@ephemera 사람들은 정오표를 유지하는 것은 아마 학생들이다. – atulgangwar

+1

커널 모드로 전환하는 데 권한이 필요하지 않다는 것이 더 합리적입니까 ?? (모든 프로그램에서 간단하게 할 수 있습니까?) – Rptk99

0

사용자 토지에서는 필요에 따라 커널 모드로 전환하는 커널에 대한 시스템 호출을 통해 권한있는 작업을 요청합니다. 사용자가 API를 사용하고 있고 커널이 권한있는 작업을 수행하고 있습니다.

3

일반적인 방법으로는 커널 모드로 전환하지 않고 시스템 서비스를 요청하는 지침 세트가 보통 있습니다. 그래서 이들은 커널 모드로 전환하지만, 사용자 코드에 의해 호출되기 위해 운영 체제에 의해 설정된 일부 기능을 호출하는 맥락에서만 가능합니다.

대부분의 최신 시스템에서 위와 같이 운영 체제 호출을 수행하는 특정 기능 부분을 구현하는 API 계층에 의해 숨겨져 있습니다.

그러나 일반적으로 사용자 코드는 "이 시점부터 커널 모드로 실행하고 싶습니다."라는 말을하는 것은 불가능합니다.

+0

그래서 다른 시스템 서비스를 호출하기 위해 커널 모드로 전환하는 지침이 있지만 문제는 여전히 해결되지 않는다는 것을 의미합니다. IMO. 커널 모드로의 전환이 특권 명령 인 경우 아무도 사용자 모드에서 그렇게 할 수 없습니까? 완전히 혼란스러워 ... – denis631

30

사용자 모드에서는 커널 모드로 전환 할 수 없습니다. 사용자와 커널 간의 상호 작용은 시스템 호출을 통해 수행됩니다. 각 시스템 호출은 하나의 정의 된 서비스를 제공합니다. 사용자는 서비스 이름 (일반적으로 숫자)과 필수 매개 변수를 보냅니다. 이것이 실제로 어떻게 수행되는지를 보여주는 실례입니다. x86 AT & T 스타일 어셈블러입니다.

시스템 호출 이름을 EAX 레지스터로 이동하고 매개 변수 포인터를 CPU의 EBX 레지스터에 넣은 다음 소프트웨어 인터럽트 번호 42를 내 보냅니다. 인터럽트 처리는 커널 모드로 전환합니다. 인터럽트 번호는 인터럽트 설명자 테이블 (IDT)에서 조회되고 거기에 등록 된 함수 인 syscall 핸들러를 호출합니다. 이 핸들러는 커널 모드로 실행됩니다. 사용자 모드로 돌아 가면 코드는 EAX의 내용을 변수 ret로 옮깁니다.

pok_ret_t pok_do_syscall (pok_syscall_id_t syscall_id, pok_syscall_args_t* args) 
{ 
    pok_ret_t ret; 
    uint32_t args_addr; 
    uint32_t id; 

    args_addr = (uint32_t) args; 
    id  = (uint32_t) syscall_id; 

    asm volatile ("movl %1,%%eax \n\t" 
       "movl %2,%%ebx \n\t" 
       "int $42  \n\t" 
       "movl %%eax, %0 \n\t" 
       :"=g"(ret) 
       :"g"(id), "g"(args_addr) 
       : "%eax" , "%ebx" 
       ); 
    return ret; 
} 

OS Dev wiki에 대한 자세한 내용은 여기를 참조하십시오.

커널로 전환하는 것이 아니라 커널에게 사용자를 대신하여 작업하도록 요청할 수 있습니다. 그리고 커널은 그것이 완료되었는지 여부를 알려줍니다.

+1

이것은 정답이며 많은 도움이되었습니다. 고맙습니다! –

+0

그래, 그게 훌륭한 답변이지만, 모드 비트는 어때? 언제 변하지 ... –

+0

@BaradwajAryasomayajula [CR0.pe] (http://wiki.osdev.org/CPU_Registers_x86#CR0)를 의미합니까? ? 이 점이 왜 당신과 관련이 있습니까? 아마도 이것은 별개의 질문입니다. 나는 정확한 답을 줄 수는 없지만, CPU에 의해 실행되는 명령 "int"는 인터럽트를 일으키고, 커널 모드로 전환을 시작한다. 자세한 내용은 [Intel 설명서] (https://www-ssl.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)를 참조하십시오. – Philipp

관련 문제