vak: (Улыбка)
Serge Vakulenko ([personal profile] vak) wrote2016-12-10 03:16 pm

Защита адреса при записи

Дошёл до реализации необычного свойства процессора микро-БЭСМ, отсутствующего у современных компьютеров. Каждое слово в оперативной памяти имеет дополнительный бит запрета записи. При попытке записи по этому адресу возникает прерывание "защита адреса при записи". Чтобы всё-таки иметь возможность изменить значение (и бит запрета), память имеет дополнительный сигнал, отменяющий защиту.

Получается полезная возможность, похожая на const в языке Си, но при этом защиту можно включать и отключать по ходу выполнения программы. Что-то отдалённо похожее - теговая архитектура - существовало в некоторых ранних компьютерах, но не прижилось.

[identity profile] archaicos.livejournal.com 2016-12-10 11:47 pm (UTC)(link)
В мире ощущается острый недостаток const!
Все влазят, но не всех убивает.

[identity profile] archaicos.livejournal.com 2016-12-11 05:00 am (UTC)(link)
const a = 1;
void foo(void)
{
#pragma push(fuck)
#pragma fuck(off)
a = 0;
#pragma pop(fuck)
}

(no subject)

[identity profile] dvv.livejournal.com - 2016-12-14 02:46 (UTC) - Expand

[identity profile] spamsink.livejournal.com 2016-12-11 01:11 am (UTC)(link)
Выходит, каждая запись - не одно обращение к памяти, а два? Накладно.

[identity profile] 1801bm1.livejournal.com 2016-12-11 08:01 am (UTC)(link)
>>немедленно формирует ответ в виде текущего тега
Это наверное легко реализуется на встроенных блоках FPGA. А если память реализована на обычной SDRAM? Все равно, если защита записи включена и идет обращение на запись без явного отключения защиты, придется этот контрольный бит сначала прочитать. Ну да, кеширование и прочее как-то помогут, да и запись менее частое событие. Но, думаю, на дескрипторы страниц (вместо битов для отдельных слов) не просто так перешли в более свежих архитектурах.

(no subject)

[identity profile] netch80.livejournal.com - 2016-12-15 08:04 (UTC) - Expand

(no subject)

[identity profile] skolk.livejournal.com - 2016-12-15 00:17 (UTC) - Expand

(no subject)

[identity profile] 1801bm1.livejournal.com - 2016-12-15 07:27 (UTC) - Expand

(no subject)

[identity profile] skolk.livejournal.com - 2016-12-15 10:33 (UTC) - Expand

(no subject)

[identity profile] netch80.livejournal.com - 2016-12-15 08:09 (UTC) - Expand

(no subject)

[identity profile] skolk.livejournal.com - 2016-12-15 10:54 (UTC) - Expand

(no subject)

[identity profile] netch80.livejournal.com - 2016-12-15 13:13 (UTC) - Expand

(no subject)

[identity profile] skolk.livejournal.com - 2016-12-15 13:38 (UTC) - Expand

(no subject)

[identity profile] netch80.livejournal.com - 2016-12-22 17:09 (UTC) - Expand

(no subject)

[identity profile] 18cc.livejournal.com - 2016-12-22 18:49 (UTC) - Expand

(no subject)

[identity profile] netch80.livejournal.com - 2016-12-22 21:40 (UTC) - Expand

[identity profile] spamsink.livejournal.com 2016-12-11 04:42 am (UTC)(link)
Не вижу проблемы, чтобы пейджинг происходил 9-килобайтными блоками вместо 8-килобайтных. Как DMA организуешь, так и будет. В ELF-файле держать теги не надо, их можно формировать в зависимости от типа секции. А вот то, что при современной памяти (которая на порядки медленнее процессора) надо было бы перед записью отдельно читать, всю идею и подкосило.

(no subject)

[identity profile] Евгений Х. - 2016-12-11 13:45 (UTC) - Expand

(no subject)

[identity profile] netch80.livejournal.com - 2016-12-15 08:11 (UTC) - Expand

