Поскольку Бем и Вайзер фактически внедрили свой GC , то основным источником информации является исходный код этой реализации (это с открытым исходным кодом).
Чтобы собрать значения регистров, вы можете захотеть отключить функцию setjmp()
, которая сохраняет копию регистров в пользовательской структуре (по крайней мере, те регистры, которые должны сохраняться при вызовах функций). Но эта структура не стандартизирована (ее содержимое номинально непрозрачно), и setjmp()
может быть специально обработан компилятором C, что делает его немного деликатным для использования для всего, кроме longjmp()
(что уже довольно сложно, так как ). Часть встроенной сборки кажется намного проще и безопаснее.
Первая сложная часть в реализации GC, похоже, способна надежно определять начало и конец стеков (обратите внимание на множественное число: могут быть потоки, каждый со своим собственным стеком). Это требует углубления в плохо документированные детали ОС ABI. Когда моя настольная система представляла собой компьютер Alpha с FreeBSD, реализация Boehm-Weiser не могла работать на ней (хотя она поддерживала Linux на том же процессоре).
Вторая сложная часть будет при попытке перейти от поколения к поколению, улавливая доступ к записи, играя с правами доступа к странице. Это снова потребует прочтения некоторой документации сомнительного существования и некоторой встроенной сборки.