Mimari

AAOS'te VirtIO'nun desteklenmesi için gereken değişikliklerin çoğu, Android Common Kernel'de HAL uygulama düzeyinde ve altında yapılan değişikliklerdir. Android çerçevesi, AAOS konuk VM çekirdeğindeki VirtIO sürücülerini kullanarak donanımdan bağımsız genel bir HAL ile iletişim kurar. Bu sürücüler de VirtIO protokollerini kullanarak ana makine tarafındaki VirtIO cihazlarıyla iletişim kurar. Ana taraftaki VirtIO cihazları, SoC'ye özel cihaz sürücülerini kullanarak fiziksel donanıma erişebilir.

VirtIO sürücüsü ile VirtIO cihazı arasındaki iletişim, dağıtılmış toplama listelerinin DMA benzeri halka arabellekleri olan virtqueue ile gerçekleşir. Sanal makineler arasında VirtIO iletilerini değiştirmek için MMIO veya PCI gibi çeşitli aktarımlar kullanılabilir.

Bazı durumlarda, VM'ler arası iletişim için vsock kullanılır. Araç HAL (VHAL), Ses Kontrolü ve Dumpstate iletişimleri, vsock arayüzü üzerinden ayrı bir sanal makinedeki eş aracının bağlantısı kullanılarak desteklenir. Bu standartlaştırılmamış alt sistemlere erişmek için vsock üzerinden gRPC kullanılır. Android kaynak ağacındaki gRPC, vsock:CID:PORT_NUMBER adres biçimiyle vsock ile çalışacak şekilde değiştirilir.

Sanallaştırma mimarisi

Şekil 1. Sanallaştırma mimarisi.

Ses

Sanal AAOS'te Android konuk VM'si, sese erişmek için virtio-snd kullanabilir. virtio-snd, ses HAL uygulamasının TinyALSA kitaplığıyla sanallaştırılmış ses cihazlarıyla etkileşime geçebilmesi için Android VM'ye sanallaştırılmış PCM cihazları sağlar.

Varsayılan ses HAL uygulaması, AOSP'de /device/google/trout/hal/audio/6.0 konumunda bulunur. OEM'ler, platformları için ro.vendor.trout.audiohal.{in,out}_period_{ms,count} öğesini değiştirebilir. OEM'ler, /device/google/trout/aosp_trout_common.mk. içindeki sesle ilgili değişkenleri geçersiz kılarak kendi ses HAL'lerini de uygulayabilir.

Ses kontrolü HAL'si, AAOS'teki ses odağını yönetir. Örneğin, sistem acil durum sesleri çalarken arka planda çalan müziğin sesi kapatılabilir. Ses kontrolü HAL'si, bu durumda müzik çalan uygulamaları sesi kapatmaya yönlendirir. Sanal sistemde sesler diğer sanal makinelerden gelebilir. Referans uygulamada, AAOS konuk sanal makinesinde çalışan bir ses kontrol sunucusu daemon'u bulunur. Bu daemon, diğer sanal makinelerden ses odağı istekleri almak için vsock üzerinden gRPC kullanır. Ana makine VM'si, AAOS'ye ses kontrolü istekleri göndermek için device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller kullanabilir. libandroid_audio_controller, ses odağını tutarken odak serbest bırakılana kadar AAOS'a kalp atışı göndermeye devam eder.

Ses mimarisi

Şekil 2. Ses mimarisi.

Bluetooth

Bluetooth uygulaması aşağıdaki şekilde gösterilmiştir:

Bluetooth mimarisi

Şekil 3. Bluetooth mimarisi.

Bluetooth Eller Serbest Profili

trout üzerinde Bluetooth Eller Serbest Profili'ni (HFP) etkinleştirmek için VirtIO ses cihazı özellikleri, ses kontrollerini destekleyecek şekilde genişletildi. Bu yaklaşımı kullanarak, ana makine/hipervizör tarafındaki bir VirtIO ses cihazı, HFP ile ilgili şu üç ses kontrolünü sağlar:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

AAOS, konuk sanal makine olarak çalışırken bu ses kontrollerini ayarlamak için TinyALSA'yı kullanır. HFP kullanım alanını etkinleştirmek için ana makine/hipervizör, tedarikçiye özel yönlendirme ve kalibrasyonu buna göre gerçekleştirir.

Bluetooth uygulaması aşağıdaki tasarım resmine dayanmaktadır:

Bluetooth mimarisi

Şekil 4. Bluetooth mimarisi.

Dumpstate

Sanal AAOS için hata raporu oluştururken geliştiricilerin sisteme daha kapsamlı bir bakış açısı kazanması için ana makine VM bilgilerini eklemek faydalıdır. Bunu yapmak için trout referans uygulaması, IDumpstateDevice HAL'ı uygular. Bu HAL, vsock üzerinden gRPC aracılığıyla ana makine VM bilgilerini toplar. tar paketlenmiş ana makine VM bilgileri, hata raporunda dumpstate_board.bin olarak adlandırılırken günlük dökümleri dumpstate_board.txt konumundadır.

