Linux에서는 x86 어셈블러를 작성하여 화면에 문자를 인쇄할 수 있습니까(표준 출력)?아니요어떤 시스템 호출이 사용됩니까?
x86 어셈블리에서는 입/출력 작업에 특권이 부여되어 있어 CPU가 RING 0이 아니면 작업을 실행할 수 없기 때문에 이것이 가능하지 않다고 생각합니다.
답변1
예, 아니오.
예 - 맞습니다. 운영 체제는 사용자 프로세스가 장치(이 경우 비디오)에 직접 액세스하는 것을 방지합니다.
아니요 - 신청서를 Ring Zero에 보낼 수 있습니다. 예를 들어 커널에 모듈로 제공하면 됩니다. 물론 표준 사용자 수준 애플리케이션은 아니지만 가능합니다.
답변2
현대 운영 체제의 초점은 파일 시스템, 파이프 및 터미널과 같은 유용한 추상화뿐만 아니라 사용자 프로세스 간의 메모리 보호 및 분리를 제공하는 것입니다. 그 중 일부는 프로세스 간 중개자 역할을 하여 이러한 추상적인 규칙이 시행되도록 하는 것입니다. 따라서 사용자 프로세스가 프로세스 외부의 항목과 상호 작용할 때마다 거의 항상 운영 체제를 거쳐야 하며 시스템 호출이 기본 방법입니다.
이제 몇 가지 해결책이 있습니다. 예를 들어, 공유 메모리 매핑을 사용하면 운영 체제 코드를 사용하지 않고도 프로세스 간에 데이터를 전송할 수 있습니다. 커널조차도 실제로 커널 코드를 호출하지 않고 일부 간단한 시스템 호출의 구현을 제공하지만 (AFAIK) 이는 읽기 전용입니다. 예를 들어 참조하십시오.Linux 유틸리티가 현재 시간을 얻기 위해 시스템 호출을 사용하지 않는 이유는 무엇입니까?
심지어 문제는 시스템 호출을 통해 수행되는 공유 매핑을 설정하는 것입니다(놀랍지도 않습니다). 프로그램 파일을 실행하면 메모리 맵이 파괴되므로 일반 독립 실행형 프로그램으로는 이를 수행할 수 없습니다. 한 코드 조각으로 설정을 수행한 다음 공유 지도를 통해서만 상호 작용하는 다른 코드 조각을 호출하면 됩니다. 두 번째 부분은 별도의 라이브러리 파일에서 로드할 수 있지만 그것이 중요한지는 모르겠습니다.