2017-10-24 3 views
1

나는 프로세서를 I2C에서 읽고, 임베디드 시스템에 DDR에 데이터를 저장하도록하고있다. 솔루션을 살펴 보았을 때, 나는 리눅스 장치 드라이버와 GNU C 라이브러리를 소개 받았다. 기본 glibc 시스템 호출로 수행 할 수있는 기본 Linux 드라이버로 수행 할 수있는 많은 작업과 비슷합니다. 나는 하나를 다른 것 위에 사용해야 할 때 다소 혼란 스럽다. 두 인터페이스 모두 사용자 공간에서 액세스 할 수 있습니다.디바이스 드라이버 대/dev + glibc 인터페이스

I2C 또는 USB와 같은 장치에 액세스하려면 커널 드라이버를 사용해야하는시기와 언제 GNU C 라이브러리 시스템 기능을 사용해야합니까?

답변

0

GNU C 라이브러리는 read, write, ioctl과 같은 함수 호출을 커널에 직접 전달합니다. 이 함수는 시스템 콜을 감싸는 아주 얇은 래퍼 일뿐입니다. 인라인 어셈블리를 사용하여 커널을 모두 호출 할 수는 있지만 거의 도움이되지 않습니다. 이런 점에서 커널 드라이버와의 모든 상호 작용은 glibc 기능을 통해 이루어질 것입니다.

특정 인터페이스와 그 절충점에 대해 궁금한 사항이 있으면 명시 적으로 지정해야합니다. ARM에서

+0

사용자 응용 프로그램에 적절한 glibc 파일을 포함하고 엄청난 양의 메모리를 할당하지 못하게하려면 어떻게해야합니까? 그들이 모두 시스템이라면 커널 공간에 대해 "특권을 가진"것이 무엇인지를 부르는 것입니까? 어떻게 관리하나요? –

+0

"일반적으로 i2c 장치는 커널 드라이버에 의해 제어되지만,/dev 인터페이스를 통해 사용자 공간에서 어댑터의 모든 장치에 액세스 할 수 있습니다." 언제 커널 드라이버 대 dev 인터페이스를 사용합니까? 대부분의 주변 장치에는 장치 인터페이스가 있습니까? –

0

:

특권이 상태는 프로세서에 내장되어 조립 명령을 통해 변경된다. 칩의 일부인 메모리 보호 장치는 권한 상태에 따라 임의의 메모리 범위에 대한 액세스를 허용하지 않도록 구성됩니다.

Linux 커널의 경우 모든 실제 메모리는 권한이 있습니다. 사용자 공간의 메모리 주소는 가상 (가짜) 주소이며, 권한 모드에서 한 번 실제 주소로 변환됩니다.

권한이 부여 된 메모리 범위에 액세스하려면 메커니즘은 함수 호출과 같습니다. 원하는 것을 나타내는 매개 변수를 설정 한 다음 ('SVC') - 프로그램의 제어를 제거하는 인터럽트 함수 사용자 공간은 커널에 제공합니다. 커널은 매개 변수를보고 필요한 것을 수행합니다.

표준 라이브러리는 기본적으로 전체 프로세스를 더 쉽게 만듭니다.

드라이버는 물리적 메모리 주소에 대한 인터페이스를 만들고 SVC 호출과 전달 된 '인수'를 통해 API를 제공합니다.

실제 메모리가 드라이버에 의해 예약되지 않은 경우 커널은 일반적으로 누구도 액세스하지 못하도록합니다.

권한이없는 실제 메모리에 액세스하면 "버스 오류"가 발생합니다.

BTW : UIO와 같은 드라이버를 사용하여 실제 메모리를 사용자 공간에 넣을 수 있습니다.

관련 문제