Mimari

AAOS'ta VirtIO'yu desteklemek için gereken değişikliklerin çoğu, HAL uygulama düzeyindeki ve Android Ortak Çekirdeğindeki değişiklikleri içerir. Android çerçevesi, ana bilgisayar tarafında VirtIO protokollerini kullanarak VirtIO cihazlarıyla iletişim kuran AAOS konuk VM çekirdeğindeki VirtIO sürücülerini kullanarak genel bir donanımdan bağımsız HAL ile iletişim kurar. Ana bilgisayar tarafındaki VirtIO cihazları, SoC'ye özel cihaz sürücülerini kullanarak fiziksel HW'ye erişebilir.

VirtIO sürücüsü ve VirtIO aygıtı arasındaki iletişim, dağılım toplama listelerinin DMA benzeri halka arabellekleri olan virtqueue ile gerçekleşir. VirtIO mesajlarını VM'ler arasında değiş tokuş etmek için MMIO veya PCI gibi çeşitli aktarımlar kullanılabilir.

Bazı durumlarda, sanal makineler arası iletişim için vsock yararlanılmıştır. Araç HAL, Ses Kontrolü ve Dumpstate iletişimleri, bir vsock arabirimi üzerinden ayrı bir sanal makinede bir eş aracıya bağlantı kullanılarak desteklenir. GRPC-vsock , bu standartlaştırılmamış alt sistemlere erişmek için kullanılır. Android kaynak ağacındaki GRPC , vsock:CID:PORT_NUMBER adres biçimiyle vsock ile çalışacak şekilde değiştirildi.

sanallaştırma mimarisi
Şekil 1. Sanallaştırma mimarisi

grafik

AAOS, diğer otomotiv işletim sistemleriyle birlikte konuk VM olarak çalışırken, Android'in GPU'ya veya ekran denetleyicisine doğrudan erişimi olmayabilir. Bu durumda, GPU'ya erişmek için Android konuk VM ve virtio-gpu cihazındaki Mesa ve bir virtio-gpu sürücüsü kullanılabilir.

Android konuk sanal makinesinde Mesa, gölgelendiricileri TGSI ara temsiline derlemek için Gallium3D çerçevesini kullanır ve API'yi durum nesnelerine çevirir. Gallium3D daha sonra derlenmiş durum nesnelerini ve beraberlik çağrılarını Mesa Virgl'e gönderir, bu da daha sonra Host VM'ye komutlar ve gölgelendiriciler göndermek için virtio-gpu gpu'yu bir aktarım protokolü olarak kullanır.

Ana bilgisayar tarafında, virglrenderer virtio-gpu komut akışını alır ve akışı OpenGL ES komutlarına dönüştürür. Ayrıca gölgelendiricileri TGSI formatından GLSL formatına çevirir ve ardından bunları mevcut GPU sürücüsünün üzerinde yeniden oynatır.

AAOS referans platformu trout şu anda OpenGL ES'yi yalnızca gelecekteki bir sürümde beklenen Vulkan desteğiyle desteklemektedir.

Grafik mimarisi
Şekil 2. Grafik mimarisi

Sensörler

AAOS, diğer otomotiv işletim sistemleriyle birlikte konuk VM olarak çalışırken, Android'in sensörlere doğrudan erişimi olmayabilir. Bu durumda, sensörlere erişmek için Android konuk VM'sindeki Virtio-SCMI sürücüsü ve Host VM'deki VirtIO-SCMI cihazı kullanılır. AAOS sanallaştırma referans platformu, ARM tabanlı SoC'lerin sensörlere erişmesi için kullanılabilen genel ve HW'den bağımsız bir Sensör HAL'ı sağlar.

Sensör HAL, sensörleri keşfetmek ve yapılandırmak, sensör verilerini okumak ve sensörden haberdar olmak için ARM Sistem Kontrol ve Yönetim Arayüzü (SCMI) belirtimi tarafından sağlanan SCMI Sensör Yönetim Protokolünü kullanan Linux Kernel IIO alt sistemindeki IIO SCMI sürücüsü ile iletişim kurar. değer değişiklikleri. IIO SCMI sürücüsü, ana VM'deki VirtIO SCMI cihazıyla SCMI mesajlarını değiş tokuş etmek için virtio-scmi belirtiminde belirtildiği gibi VirtIO aktarım protokolünü kullanan VirtIO SCMI Sürücüsünü kullanır. VirtIO SCMI cihazı, SoC'ye özel sensör sürücüleri aracılığıyla sensörlere doğrudan erişime sahiptir.

Sensör mimarisi
Şekil 3. Sensör mimarisi

Sensör HAL konumu

VirtIO SCMI kullanan HAL sensörünün referans uygulaması device/google/trout/hal/sensors konumunda bulunur.

Sensör HAL yapılandırması

Sensör HAL'ın, Ana Sanal Makineden alınan sensör verilerini, Android araba sensörü koordinat sistemine uyması için değiştirmesi gerekebilir. Sensör konfigürasyonu şeması device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd .

OEM'ler, oryantasyon ve konum gibi sensör yapılandırmasını sensor_hal_configuration.xml dosyasında sağlayabilir ve dosyayı /odm/etc/sensors/ veya /vendor/etc/sensors/ dizinine kopyalayabilir. Örnek bir sensör konfigürasyonu aşağıda 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>

Ses

Sanallaştırılmış AAOS'ta, Android konuk sanal makinesi sese erişmek için virtio-snd snd'yi kullanabilir. virtio-snd , ses HAL uygulamasının TinyALSA kitaplığı ile sanallaştırılmış ses cihazlarıyla etkileşime girebilmesi için sanallaştırılmış PCM cihazlarını Android VM'ye sağlar.

