답변:
커널은 제조업체마다 다릅니다. 이러한 커널 중 상당수는 CAF에있는 순수 스톡 커널 라인 소스에서 나옵니다. 이들 제조업체가하는 일은 해당 소스를 가져와 사용 된 보드 / 칩셋에 따라 수정하고 자체 드라이버를 구현하는 것입니다.
주변을 잘 살펴보십시오. 터치 스크린의 변형, 와이파이 칩셋의 변형, 말할 것도없이, 가속도계, 센서, 배터리, 나침반, 사운드, 그래픽이 있습니다.
예를 들어 HTC에서 하나의 커널 소스를 가져 오면 Samsung에서 작동하지 않으며 그 반대도 마찬가지입니다.
제조업체는 회로 보드에 통합되는 다양한 비트를 자유롭게 선택하거나 아웃소싱 할 수 있습니다. 어려운 규칙이나 빠른 규칙은 없습니다. 따라서 커널이 제대로 작동하도록 많은 해킹 / 수정이 있습니다.
완전히 다른 볼 파크 게임이기 때문에 PCI, PCI-Express, SATA, VGA, SVGA, USB, 이더넷이있는 데스크탑 Linux 배포 커널과 비교해서는 안됩니다. CentOS 및 Android Linux Kernel과의 주요 차이점은 다음과 같습니다. 모든 드라이버는 모듈 또는 내장 모듈로 컴파일되므로 모든 Linux 배포판은 "제대로"작동합니다. 다시 말하지만, 데스크톱 리눅스 배포판 - 당신은 하나의 아키텍처가 - 86 따라서 델 PC 말에서 하나의 리눅스 커널을, 레노버의 상자 밖으로 작동 할 수 제공 늪지 표준 드라이버가 컴파일됩니다.
안드로이드 세계에서는 ARMv6, ARMv7, TEGRA, EXYNOS와 같은 특정 ARM 칩셋을 위해 빌드 된 다양한 커널이 있으며 EXYNOS가 있으며 서로 호환되지 않는 바이너리입니다. 따라서 커널이 TEGRA 용으로 컴파일 된 경우 잊어 버리면 ARMv7에서는 작동하지 않습니다!
안드로이드의 일부 커널이 "깨진"것처럼 보이는 이유는 제조업체에 달려 있습니다. 일부 (Zte는 매우 좋은 예 중 하나임) 소스에서 컴파일 할 수 있지만 GPLv2 또는 GPLv3 라이센스에 포함되지 않은 드라이버가 없어서 부팅에 실패하는 정육점 소스를 릴리스합니다. 이것이 문제입니다. 따라서 일부 해커는 github 주위를 탐색하여 단서를 찾아야합니다. 전부는 아니더라도 일부 제조업체는이를 준수합니다. Zte 소스의 현재 화신은 2.6.35.7이 될 것으로 예상되지만 실제로 실제로 많은 수정 사항이있는 2.6.32.9 소스 기반은 2.6.35.7의 실제 커널 소스를 나타내지 않습니다!
제조업체는 GPLv2 이상을 준수 할뿐만 아니라 오버 클로킹 기능 추가와 같이 커뮤니티가이를 수정할 수 있도록 각 소스를 출시해야합니다.
따라서 장면과 드라이버가 작업에 그걸 얻기 위해 노력하고 약 장난을 많이 뒤에이 참여 해킹 것이 아니 쉽게 디버깅 중 ... 일부 드라이버는 크로스 라이센스 수 있습니다, 하지만 조항 및 조건 등에 따라 배포 할 수 없습니다 협상했다.
고맙게도, 안드로이드 드라이버가 이제 주류 소스에 통합되어 있기 때문에 커널 3.xx 소스 라인으로 변경되었습니다. 그러나 문제가 있습니다!
약 12-18 개월 된 기존 핸드셋에 3.xx 커널을 이식하십시오. 지옥에서는 눈덩이가 작동하지 않을 것입니다. 왜냐하면 다른 요인으로 인해 3.xx 소스가 2.6.x 소스와 크게 다르고 작동하기 위해 많은 해킹이 필요하기 때문입니다. Zte Blade의 2.6.38.6 소스 포팅에 실패했습니다.
마찬가지로, 최신 커널 릴리스 3.0.1-Modaco에서 ics4blade 프로젝트를 작업 할 때 수많은 포팅을 시도했지만 Zte가 소스를 매우 엉망으로 만드는 것이 불가능하다는 단순한 사실에 달려 있습니다. .
PC 아키텍처는 특정 제품인 IBM PC의 복제본으로 시작하여 호환되도록 설계 되었기 때문에 필수 부품을 중심으로 구축되었습니다. 일반적으로 PC 호환 프로그램에서 주변 장치 나 프로그램을 가져 와서 다른 PC에 넣고 작동 할 수 있습니다. 이 능력은 기술이 발전하더라도 사람들이 계속 요구할 정도로 유용합니다. PC 복제본에 ISA 카드를 넣을 수있는 것처럼 최신 PC에 PCI Express 카드를 넣을 수 있습니다.
스마트 폰에는 그러한 역사가 없습니다. 이 제품은 모 놀리 식 제품으로 설계되었으며 "있는 그대로"작동하는 하드웨어와 소프트웨어로 구성된 완벽한 시스템입니다. 사람들이 한 전화기에서 부품을 꺼내 다른 전화기에 넣을 것으로 기대할 필요가 없으므로 엔지니어는 제품을 설계 할 때 상호 운용성을 고려할 필요가 없습니다.
Linux 커널 소스 트리 내에서도 ARM 플랫폼 용 드라이버에는 많은 조각화가 있습니다 . 전화는 대개 비공개로 설계 되었기 때문에 다른 회사의 엔지니어링 팀은 종종 중복 작업을 수행하여 경쟁사와 기본적으로 동일한 하드웨어를 설계 한 다음 자체 설계를 위해 자체 드라이버를 작성합니다. 작업이 완료되고 제품이 출시되면 바로 다음 작업을 진행합니다. 과거 제품의 드라이버를 리팩토링하거나 경쟁사의 드라이버와 병합 할 때가 아닙니다. 결과는 비슷하지만 완전히 동일하지 않은 장치를위한 수많은 일회성 드라이버입니다.
또한 스마트 폰은 일반적으로 프로세서와 함께 특수화 된 하드웨어가 통합 된 SOC를 기반으로 합니다. 이 중 일부의 경우 특정 드라이버를로드할지로드하지 않는 것이 문제가 될 수 있습니다. 커널 전체를 하나의 SOC에서 실행하기위한 특수 구성 옵션으로 빌드해야 할 수 있으며, 다른 SOC에서 실행하는 데 필요한 특수 옵션과 호환되지 않습니다.
그 이유는 Android의 Linux 커널은 일반적으로 Android 자체에서 컴파일되지 않고 다른 컴퓨터에서 크로스 컴파일되어야하기 때문입니다. 컴파일 시간에 장치 구성을 사용할 수없고 공간 제한으로 인해 모든 드라이버로 일반 커널을 컴파일 할 수 없기 때문에 여러 가지 문제가 발생합니다 (대부분의 데스크톱 배포판은 모든 드라이버가 initramfs에서로드 된 모듈로 컴파일 된 것임) . 따라서 개발자는 각 특정 장치에 대해 어떤 드라이버를 패키지화해야하는지 파악해야했습니다. 뿐만 아니라 각 드라이버에는 일반적으로 다양한 드라이버 기능을 토글 할 수있는 컴파일 시간 옵션이 12 개 정도 있으며 제조업체는 일반적으로 공식 구성을 공개하지 않습니다 (가장 나쁜 범죄자는 드라이버를 공개 소스로 만들지 않거나 업스트림 상태를 유지하지도 않습니다) 최신 드라이버 사본).
특정 실시간 타이밍 요구 사항 등을 가진 하드웨어 하드웨어로부터 사용자를 보호하는 커널이 없기 때문에 드라이버 프로그래밍은 응용 프로그램 프로그래밍보다 훨씬 어렵습니다. 하드웨어의 어려운 실시간 이벤트; 이러한 누락은 버그 또는 성능 문제로 나타날 수 있습니다.
또 다른 문제는 이진 비 호환성입니다. 이진 비 호환성의 두 가지 원인이 있습니다. 첫 번째는 CPU 유형이며 t0mm13b에서 잘 다루고 있지만 이식과 관련이있는 다른 문제는 ABI 비 호환성 (응용 프로그램 이진 인터페이스)입니다. 제조업체가 드라이버를 오픈 소스하지 않으면 개발자는 스톡 ROM에서 컴파일 된 모듈을 사용해야했습니다. 드라이버 모듈 자체에는 struct 레이아웃 및 함수 호출 매개 변수와 같은 특정 기대치가 있으며 커널을 컴파일 할 때 드라이버를 작성할 때 ABI를 설명하는 헤더 파일이 없으므로 다양한 ABI 비 호환성 문제가 발생합니다. 컴파일 따라서 개발자는 드라이버를 리버스 엔지니어링하여 헤더 파일을 만들거나 소스 트리에서 헤더 파일을 크게 수정했을 수 있습니다. 드라이버가 컴파일 된 후 개발자는 이러한 수정 사항을 되돌려 커널이 드라이버의 ABI와 다시 호환되도록해야합니다. 소스에서 컴파일하는 것과 달리 바이너리 드라이버 컴파일은 함수 매개 변수 불일치 또는 구조체 비 호환성으로 인해 컴파일 오류를 트리거하지 않으며 장치가 실행되는 동안 단순히 장치를 중단하기 때문에 이러한 문제를 디버깅하는 것은 매우 어렵습니다. PC 세계에서 우리는 바이너리 전용 드라이버를 공개해야한다는 주장 때문에 nVidia와 ATi가 우리를 떠난 혼란에 익숙합니다. 모든 드라이버에 대한 혼란을 상상하고 그것이 만들어내는 "재미"를 상상하십시오.
PC 하드웨어는 일반적으로 모바일 하드웨어보다 표준화 수준이 높으며 대부분의 PC에는 진동기, 가속도계, 자이로 스코프, 3G 라디오, 근접 센서, NFC 등을위한 드라이버가 필요하지 않습니다. 3G가있는 장치에서도 일반적으로 PCMCIA 또는 PCI-E와 같은 연결.
글쎄 .. 드라이버와 커널은 정확히 같지 않습니다.
드라이버는 셀 안테나, Wi-Fi, 블루투스 등을 제어하는 것입니다.이 드라이버는 제조업체가 하드웨어와 통신 할 방법 (드라이버)을 만들어야하기 때문에 독점 드라이버입니다.
커널은 OS / 응용 프로그램과 실제 드라이버 (또는 CPU 또는 메모리 또는 기타 하드웨어) 간의 중간 수준입니다. OS / 앱이 이러한 하드웨어 구성 요소와 인터페이스 할 수 있도록합니다.
당신이 보는 수백만 개의 커널은 실제로 서로 크게 다르지 않습니다. 일반적으로 프로그래머 / 모듈러는 기존 커널을 가져 와서 "조정"하여 다른 성능을 얻습니다. 기본적으로 커널의 "구성"만 조정한다고 말할 수 있습니다. 안드로이드 세계에서, 이러한 모더는 CPU 클럭 오버 또는 언더 클럭킹 (배터리 수명을 절약하거나 비디오 게임 에뮬레이터 또는 비디오 재생과 같은 대부분의 프로세스 집약적 애플리케이션을 실행하려는 경우) 또는 volting (원래의 설정 매개 변수 밖에서 CPU를 실행하여 배터리 수명을 절약하기 위해 ... 두 개의 CPU가 정확히 100 % 동일하게 만들어지지 않기 때문에 실제로 사람마다 다릅니다.