프로그램이 연결된 유일한 것은 커널 자체이기 때문에 커널 모드에서 프로그램을 실행하면 표준 C 라이브러리를 사용할 수 없습니다. 그래서 커널에 정의된 함수를 사용할 수 있습니다. 그러나 커널 자체는 C로 작성되고 특정 아키텍처용으로 컴파일된 프로그램입니다. 그리고 C 표준 라이브러리를 사용해서는 안 되지만, 드라이버는 로드 가능한 모듈이므로 어떠한 드라이버도 사용해서는 안 됩니다. 그래서 내 질문은 커널을 작성할 때 실제 C 함수가 사용되는 것입니다. 커널을 통하지 않고 하드웨어와 어떻게 상호 작용할 수 있습니까? 소스를 보라고 말하지 마세요. 나에게는 너무 다음 단계입니다, TY.
답변1
유닉스 커널은 전통적으로 다음을 포함했습니다.일부어셈블리 언어 코드. 최근에는 소스 코드를 보지 않았지만 여전히 사실인 것 같습니다.
보다드라이버는 실제로 하드웨어 장치와 어떻게 통신합니까? 해당 주제에 대한 개요를 확인하세요. 해당 질문에 대한 답변에서는 두 가지 종류의 컴퓨터 아키텍처에 대해 설명합니다. 포트 매핑 I/O(PMIO)를 사용하는 시스템에서 커널은~ 해야 하다부분적으로는 어셈블리 언어로 작성되어야 합니다. 몇 가지 매우 짧은 루틴을 사용하면 가능할 수도 있습니다. MMIO(메모리 매핑 I/O)를 사용하는 시스템에서는 장치 드라이버도 완전히 C로 작성할 수 있습니다. 포인터를 선언하고 이를 장치의 가상 주소와 동일하게 설정한 다음 사용하기만 하면 됩니다. 마치 메모리에 접근하는 것처럼 장치를 조작합니다.
답변2
모든 드라이버가 로드 가능한 모듈은 아닙니다. 로드 가능한 것은 단순한 옵션이지만 일부 중요한 드라이버는 동적으로 로드되지 않고 커널의 일부입니다.
답변3
커널은 libc가 제공하는 모든 기능을 자체적으로 정적으로 재현합니다.
사용자 모드 C 프로그래밍과 마찬가지로 함수는 하나의 컴파일 단위에서 정의될 수 있으며 다른 단위는 이를 간단히 참조할 수 있습니다(보통 헤더 파일을 통해). 컴파일러는 이를 정의되지 않은 참조로 만들고 링커는 이를 실제로 기호를 제공하는 컴파일 단위입니다.
커널 모듈 로딩은 다음과 같은 원리로 작동합니다.동적 로딩여기에 설명되어 있습니다. http://www.tldp.org/LDP/tlk/modules/modules.html