Varsayılan ses HAL uygulaması, /device/google/trout/hal/audio/6.0 adresinde /device/google/trout/hal/audio/6.0 . OEM'ler, platformları için ro.vendor.trout.audiohal.{in,out}_period_{ms,count} değişiklik yapabilir. OEM'ler, /device/google/trout/aosp_trout_common.mk.

Ses denetimi HAL, AAOS'ta ses odağını yönetir. Örneğin, sistem acil durum seslerini çalarken arka planda çalan müziğin sessize alınması gerekebilir. Ses denetimi HAL, bu durumda müzik çalan uygulamaları sessize almaları konusunda bilgilendirir. Sanallaştırılmış sistemde, sesler diğer VM'lerden gelebilir. Başvuru uygulamasında, AAOS konuk sanal makinesi, diğer sanal makinelerden ses odak isteklerini almak için GRPC-vsock kullanan bir ses kontrol sunucusu arka plan programı çalıştırır. Ana makine sanal makinesi, AAOS'a ses denetimi istekleri göndermek için device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller kullanabilir. libandroid_audio_controller ses odağını elinde tutarken, odak bırakılana kadar AAOS'a kalp atışı göndermeye devam edecektir.

ses mimarisi
Şekil 4. Ses mimarisi

Bluetooth

AAOS, diğer otomotiv işletim sistemleriyle birlikte konuk VM olarak çalıştığında, Android'in Bluetooth Denetleyicisine doğrudan erişimi olmayabilir. Bu durumda, Android konuk sanal makinesindeki VirtIO-Konsol sürücüsü ve ana bilgisayar sanal makinesindeki VirtIO-Konsol cihazı, sanal bir COM bağlantı noktası açmak ve HCI paketlerini Bluetooth denetleyicisine göndermek ve olayları almak için kullanılabilir. Bu tasarım, Android Bluetooth yığını tarafından kullanılacak genel ve HW'den bağımsız bir Bluetooth HAL'a izin verir. Ana bilgisayar VM, Bluetooth Denetleyicisinin başlatma ve bellenim indirmesi gibi HW'ye özgü görevleri işleyebilir.

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

Bluetooth mimarisi
Şekil 5. Bluetooth mimarisi

Araç HAL

Araç HAL uygulaması iki bileşenden oluşur:

  • Müşteri. Sanallaştırılmış AAOS'ta Android tarafından kullanılan API'leri sağlar
  • Sunucu. Araç otobüsleri (veya emülatör) gibi donanımlarla doğrudan iletişim kurar.

Sanallaştırmada, VHAL sunucusu ana bilgisayar sanal makinesinde çalışır. VHAL istemcisi ve sunucusu, GRPC-vsock aracılığıyla iletişim kurar (daha fazla bilgi için bkz. device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto ). OEM'ler, iletişim API'lerini geçersiz kılarak GRPC dışında farklı bir aktarım protokolü kullanabilir. Örnekler için device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp .

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

Genişletilmiş Görüş Sistemi (EVS), arka görüş ve çevre görüş kameraları tarafından çekilen videoyu görüntülemek için kullanılır. Sanallaştırılmış AAOS'ta, EVS yığını, VirtIO-video sürücüsünü kullanan sanallaştırılmış V4L2 akış aygıtından video akışına erişebilir.

Garaj modu

Daha fazla bilgi için bkz . Garaj Modu Nedir? .

Garaj moduna giriş ve çıkış, Araç HAL tarafından gönderilen AP_POWER_STATE_REQ özellikleri tarafından tetiklenir. Sanallaştırma modunda, Garaj modu ana bilgisayar tarafından tetiklenir. Ana VM, Android kapatılana kadar Android VM için sanal cihazlar sağlamak üzere açık kalmalıdır. Ana bilgisayar sanal makinesindeki VHAL sunucusu, kapatma sinyalini AAOS konuk sanal makinesine gönderir. VHAL istemci sinyalini aldıktan sonra, AAOS VM Garaj moduna girer ve ana VM'yi aktif tutmak için sinyal göndermeye başlar.

çöplük

Sanallaştırılmış AAOS için hata raporu oluştururken, geliştiricilerin sistem hakkında daha kapsamlı bir görüşe sahip olması için ana bilgisayar VM bilgilerini dahil etmek değerlidir. Bunu gerçekleştirmek için, trout başvuru uygulaması, ana bilgisayar VM bilgilerini GRPC-vsock aracılığıyla toplayan IDumpstateDevice HAL'ı uygular. Tarla paketlenmiş ana makine VM bilgileri, hata dumpstate_board.bin olarak adlandırılırken, dumping günlükleri dumpstate_board.txt .

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

  1. Aşağıdaki dosyadan yapılandırma ayrıntılarını bir XML dosyasına kopyalayın, örneğin config.xml .
    <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
    

Diğer alt sistemler

VirtIO, Block Storage, Network, Console, Input, Socket ve Entropy gibi bileşenler için zaten iyi tanımlanmış bir arayüz sağlar. Bu alt sistemler için AAOS, virtio-blk , virtio-input , virtio-console ve virtio-net gibi sürücüyü olduğu gibi kullanır.

Sanallaştırılmış AAOS referans platformunda Wi-Fi, bir VirtWifi kablosuz ağını etkinleştirmek için mac80211_hwsim ile desteklenir ve bu daha sonra ağ trafiğini gerçek Wi-Fi ağına doğrudan erişimi olan ana makine VM'ye göndermek için virtio-net tüneli kullanır.