[identity profile] rbs-vader.livejournal.com 2016-12-11 04:22 am (UTC)(link)
У SPARC в последних реализациях что-то похожее есть, но даже посложнее. Регионы памяти помечаются "цветом", в чужой регион запись невозможна (и вообще доступ). Причём всё это на аппаратном уровне, там никакой Интел и рядом не лежал.
Edited 2016-12-11 04:22 (UTC)

[identity profile] rbs-vader.livejournal.com 2016-12-11 10:04 pm (UTC)(link)
Да там и весь процессор прекрасен, очень жаль, что общие масссы вынуждены довольствоваться этим убогим х86...

[identity profile] skolk.livejournal.com 2016-12-15 12:30 am (UTC)(link)
А там S/370 - i386 style paging MMU есть? Если да, зачем цвет? Он был в S/360...

[identity profile] netch80.livejournal.com 2016-12-15 08:17 am (UTC)(link)
> там никакой Интел и рядом не лежал.

If CR4.PKE = 1, IA-32e paging associates with each linear address a protection key.

The protection-key feature provides an additional mechanism by which IA-32e paging controls access to user-mode addresses. When CR4.PKE = 1, every linear address is associated with the 4-bit protection key located in bits 62:59 of the paging-structure entry that mapped the page containing the linear address (see Section 4.5). The PKRU register determines, for each protection key, whether user-mode addresses with that protection key may be read or written.
The PKRU register (protection key rights for user pages) is a 32-bit register with the following format: for each i
(0 ≤ i ≤ 15), PKRU[2i] is the access-disable bit for protection key i (ADi); PKRU[2i+1] is the write-disable bit for protection key i (WDi).
Software can use the RDPKRU and WRPKRU instructions with ECX = 0 to read and write PKRU. In addition, the PKRU register is XSAVE-managed state and can thus be read and written by instructions in the XSAVE feature set.

> Причём всё это на аппаратном уровне

Учитывая, что у SPARC, в отличие от x86, вообще нет каталогов страниц, это, конечно, для него существенно.
У x86 всё управление доступом "аппаратное" и разницы нет.

[identity profile] izard.livejournal.com 2016-12-11 08:53 am (UTC)(link)
в x86 можно пометить страницу (4к), можно ли из нее читать-писать-запускать код, потом пускай компилятор в read-only страницы константы аллоцирует.
ext_646638: (Default)

[identity profile] rdia.livejournal.com 2016-12-11 09:48 pm (UTC)(link)
А какой в этом смысл? Против злоумышленника это не поможет, а в ЯВУ и так всё, что не нужно, закрыто на этапе компиляции.
ext_646638: (Default)

[identity profile] rdia.livejournal.com 2016-12-11 09:55 pm (UTC)(link)
Я, конечно, не рассматриваю тут кросс-платформенные ассемблеры С/С++. В них - очень кстати, особенно, если в программе снятие защиты делается каким-то очень явным образом.

Тогда при вызове функции можно сразу по умолчанию запрещать переписывать данные стека, например. Или наоборот, разрешать запись только в выделенную память (правда это будет медленно).

Зато у вас будет большой геморрой с многопоточностью. :-)

[identity profile] vit-r.livejournal.com 2016-12-11 09:01 am (UTC)(link)
Весьма полезная вещь, если писать на ассемблере. Думаю, на языке высокого уровня эта особенность превратится в ад, потому и не прижилась.

[identity profile] nms.livejournal.com 2016-12-11 11:39 am (UTC)(link)
Burroughs, однако!

[identity profile] nms.livejournal.com 2016-12-12 04:25 am (UTC)(link)
Не понимай ссылку на Burroughs буквально. ;-)

(no subject)

[identity profile] b0p0h0k.livejournal.com - 2016-12-12 07:58 (UTC) - Expand

(no subject)

[identity profile] b0p0h0k.livejournal.com - 2016-12-14 02:32 (UTC) - Expand

(no subject)

[identity profile] netch80.livejournal.com - 2016-12-15 08:23 (UTC) - Expand

[identity profile] http://users.livejournal.com/katarsis_/ 2016-12-12 04:05 pm (UTC)(link)
православный эльбрус хвастался подобным. по мне так RWX в TLB достаточно.