커널 모드에서 프로그램을 실행하면 표준 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