Sandboxed API'yi Kullanmaya Başlama

Bu sayfada Korumalı Alana Sahip API (SAPI) ile kendi korumalı alanlı C/C++ kitaplığınızı nasıl oluşturacağınızı öğreneceksiniz. Bunu, başlık dosyalarındaki örnekler ve kod dokümanlarıyla birlikte bir kılavuz olarak kullanın.

Bağımlılıklar Derleme

Aşağıdaki bağımlılıklar sisteme yüklenmelidir:

  • UTS, IPC, kullanıcı, PID ve ağ ad alanlarını destekleyen Linux çekirdeği
  • Linux kullanıcı alanı API üstbilgileri
  • Kodunuzu derlemek için: GCC 6 (sürüm 7 veya üstü tercih edilir) ya da Clang 7 (veya üstü)
  • Başlık dosyalarının otomatik olarak oluşturulması için: Clang Python Bağlamaları
  • Python 3.5 veya sonraki sürümler
  • Bazel 2.2.0 sürümü veya CMake 3.12 ya da sonraki bir sürüm.
    • Yalnızca CMake: GNU Make veya libcap kitaplık başlıklarının bir sürümü ve Ninja (önerilen) gibi bir derleme aracı.

Bazel kullanma

Bazel önerilen derleme sistemidir ve entegre edilmesi en kolay olan sistemdir.

Dokümanlarımız Clang derleyicisini kullanmaktadır. Belirli bir araç zincirine (ör. derleyici, bağlayıcı vb.) ihtiyacınız varsa varsayılan derleyici araç zincirinin nasıl değiştirileceğiyle ilgili bilgi için Bazel dokümanlarına bakın.

Debian 10 (Buster)

Derleme bağımlılıklarını yüklemek için:

echo "deb http://storage.googleapis.com/bazel-apt stable jdk1.8" | \
  sudo tee /etc/apt/sources.list.d/bazel.list
wget -qO - https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install -qy build-essential linux-libc-dev bazel python3 \
  python3-pip libclang-dev
pip3 install clang

Gentoo

Gerekli çekirdek seçenekleri:

General setup  --->
-*- Namespaces support
[*]   UTS namespace
[*]   IPC namespace
[*]   User namespace (EXPERIMENTAL)
[*]   PID Namespaces
[*]   Network namespace

Derleme bağımlılıklarını yüklemek için:

emerge dev-util/bazel dev-python/typing dev-python/clang-python

CMake'ı Kullanma

CMake, Ninja veya Make gibi derleme araçları için proje dosyaları oluşturan popüler bir açık kaynak meta derleme sistemidir.

Debian 10 (Buster)

Derleme bağımlılıklarını yüklemek için:

sudo apt-get install -qy build-essential linux-libc-dev cmake ninja-build \
  python3 python3-pip libclang-dev libcap-dev
pip3 install absl-py clang

Gentoo

Gerekli çekirdek seçenekleri:

General setup  --->
-*- Namespaces support
[*]   UTS namespace
[*]   IPC namespace
[*]   User namespace (EXPERIMENTAL)
[*]   PID Namespaces
[*]   Network namespace

Derleme bağımlılıklarını yüklemek için:

emerge sys-kernel/linux-headers dev-util/cmake dev-util/ninja \
dev-python/clang-python

Geliştirme Süreci

Bir C/C++ kitaplığını korumalı alana almak için projeniz için iki öğe hazırlamanız gerekir:

Sandbox2 örneklerinden zlib'e aşina olabilirsiniz. Buradaki tüm program (zpipe.c) korumalı alana alınmıştır. Aşağıdaki adımlarda zlib kitaplığını korumalı alana almak için SAPI'yi ve Korumalı Alana Sahip Kitaplık'tan nasıl yararlanacağınızı öğreneceksiniz.

1. Hangi işlevlerin gerektiğine karar verme

zlib ana makine koduna (main_zlib.cc) bakarsanız aracın işlevlerinin, verileri stdin'den okumak ve zlib deflate() işlevini kullanarak verileri bir EOF işaretçisi okununcaya kadar sıkıştırmak olduğunu görebilirsiniz. Program, toplamda zlib'den üç işlev kullanır:

  • deflateInit_(): Sıkıştırma işlemini başlatmak için
  • deflate(): Veri parçası üzerinde sıkıştırma işlemini gerçekleştirmek için
  • deflateEnd(): Sıkıştırmayı ve dinamik olarak ayrılmış ücretsiz veri yapılarını sonlandırmak için

