Linux에는 안정적인 시스템 호출 ABI가 있지만 Windows에서는 Win32 ABI가 안정적이고 즉시 커널 공간에 들어가지 않도록 보장합니다. nt.dll과 같은 Windows의 하위 수준 기능은 Windows 업데이트나 Windows 버전 간에 변경될 수 있습니다.
FreeBSD 커널이나 Mach와 같은 다른 커널에 대해 알고 싶습니다. 안정적인 시스템 호출을 제공합니까, 아니면 POSIX 인터페이스에 안정적인 ABI만 제공합니까?
답변1
일반적으로 대답은 다음과 같습니다.아니요, 운영 체제 개발자는 호환성 문제로 인해 우호적일 수 있습니다. 그러나 그것에 의존해서는 안됩니다.
FreeBSD
아니요.
업그레이드 프로세스와 소스 코드 변경이 최대한 중단되지 않도록 노력하고 있지만 한 버전에서 다음 주요 버전으로의 API 및 ABI 호환성은 보장되지 않습니다.
https://wiki.freebsd.org/VendorInformation
오픈BSD
아니요, 승인되지 않은 시스템 호출은 libc
강제로 금지됩니다.
여러 가지 방법으로 execve()를 직접 호출하기 어렵게 만들었습니다. 커널로의 진입은 libc 시스템 호출 스텁 내의 정확한 시스템 호출 명령을 통해 이루어져야 합니다. 이 시스템 호출 명령어 이전에 SYS_execve 명령어가 레지스터에 로드됩니다. 일부 아키텍처에서는 PLT 연결 가능 스텁이 여러 가지 방법으로 트리거될 수 있는 retguard 검사를 수행합니다. 스택 피벗은 다른 검사로 인해 대부분 차단됩니다. SYS_syscall(시스템 호출 레지스터 = 0)을 통한 진입도 불가능합니다.
https://marc.info/?l=openbsd-tech&m=169841790407370&w=2
시스템 호출 소스 검사 도입2019년 말부터.
네트워크BSD
아니요.
이 시스템 호출은 C 라이브러리에 항목이 없는 새로운 시스템 호출을 테스트하는 데 유용합니다. 일반 응용 프로그램에서는 사용하면 안 됩니다.
https://man.netbsd.org/syscall.2
애플 시스템
아니요, 그런 적이 있습니다.그 전에 쉬는 시간.
Apple은 Mac OS X에서 정적으로 링크된 바이너리를 지원하지 않습니다. 정적 연결 바이너리는 커널 시스템 호출 인터페이스에서 바이너리 호환성을 가정하지만 이는 보장되지 않습니다. 대신, 우리는 동적으로 연결된 모든 시스템 라이브러리 및 프레임워크에 대한 바이너리 호환성을 보장하기 위해 노력합니다.
https://developer.apple.com/library/archive/qa/qa1118/_index.html
답변에스키모인Apple 직원은 이것이 여전히 사실임을 확인했습니다.
Apple 도구는 정적 라이브러리를 지원하지만 전체 실행 파일의 정적 링크는 지원하지 않습니다[1].
libSystem
커널에 액세스하려면 모든 프로그램이 시스템 프레임워크(일명 )에 연결되어야 합니다 . Apple은 이 레이어에 대한 바이너리 호환성만 보장합니다. 정적으로 링크된 실행 파일은 시스템 호출을 직접 수행해야 하며 여기서는 바이너리 호환성을 보장하지 않습니다.
https://developer.apple.com/forums/thread/706419
솔라리스와 일루모스
아니요.
공식적으로 지원되는 유일한 시스템 호출 방법인 Solaris 및 Illumos도 C 라이브러리를 통해서입니다.
https://utcc.utoronto.ca/~cks/space/blog/programming/GoCLibraryAPIIssues
보다 권위 있는 소스로서 이 2010년 이메일에는 수동 시스템 호출이 지원되지 않는다고 명시적으로 명시되어 있습니다.
Andrew, 시스템콜 번호를 유지하거나 재활용하는 실제 "공식적인" 방법은 없습니다
.시스템 호출 번호는 문서화되지 않은/커밋되지 않은 인터페이스입니다.
우리는 타사 시스템 호출을 지원하지 않으며 지원한 적도 없습니다. ISV는 필요할 때 스스로 행동해야 하며, 커밋되지 않은 인터페이스를 사용하고 있으며
커널 패치를 통해 손상이 발생할 수 있다는 사실을 직시해야 합니다. 시스템 호출 테이블의 내용이
변경된 경우 제3자에게 알리지 않습니다. 이는 안정적인 인터페이스가 아닙니다.
https://www.cs.cmu.edu/afs/gco/archive/pipermail/port-solaris/2010-November/000009.html
AIX
있을 수 없습니다. AIX의 시스템 호출 계층에 대한 정보를 찾을 수 없습니다. syscall
여기서는 지원되지 않습니다(간접 시스템 호출). 시스템 호출은 AIX에서 동적으로 확장되는 것으로 보입니다.
주제: XView 3.0을 사용하는 RS/6000의 시스템 호출
syscall 문자열을 검색하여 모든 정보를 살펴보는 방식으로 info에 있는 정보를 읽었습니다. 그러나 내가 본 정보 중 일부는 IBM 외부에서는 사용하지 못할 수도 있습니다. 이것은 제가 찾은 내용을 다시 입력한 것입니다. 정확하다고 보장할 수는 없습니다.
---------- 10/02/91 AIX와 동등한 SUN 시스템 호출 루틴이 필요합니다.
프로젝트 번호: Q557045
... 문제:
SUN에서 실행되는 애플리케이션을 이식하려고 합니다.
프로그램 중 하나는 "syscall"이라는 루틴을 사용하여 낮은 수준의
읽기, 쓰기 및 fnctl 작업을 수행합니다.
이 작업을 수행하기 위해 RS/6000에서 무엇을 사용할 수 있습니까 ? 이 기능이나 이와 동등한 기능이 없으면
광범위한 해결 방법을 작성해야 합니다.답변: RS/600에는 "syscall" 시스템 호출 기능을
복제하는 데 사용할 수 있는 루틴이 없습니다 .
"syscall" 시스템 호출은
BSD의 간접 시스템 호출입니다. 즉, 첫 번째 매개변수는
커널이 수행해야 하는 다른 시스템 호출을 나타내고
후속 매개변수는 다른 호출에 전달됩니다.
시스템 호출 번호가
libc의 C 래퍼에 숨겨지지 않고 사용자 수준에서 표시되기 때문에 이는 본질적으로 이식 불가능합니다 . 시스템
호출 번호는 syscall.h에 정의되어 있습니다(
이 파일은 AIX V3에 포함되어 있지 않습니다). [커널은 동적으로 확장될 수 있고 확장되기 때문에]
이 호출을 사용하는 코드를 포팅하려면 어떤 호출이 이루어지는지 이해하고 시스템 호출의 자체 버전을 작성해야 합니다 . 이는 기본적으로
첫 번째 인수에 대한 스위치 문으로 구성되며
올바른 번호로 적절한 시스템 호출을 호출합니다. 인수의 .
수행되는 시스템 호출에 따라 varagrs.h(stdarg.h)를 적절하게 사용해야 할 수도 있습니다.
http://www.verycomputer.com/176_244b08fbb92e184f_1.htm
ld
또한 버전 간에 정적 링크가 호환되지 않는다는 경고도 표시됩니다.
노트: 다음 중 하나를 사용하여 [
noautoimp
또는nso
] 플래그를 사용하면 공유 객체 파일을 애플리케이션에 정적으로 연결할 수 있습니다. 정적으로 링크된 애플리케이션은 모든 수정사항 또는 릴리스 레벨에서 다른 수정사항 또는 릴리스 레벨로 바이너리 이식 가능하지 않습니다.
https://www.ibm.com/docs/en/aix/7.3?topic=l-ld-command
또한보십시오:https://blog.firetree.net/2005/07/21/static-linking-on-aix/