Язык Zig (канал)
174 subscribers
26 photos
3 videos
6 files
238 links
Download Telegram
спасибо китайцам за новую аву
👎6
Язык Zig (канал)
спасибо китайцам за новую аву
вернул старую, чет не зашло никому
12🔥2🥰2
Forwarded from 👨‍💻
Ищу коллегу, пишущего на зиге для реализации одного из проектов. Подробности расскажу в созвоне, как и условия работы
🤔10
через 15 минут будут рассказывать ещё про async https://www.twitch.tv/kristoff_it
1
[RFC] Upstream target support for CHERI-enabled architectures - LLVM Project

Если Zig хочет поддерживать эту архитектуру и быть настолько же кросс-платформенным, как Си, придётся парочку вещей подправить:

CHERI заменяет указатели на capability-объекты, которые не являются целыми числами и не могут быть подделаны. Это нарушает исторически сложившиеся предположения в Clang и LLVM о том, что указатели могут быть без потерь преобразованы в целые числа и обратно. Это также касается обхода системы типов через память.
🤯6👍1
Язык Zig (канал)
[RFC] Upstream target support for CHERI-enabled architectures - LLVM Project Если Zig хочет поддерживать эту архитектуру и быть настолько же кросс-платформенным, как Си, придётся парочку вещей подправить: CHERI заменяет указатели на capability-объекты, которые…
Во общем, что это такое. Для начала, CHERI расшифровывается как Capability Hardware Enhanced RISC Instructions, поэтому чтобы понять суть, нужно начать с Capability:

Capability a.k.a возможности это особые маркеры, которые определяют, к каким ресурсам можно получить доступ и какие действия с ними разрешены.

CHERI использует эти capability, чтобы контролировать доступ к памяти на компьютере. Они реализованы в железе (поэтому hardware enchanced), в виде расширения для архитектур процессоров (ARM, RISC-V, x86 и т.д.), которое заменяет обычные указатели такими capability (поэтому RISC instructions)
2👍1
Язык Zig (канал)
Во общем, что это такое. Для начала, CHERI расшифровывается как Capability Hardware Enhanced RISC Instructions, поэтому чтобы понять суть, нужно начать с Capability: Capability a.k.a возможности это особые маркеры, которые определяют, к каким ресурсам можно…
В обычных указателях на обычных процессорах указатель содержит в себе только адрес.

В CHERI, capabilities содержат в себе не только адрес, но и права, границы и специальная метка, которая проверяет целостность. Это всё занимает память, поэтому на 64-битных архитектурах указатель занимает не 64 бит, а 128 бит (здесь лоомается usize)
🤯31
2👍1
Можно заметить, что он похож на супер-слайс/срез как в Zig, который тоже содержит в себе границы (длину в случае Zig). В коде это можно представить так:

const Slice = struct(u128) {
address: u64,
len: u64,
}

const Capability = struct(u128) {
address: u64,
metadata: struct(u64) {
permissions: ... // bitfield,
type: ... // enum или boolean
bounds: ... // специальной свой мини-float
}
}
👍3
Теперь что делают эти capability: они проверяют на уровне процессора все доступы, сделанные через них, и разрешает только явно прописанные действия.

К примеру, доступ по индексу к слайсу имеет проверку в рантайме, которая проверяет на out of bounds:

const a: []const u8 = ...;
const b = a[1000]; // panic если вышел за диапазон

Я думаю, многим из вас эта проверка помогла найти какой-то баг в коде и т. д. Однако, у нашего варианта есть минусы:
* Она работает только в ReleaseSafe, Debug и функциях с setRuntimeSafety(true)
* Она проверяется программно, с дополнительной нагрузкой на производительность
* Её очень легко обойти
Язык Zig (канал)
Теперь что делают эти capability: они проверяют на уровне процессора все доступы, сделанные через них, и разрешает только явно прописанные действия. К примеру, доступ по индексу к слайсу имеет проверку в рантайме, которая проверяет на out of bounds: const…
В CHERI:
* Её невозможно обойти.

Я не показал в struct, но на картине видно, что дополнительно к каждому указателю хранится тег в отдельной памяти, который проверяет целостность. Если указатель изменили неправильно или "подделали" (к примеру рандомное число превратили в адрес), он заблокирует любой доступ по этому указателю и вернет аппаратную ошибку.

* Она проверяется на уровне железа, с очень маленькой нагрузкой на производительность

* Она работает везде, для всех языков и с большой точностью, будь то Си, Zig, unsafe Rust, Python, и т.д.
🤓3🤯2👍1
Язык Zig (канал)
В CHERI: * Её невозможно обойти. Я не показал в struct, но на картине видно, что дополнительно к каждому указателю хранится тег в отдельной памяти, который проверяет целостность. Если указатель изменили неправильно или "подделали" (к примеру рандомное число…
К примеру точности, в Zig можно сделать слайс и указать, к примеруадрес 100 и длину 10, т.е. можно использовать память с 100 по 110 байт.

В CHERI можно сделать указатель с таким же длмной, плюс добавить, к примеру, права только на чтение. Любое изменение черезу казатель блокируется процессором
https://tratt.net/laurie/blog/2023/two_stories_for_what_is_cheri.html

Из всех ОС у них сейчас самый полноценный вариант на FreeBSD, где они в своей коллекцию портов пометили 25к из примерно 40к пакетов как работающих на CHERI, из них 10к работающих на чистых capability и 15к в гибридном режиме

https://ctsrd-cheri.github.io/cheribsd-getting-started/packages/index.html
Язык Zig (канал)
https://tratt.net/laurie/blog/2023/two_stories_for_what_is_cheri.html Из всех ОС у них сейчас самый полноценный вариант на FreeBSD, где они в своей коллекцию портов пометили 25к из примерно 40к пакетов как работающих на CHERI, из них 10к работающих на чистых…
We have been demonstrating the second by porting large software stacks to Morello. This includes the entire FreeBSD userland and kernel (Linux is not quite finished), the userspace graphics stack, Weston (including 3D acceleration), the Qt and KDE core libraries, and a bunch of applications (Chromium is nearly finished). This is now at the point where people are starting to believe our claims about compatibility.