Gerçek hayattan bir örnekte, C/C++ kitaplığını inceler ve hangi işlevlerin gerekli olduğuna karar verirsiniz. Olası bir strateji, Ana Makine Kodu ile başlamak ve kitaplığı korumalı alana alınmadan kullanmaktır. Ardından, ikinci bir adımda, Korumalı Alana Sahip Kitaplık oluşturabilir ve Ana Makine Kodunu korumalı alana alınmış işlev çağrılarını kullanacak şekilde uyarlayabilirsiniz.

2. sapi_library Derleme Kuralını yazma

Korumalı alana alınmış zlib kitaplığından gereken üç zlib işlevini tanımladıktan sonra, derleme kuralını BUILD dosyasında tanımlayabilirsiniz. sapi_library derleme kuralıyla ilgili dokümanlar, Derleme Kuralları sayfasında bulunabilir.

Aşağıdaki kod snippet'i, zlib SAPI örneğinin sapi_library tanımını göstermektedir. Bazel'a lib özelliği kullanılarak zlib kitaplığı için WORKSPACE dosyasına bakması istenir.

sapi_library(
    name = "zlib-sapi",
    srcs = [],
    hdrs = [],
    functions = [
        "deflateInit_",
        "deflate",
        "deflateEnd",
    ],
    lib = "@net_zlib//:zlib",
    lib_name = "Zlib",
    namespace = "sapi::zlib",
)

Bunun sonucunda, korumalı alana alınmış zlib kitaplığı oluşturulur. Çıkış, Ana Makine Koduna eklenebilen ve korumalı alana alınan kitaplıkla RPC çağrıları aracılığıyla iletişim kurmak için kullanılabilen SAPI Nesnesidir. Bu örnekte kullanılan Korumalı Alan Politikası varsayılan politikadır.

3. Ana Makine Kodunu Yazma veya Değiştirme

Şimdi, oluşturulan SAPI Kitaplığı'nı Ana Makine Koduna ekleme zamanı geldi.

Korumalı Alan Oluşturma

Korumalı alan nesnesi oluşturmak için sapi::Sandbox sandbox(sapi::zlib::zlib_sapi_embed_create()); öğesini kullanın.

SAPI Nesnesini örneklendirmek ve böylece korumalı alana alınan işlevleri kullanılabilir hale getirmek için sapi::zlib::ZlibApi api(&sandbox); kullanın.

SAPI Türlerini Kullanın

SAPI Türleri, SAPI'nin sağladığı C++ sınıfları biçimindeki özel türlerdir. Bunun nedeni, bazen normal C türlerinin çalışmamasıdır.

Bir SAPI türünün ilk kullanımı, strm bildiriminde görülebilir. Burada bir SAPI Yapısı kullanılır: sapi::v::Struct<sapi::zlib::z_stream> strm;

Şablon türü (sapi::zlib::z_stream), derleme kuralı tarafından otomatik olarak oluşturulan koda iyi bir örnektir.

Daha ayrıntılı bilgi için Değişkenler sayfasına göz atın.

API Çağrıları Yapın

defalteInit_, deflate veya deflateEnd'ye çağrı yapmak için SAPI Nesnesi'ni kullanın. "Değiştir" yaklaşımını kullanmaya karar verirseniz, işlev parametrelerinin beklenen değerlerle eşleştiğinden emin olmanız gerekir.

zlib örneğindeki çağrıların her birine bir örnek:

  • api.deflateInit_(strm.PtrBoth(), Z_DEFAULT_COMPRESSION,
        version.PtrBefore(), sizeof(sapi::zlib::z_stream));
  • api.deflate(strm.PtrBoth(), flush);
  • api.deflateEnd(strm.PtrBoth()).IgnoreError();

SAPI İşlemlerini Kullanma

SAPI, Ana Makine Kodunu Korumalı Alana Sahip Kitaplık'tan izole eder ve çağrı yapana, sorunlu veri işleme isteklerini yeniden başlatma veya iptal etme olanağı verir. SAPI İşlemi bir adım daha ileri gidip başarısız işlemleri otomatik olarak tekrarlar.

Daha fazla ayrıntı için SAPI İşlemleri sayfasına göz atın.

Örnekler

Örnekler altında, SAPI ekibi tarafından önceden hazırlanmış birkaç kitaplığı bulabilirsiniz.