Yürütülecek komutları yapılandırmak için:

  1. Aşağıdaki dosyadan yapılandırma ayrıntılarını kopyalayıp bir XML dosyasına (ör. config.xml) yapıştırın:
    <dumpstateHalConfiguration version="1.0">
        <services>
            <service name="coqos-virtio-blk"        command="/bin/journalctl --no-pager -t coqos-virtio-blk"/>
            <service name="coqos-virtio-net"        command="/bin/journalctl --no-pager -t coqos-virtio-net"/>
            <service name="coqos-virtio-video"      command="/bin/journalctl --no-pager -t coqos-virtio-video"/>
            <service name="coqos-virtio-console"    command="/bin/journalctl --no-pager -t coqos-virtio-console"/>
            <service name="coqos-virtio-rng"        command="/bin/journalctl --no-pager -t coqos-virtio-rng"/>
            <service name="coqos-virtio-vsock"      command="/bin/journalctl --no-pager -t coqos-virtio-vsock"/>
            <service name="coqos-virtio-gpu-virgl"  command="/bin/journalctl --no-pager -t coqos-virtio-gpu-virgl"/>
            <service name="coqos-virtio-scmi"       command="/bin/journalctl --no-pager -t coqos-virtio-scmi"/>
            <service name="coqos-virtio-input"      command="/bin/journalctl --no-pager -t coqos-virtio-input"/>
            <service name="coqos-virtio-snd"        command="/bin/journalctl --no-pager -t coqos-virtio-snd"/>
            <service name="dumpstate_grpc_server"   command="/bin/journalctl --no-pager -t dumpstate_grpc_server"/>
            <service name="systemd"                 command="/bin/journalctl --no-pager -t systemd"/>
            <service name="systemctl"               command="/bin/systemctl status"/>
            <service name="vehicle_hal_grpc_server" command="/bin/journalctl --no-pager -t vehicle_hal_grpc_server"/>
        </services>
        <systemLogs>
            <service name="dmesg" command="/bin/dmesg -kuPT"/>
        </systemLogs>
    </dumpstateHalConfiguration>
    
  2. Başlatırken yeni XML dosyasının yolunu dumpstate sunucusuna iletin. Örneğin:
    --config_file my_config.xml
    

Genişletilmiş Görünüm Sistemi

Genişletilmiş Görüş Sistemi (EVS), arka ve çevre görüşü kameralarıyla çekilen videoları gösterir. Sanal AAOS'te EVS yığını, VirtIO-video sürücüsünü kullanan sanallaştırılmış V4L2 akış cihazından video akışına erişebilir.

Garaj modu

Garaj moduna girme ve bu moddan çıkma, VHAL tarafından gönderilen AP_POWER_STATE_REQ özellikleriyle tetiklenir. Sanallaştırma modunda, Garaj Modu ana makine tarafından tetiklenir. Android kapatılana kadar Android sanal makinesi için sanal cihazlar sağlamak üzere ana makine sanal makinesi açık kalmalıdır. Ana makine sanal makinesindeki VHAL sunucusu, kapatma sinyalini AAOS konuk sanal makinesine gönderir. VHAL istemci sinyalini aldıktan sonra AAOS VM, Garaj Modu'na girer ve ana makine VM'sinin etkin kalması için kalp atışı sinyalleri göndermeye başlar. Daha fazla bilgi için Garaj Modu konusuna bakın.

Küresel navigasyon uydu sistemi (GNSS)

trout 1.0'da virtio-console üzerinden GNSS sanallaştırma desteği bulunur. Uygulama, ana makineden konuğa ham ölçümlerin ve konum düzeltmelerinin aktarılmasını destekler.

Veri değişim biçimi, GNSSLogger uygulaması tarafından kullanılan CSV'dir. Referans uygulamada, yerel GNSS sürücüsü mevcut olmadığından sahte veriler kullanılabilir. Konuk tarafında herhangi bir değişiklik yapmadan yerel sürücü uygulayabilirsiniz. trout kaynak kodunun bir parçası olarak örnek bir sahte ana makine aracısı sağlanır.

Uygulama, GNSS başlatma ve Destekli GNSS'nin (AGNSS) ana makine işletim sistemi ortamı tarafından işlenmesini bekler.

GNSS mimarisi

Şekil 5. GNSS mimarisi.

Grafik

AAOS, diğer otomotiv işletim sistemleriyle birlikte konuk sanal makine olarak çalışırken Android'in GPU'ya veya ekran denetleyicisine doğrudan erişimi olmayabilir. Bu durumda, Android misafir sanal makinesinde ve virtio-gpu cihazında Mesa veya goldfish-opengl ve virtio-gpu sürücüsünü kullanarak GPU'ya erişebilirsiniz.

Android konuk sanal makinesinde Mesa veya goldfish-opengl, OpenGLES komutlarını sırasıyla bir Gallium akışına ya da otomatik olarak oluşturulan bir GLES akışına kodlar. Aktarım için virtio-gpu çekirdek sürücüsü kullanılır. Ana makine tarafında, virglrenderer (Mesa için) ve vulkan-cereal (goldfish-opengl için) mevcut GPU sürücüsünün üzerinde kod çözme işlemi yapılmış komut akışını yeniden oynatır. AAOS referans platformu trout yalnızca OpenGL ES'yi destekler. Vulkan desteğinin gelecekteki bir sürümde kullanıma sunulması beklenmektedir.

