2013-02-26 2 views
3

커널이 시스템을 제어하는 ​​경우 어셈블리 언어는 어떻게 작동합니까?운영 체제에서 어셈블리가 어떻게 작동합니까?

어셈블리 언어는 특정 작업을 더 쉽게하기 위해 컴퓨터가 "이해하는"니모닉 모음 과 다양한 매크로로 소개됩니다.

요청을하지 않고도 어셈블리를 수행 할 수 없다면 CPU와 메모리를 제어 할 수 있습니다. ?

예를 들어 지침 mov ax, #4을 원한다면 그렇게하려면 OS에 요청을 보내려면 내 프로그램이 필요하지 않습니까?

나는 정말 호기심이 ...

고마워!

+3

CPU는 어셈블리를 이해하지 못합니다. 이것은 중간 형태이다. CPU는 기계 명령어를 이해합니다. 또한 시스템 호출을 어셈블리에 사용할 수 없다고 생각하는 이유는 무엇입니까? –

+0

그 점을 이해합니다. 그러나 레지스터를 사용하는 어셈블리 요청 권한이나 메모리 액세스/쓰기 권한 또는 CPU 작업을 수행 할 수있는 권한을 보지 못했습니다. 그러나 아래의 응답을 기반으로 커널은 커널이 할당 한 리소스 내에서 수행하는 작업을 보장합니다. 새로운 질문은 모든 명령이 커널을 거쳐야한다는 것입니까? – Dmitry

+1

무엇이든 수행하고 어셈블리를 컴파일하는 C 프로그램을 작성하면 액세스하려는 모든 것을 액세스하는 "어셈블리 프로그램을"볼 수 있습니다. 컴파일러와 어셈블러 사이의 어셈블리 단계를 "쳐다 보지"않은 경우 잘못된 권한 (응용 프로그램 공간에서 커널 코드를 실행하려고 시도)을 사용하면 더 이상 작동하지 않습니다. (대부분의 컴파일러, gcc는 확실히 어셈블리로 컴파일 한 다음 어셈블리로 저장하므로 모든 프로그램의 어셈블리 코드를 저장하고 저장할 수 있습니다). –

답변

7

CPU에는 리소스를 보호하기 위해 OS를 지원하는 메커니즘이 있습니다. x86 칩의 예제를 사용합시다. eax과 같은 "범용"레지스터는 보호되지 않습니다. 그러나 디버그 레지스터 (예 : DR0)가 있습니다.

OS가 실행 중일 때 CPU는 "ring 0"또는 일반 용어를 사용하기 위해 "시스템 모드"라고하는 사람들이 실행 중입니다. 프로그램은 x86에서 "ring 3"을 실행하거나 사람들이 "사용자 모드"라고 부르는 것을 실행합니다.

실행이 링 3에서 링 0으로 바뀌면 (자세한 내용은 나중에 설명합니다) CPU가 사용자 모드의 보호 기능을 중단합니다. 이것이 OS가 디버그 레지스터를 변경할 수있게 해줍니다.

그러나 OS가 보호하는 가장 중요한 것은 메모리 위치와 장치 입력/출력입니다. 이러한 이유 때문에 inout 명령어는 권한이 있으며 링 3에서는 실행되지 않을 수 있습니다.

메모리는 TLB를 통해 보호되며 사용자 모드에서 볼 수있는 가상 메모리 (VM) 주소 레인저를 정의하는데도 사용됩니다 프로세스. 각 프로세스에서 볼 수있는 메모리 공간을 제어하는 ​​것은이 테이블입니다. TLB 자체는 링 0 운영 체제 만 수정할 수있는 메모리에 저장됩니다. 유사하게, 인터럽트 벡터 및 임의의 메모리 - 맵 장치는 OS만이 액세스 할 수있는 메모리 범위에 할당된다.

실행하면 예 :, mov [eax], 3, eax가 참조하는 주소는 TLB에서 조회됩니다. CPU는 명령이 메모리에 합법적으로 액세스하는지 여부를 TLB의 액세스 비트 (예를 들어, NOEXEC 비트)로부터 결정한다.

OS 스케줄러에 의해 프로세스가 스왑 될 때, eax과 같은 범용 레지스터는 OS가 유지 관리하는 스레드 단위 메모리 영역에 저장됩니다. 전환 된 스레드는 이전 레지스터 값의 메모리 이미지에서 복원됩니다.

OS가 모든 기계 명령어를 방해하면 컴퓨터의 속도가 매우 느려질 수 있습니다. 특히, 일반 레지스터에 대한 액세스는 가능한 한 빨리 유지되어야합니다. 메모리 액세스에 대한 TLB 룩업은 캐시되고 메모리 액세스 자체보다 느리지는 않습니다.

링 3에서 링 0으로 전환하려면 소프트웨어 인터럽트가 생성됩니다. 이것은 "시스템 호출"인터럽트입니다. 인터럽트는 링 0에서 실행되며 첫 번째 프로세스가 시작되기 전에 OS에 의해 구성됩니다. 시스템 호출 인터럽트는 제어를 OS 코드로 넘깁니다. 실행이 인터럽트 서비스 루틴에서 돌아 오면 CPU는 링 3으로 되돌아갑니다.

+0

고마워, 그건 아주 좋은 설명이야 :) – Dmitry

+0

내 기쁨. :) –

5

프로그램은 ring 외부의 리소스/메모리에 액세스하지 않는 한 원하는 모든 명령을 실행할 수 있습니다. 그럴 경우 오류 (세그먼트 화 위반 또는 일반 보호)가 발생하고 커널에 의해 강제 종료됩니다.

1

어셈블리 언어는 C 나 파스칼 같은 프로그래밍 언어 일뿐입니다. 언어가 무엇이든 상관없이 프로그램을 실행하려면 컴퓨터에서 실행중인 프로그램이 해당 컴퓨터의 머신 코드에 있어야합니다. 대부분/대부분의 언어는 어셈블리 언어의 경우처럼 어셈블되거나 상위 레벨 언어의 경우와 같이 대상 시스템의 시스템 코드로 컴파일됩니다. 일부 언어 (Java, Python 및 Pascal의 경우)는 기계어 코드 인 중간 언어로 컴파일되지만 기계어 코드로 컴파일 된 프로그램에 의해 런타임에 해석됩니다. 그래서 여기서 다시 기계 코드가 기계에서 실행됩니다.

시스템 호출은 시스템 호출 및 메모리 제한 사항이며 다른 운영 체제 부과 된 제한 사항이 적용됩니다. 그래서 C 나 어셈블리 언어라면 파일을 열거 나 터미널에 물건을 인쇄하는 시스템 호출을 할 수 있습니다.

관련 문제