Grafik mimarisi

Şekil 6. Grafik mimarisi.

Sensörler

AAOS, diğer otomotiv işletim sistemleriyle birlikte konuk sanal makine olarak çalıştırıldığında Android'in sensörlere doğrudan erişimi olmayabilir. Bu durumda, Android konuk sanal makinesindeki Virtio-SCMI sürücüsünü ve ana makine sanal makinesindeki VirtIO-SCMI cihazını kullanarak sensörlere erişebilirsiniz. AAOS sanallaştırma referans platformu, sensörlere erişmek için ARM tabanlı SoC'lerde kullanabileceğiniz genel ve donanımdan bağımsız bir Sensör HAL'ı sağlar.

Sensor HAL, Linux Kernel IIO alt sistemindeki IIO SCMI sürücüsüyle iletişim kurar. Bu sürücü, sensörleri keşfetmek ve yapılandırmak, sensör verilerini okumak ve sensör değeri değişikliklerinden haberdar olmak için ARM System Control and Management Interface (SCMI) spesifikasyonu tarafından sağlanan SCMI Sensor Management Protocol'ü kullanır.

IIO SCMI sürücüsü, VirtIO SCMI sürücüsünü kullanır. Bu sürücü, ana makine VM'sindeki VirtIO SCMI cihazıyla SCMI mesajlarını değiştirmek için virtio-scmi spesifikasyonunda VirtIO aktarım protokolünü kullanır. VirtIO SCMI cihazı, SoC'ye özel sensör sürücüleri aracılığıyla sensörlere doğrudan erişebilir.

Sensör mimarisi

Şekil 7. Sensör mimarisi.

Sensör HAL konumu

VirtIO SCMI'yi kullanan sensör HAL'nin referans uygulaması device/google/trout/hal/sensors adresinde bulunur.

Sensör HAL yapılandırması

Sensor HAL, Android araba sensörü koordinat sistemine uymak için ana makine VM'sinden alınan sensör verilerini değiştirmesi gerekebilir. Sensör yapılandırması şeması device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd adresinde bulunabilir.

OEM'ler, yön ve konum gibi sensör yapılandırmasını sensor_hal_configuration.xml içinde sağlayabilir ve dosyayı /odm/etc/sensors/ veya /vendor/etc/sensors/ konumuna kopyalayabilir. Aşağıdaki örnekte bir sensör yapılandırması verilmiştir:

<sensorHalConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
    <modules>
        <module halName="android.hardware.sensors@2.0-Google-IIO-Subhal" halVersion="2.0">
            <sensors>
                <sensor name="scmi.iio.accel" type="1">
                    <configuration>
<!-- Attribute rotate denotes if HAL needs to modify the sensor data to comply with //
        the Android car sensor coordinate system -->
                        <orientation rotate="true">
               <!-- Attribute map denotes the indexes of data in sensor data received -->
               <!-- Attribute negate denotes if data needs to be negated -->
                            <x map="0" negate="false"/>
                            <y map="1" negate="true"/>
                            <z map="2" negate="true"/>
                        </orientation>
                        <location>
               <!-- Attribute x, y, z denotes location of the sensor placement -->
                            <x>10</x>
                            <y>15</y>
                            <z>20</z>
                        </location>
                    </configuration>
                </sensor>
         </sensors>
        </module>
    </modules>
</sensorHalConfiguration>

Araç HAL'si

Araç HAL'si (VHAL) uygulaması iki bileşenden oluşur:

  • Müşteri. Android'in sanallaştırılmış AAOS'te kullandığı API'leri sağlar.
  • Sunucu. Doğrudan donanımla (ör. araç veri yolları) veya bir emülatörle iletişim kurar.

Sanallaştırmada VHAL sunucusu, ana makine VM'sinde çalışır. VHAL istemcisi ve sunucusu, vsock üzerinden gRPC aracılığıyla iletişim kurar. Daha fazla bilgi için device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto sayfasına bakın. OEM'ler, iletişim API'lerini geçersiz kılarak gRPC dışında farklı bir taşıma protokolü kullanabilir. Örnekler için device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp başlıklı makaleyi inceleyin.

Diğer alt sistemler

VirtIO, Blok Depolama, Ağ, Konsol, Giriş, Soket ve Entropi gibi bileşenler için iyi tanımlanmış bir arayüz sağlar. AAOS, bu alt sistemler için sürücüyü olduğu gibi kullanır (ör. virtio-blk, virtio-input, virtio-console ve virtio-net).

Sanal AAOS referans platformunda, mac80211_hwsim VirtWifi kablosuz ağını etkinleştirmek için Wi-Fi desteklenir. Bu ağ, ağ trafiğini gerçek Wi-Fi ağına doğrudan erişimi olan ana makine sanal makinesine göndermek için virtio-net tünelini kullanır.