ЗАПИСЬ ТРАССИРОВКИ НА ОСНОВЕ КЭША С ИСПОЛЬЗОВАНИЕМ ДАННЫХ ПРОТОКОЛА КОГЕРЕНТНОСТИ КЭША
CACHE-BASED TRACE RECORDING USING DATA OF CACHE COHERENCE PROTOCOL

УРОВЕНЬ ТЕХНИКИ
[0001]
При написании кода во время разработки программных приложений разработчики обычно тратят значительное количество времени на "отладку" кода для поиска ошибок времени выполнения и других ошибок в исходном коде. При этом разработчики могут применять несколько подходов к повторению и локализации дефекта в исходном коде, таких как наблюдение за поведением программы на основе разных входных данных, вставка отладочного кода (например, чтобы печатать значения переменных для отслеживания ветвей исполнения, и т.д.), временное удаление частей кода, и т.д. Выискивание ошибок времени выполнения для выявления дефектов кода может отнимать значительную часть времени разработки приложений.
[0002]
Многие типы отладочных приложений ("отладчиков") были разработаны для того, чтобы помочь разработчикам в процессе отладки кода. Эти инструменты предлагают разработчикам возможность выполнять трассировку, визуализировать и изменять исполнение машинного кода. Например, отладчики могут визуализировать исполнение представленных в коде инструкций, могут отражать значения переменных в коде в разное время в ходе исполнения кода, могут позволить разработчикам изменять пути исполнения кода и/или могут позволить разработчикам устанавливать "точки останова" и/или "точки наблюдения" в интересуемых элементах кода (которые, при достижении в ходе исполнения, приводят к приостановке исполнения кода), помимо прочего.
[0003]
Перспективная форма отладочных приложений позволяет выполнять отладку "с переходом по времени", "обратную" или "хронологическую" отладку. При отладке "с переходом по времени" исполнение программы (например, исполняемых объектов, таких как потоки выполнения) записывается/трассируется посредством приложения трассировки в один или несколько файлов трассировки. Эти файл(ы) трассировки затем могут использоваться для воспроизведения исполнения программы позже, как для прямого, так и для обратного анализа. Например, отладчики "с переходом по времени" могут позволить разработчику устанавливать точки останова/наблюдения в прямом порядке (как обычные отладчики), а также точки останова/наблюдения в обратном порядке.
СУЩНОСТЬ ИЗОБРЕТЕНИЯ
[0004]
варианты осуществления в данном документе улучшают отладочные записи "с переходом по времени", задействуя разделяемый кэш обрабатывающего устройства (процессора), вместе с его протоколом когерентности кэша (CCP - cache coherence protocol), чтобы определить, какие данные должны регистрироваться (протоколироваться) в файле трассировки. Это может уменьшить размер файла трассировки на несколько порядков по сравнению с прежними подходами, тем самым значительно уменьшая издержки при записи трассировки.
[0005]
В некоторых случаях варианты осуществления реализуются в вычислительных средах, которые включают в себя (i) множество блоков обработки и (ii) кэш-память, содержащую множество строк кэша, которые используются для кэширования данных из одного или нескольких резервных хранилищ и которые разделяются (совместно используются) множеством блоков обработки. Согласованность данных во множестве строк кэша и одном или нескольких резервных хранилищах регулируется согласно протоколу когерентности кэша.
[0006]
Эти варианты осуществления включают в себя выполнение записи трассировки на основе кэша с использованием данных CCP. Эти варианты осуществления включают в себя определение того, что операция вызвала взаимодействие между конкретной строкой кэша из множества строк кэша и одним или несколькими резервными хранилищами, что регистрация разрешена для конкретного блока обработки из множества блоков обработки, который вызвал операцию, что конкретная строка кэша является участником регистрации, и что CCP указывает, что есть данные, которые должны быть зарегистрированы в трассировке. На основе, по меньшей мере, этих определений, варианты осуществления вызывают регистрацию этих данных в трассировке. Данные могут использоваться для воспроизведения операции.
[0007]
Данный раздел "Сущность изобретения" приводится для того, чтобы в упрощенной форме представить подборку концепций, которые дополнительно описаны ниже в разделе "Подробное описание изобретения". Данный раздел "Сущность изобретения" не предназначен для выявления ключевых признаков или основных признаков заявленного изобретения, а также не предназначен для использования в качестве помощи при определении объема заявленного изобретения.
КРАТКОЕ ОПИСАНИЕ ЧЕРТЕЖЕЙ
[0008]
Для того чтобы описать, каким образом могут быть получены вышеупомянутые и другие преимущества и признаки настоящего изобретения, более детальное описание настоящего изобретения, кратко описанного выше, будет предоставлено со ссылкой на его отдельные варианты осуществления, которые проиллюстрированы на прилагаемых чертежах. Подразумевая, что эти чертежи изображают только типичные варианты осуществления настоящего изобретения и, следовательно, не должны рассматриваться как ограничивающие его объем, настоящее изобретение будет описано и объяснено с дополнительной спецификой и детализацией посредством использования сопроводительных чертежей, на которых:
[0009]
Фиг. 1 показывает иллюстративную вычислительную среду, которая облегчает запись с "точностью до бита" трассировки исполнения кода через разделяемые кэши с использованием данных протокола когерентности кэша (CCP);
[0010]
Фиг. 2 показывает пример разделяемого кэша;
[0011]
Фиг. 3 показывает блок-схему последовательности операций иллюстративного способа для выполнения записи трассировки на основе кэша с использованием данных CCP;
[0012]
Фиг. 4A показывает иллюстративный разделяемый кэш, который расширяет каждую из своих строк кэша одним или несколькими дополнительными учетными битами;
[0013]
Фиг. 4B показывает пример разделяемого кэша, который включает в себя одну или несколько зарезервированных строк кэша для хранения учетных битов, применимых для обычных строк кэша;
[0014]
Фиг. 5 показывает пример ассоциативных отображений кэша;
[0015]
Фиг. 6A показывает таблицу, которая демонстрирует иллюстративные действия считывания и записи четырьмя блоками обработки на одной строке в разделяемом кэше;
[0016]
Фиг. 6B показывает таблицу, которая демонстрирует иллюстративное состояние когерентности отслеживаемого кэша на основе действий считывания и записи, продемонстрированных на Фиг. 6A;
[0017]
Фиг. 6C показывает таблицу, которая демонстрирует иллюстративные данные, хранящиеся в учетных битах (т.е. битах блоков, индексных битах и/или флаговых битах) разделяемого кэша на основе действий считывания и записи, продемонстрированных на Фиг. 6A;
[0018]
Фиг. 6D показывает таблицу, которая демонстрирует иллюстративные данные регистрации, которые могут быть записаны в файлы трассировки в связи с действиями считывания и записи, продемонстрированными на Фиг. 6A;
[0019]
Фиг. 7A показывает пример, в котором некоторые переходы считывание->считывание могут быть исключены из трассировки в зависимости от того, как отслеживаются обрабатывающие устройства;
[0020]
Фиг. 7B показывает пример регистрации данных, которая пропускает переходы считывание->считывание, выделенные на Фиг. 7A;
[0021]
Фиг. 7C показывает таблицу, которая демонстрирует регистрацию данных, которые могут быть записаны, если используются "индексные биты", и индексы обновляются при считываниях;
[0022]
Фиг. 8A показывает иллюстративную вычислительную среду, включающую в себя два обрабатывающих устройства, каждое из которых включает в себя четыре блока обработки, и кэши L1-L3;
[0023]
Фиг. 8B показывает таблицу, которая демонстрирует иллюстративные операции считывания и записи, выполняемые некоторыми из блоков обработки, показанных на Фиг. 8A;
[0024]
Фиг. 9A показывает таблицу, которая демонстрирует иллюстративные считывания и записи двумя блоками обработки;
[0025]
Фиг. 9B показывает пример таблицы, которая сравнивает, как элементы регистрации могут вноситься средой, которая предоставляет информацию о блоке CCP плюс флаговый бит строки кэша, в отличие от среды, которая предоставляет индексную информацию CCP плюс флаговый бит строки кэша;
[0026]
Фиг. 10A показывает пример разных частей адреса памяти и их связь с ассоциативными кэшами; и
[0027]
Фиг. 10B показывает пример регистрации кэш-промахов и вытеснений данных из кэша в ассоциативном кэше.
ПОДРОБНОЕ ОПИСАНИЕ ИЗОБРЕТЕНИЯ
[0028]
Варианты осуществления в данном документе улучшают отладочные записи "с переходом по времени", задействуя разделяемый кэш обрабатывающего устройства, вместе с его протоколом когерентности кэша, чтобы определить, какие данные должны регистрироваться в файле трассировки. Это может уменьшить размер файла трассировки на несколько порядков по сравнению с прежними подходами, тем самым значительно уменьшая издержки при записи трассировки.
[0029]
Фиг. 1 показывает иллюстративную вычислительную среду 100, которая облегчает запись с "точностью до бита" трассировки исполнения кода через разделяемые кэши с использованием данных протокола когерентности кэша. Как изображено, варианты осуществления могут содержать или задействовать компьютерную систему 101, специализированную или общего назначения, которая включает в себя компьютерное аппаратное обеспечение, такое как, например, одно или несколько обрабатывающих устройств 102, системная память 103, одно или несколько хранилищ 104 данных и/или аппаратное обеспечение 105 ввода/вывода.
[0030]
Варианты осуществления в пределах объема настоящего изобретения включают в себя физические и другие машиночитаемые носители для переноса или хранения исполняемых компьютером инструкций и/или структур данных. Такие машиночитаемые носители могут быть любыми пригодными носителями, к которым может получить доступ компьютерная система 101. Машиночитаемые носители, которые хранят исполняемые компьютером инструкции и/или структуры данных, представляют собой компьютерные устройства хранения. Машиночитаемые носители, которые переносят исполняемые компьютером инструкции и/или структуры данных, представляют собой средства передачи данных. Таким образом, для примера, но не ограничения, варианты осуществления настоящего изобретения могут содержать, по меньшей мере, два совершенно разных типа машиночитаемых носителей: компьютерные устройства хранения и средства передачи данных.
[0031]
Компьютерные устройства хранения представляют собой физические устройства аппаратного обеспечения, которые хранят исполняемые компьютером инструкции и/или структуры данных. Компьютерные устройства хранения включают в себя различное компьютерное аппаратное обеспечение, такое как ОЗУ, ПЗУ, ЭСППЗУ, твердотельные накопители (SSD), флэш-память, память с изменением фазы (PCM), хранилище на оптических дисках, хранилище на магнитных дисках или другие магнитные устройства хранения, или любое другое устройство(а) аппаратного обеспечения, которое может использоваться для хранения программного кода в форме исполняемых компьютером инструкций или структур данных, и к которым может получить доступ и исполнить компьютерная система 101, чтобы реализовать раскрываемые функциональные возможности настоящего изобретения. Таким образом, например, компьютерные устройства хранения могут включать в себя изображенную системную память 103, изображенное хранилище 104 данных, которое может хранить исполняемые компьютером инструкции и/или структуры данных, или другое хранилище, такое так встроенное в обрабатывающее устройство хранилище, как будет обсуждаться ниже.
[0032]
Средства передачи могут включать в себя сеть и/или каналы передачи данных, которые могут использоваться для переноса программного кода в форме исполняемых компьютером инструкций или структур данных, и к которым может получить доступ компьютерная система 101. "Сеть" определяется как один или несколько каналов передачи данных, которые обеспечивают возможность транспортировки электронных данных между компьютерными системами и/или модулями и/или другими электронными устройствами. Когда информация перемещается или предоставляется по сети или иному соединению связи (будь то проводное, беспроводное или комбинация проводного или беспроводного) в компьютерную систему, компьютерная система может рассматривать это соединение как средство передачи. Комбинации вышеперечисленного также должны быть включены в объем машиночитаемых носителей. Например, аппаратное обеспечение 105 ввода/вывода может содержать аппаратное обеспечение (например, модуль сетевого интерфейса (например, "NIC")), которое устанавливает соединение с сетью и/или каналом передачи данных, который может использоваться для переноса программного кода в форме исполняемых компьютером инструкций или структур данных.
[0033]
Кроме того, при достижении различных компонентов компьютерной системы, программный код в форме исполняемых компьютером инструкций или структур данных может автоматически перемещаться от средств передачи на компьютерные устройства хранения (или наоборот). Например, исполняемые компьютером инструкции или структуры данных, принятые по сети или каналу передачи данных, могут быть помещены в буфер в ОЗУ внутри NIC (например, аппаратное обеспечение 105 ввода/вывода), а впоследствии перемещены в системную память 103 и/или менее энергозависимые компьютерные устройства хранения (например, хранилище 104 данных) в компьютерной системе 101. Таким образом, следует понимать, что компьютерные устройства хранения могут быть включены в состав компонентов компьютерной системы, которые тоже (или даже в первую очередь) используют средства передачи.
[0034]
Исполняемые компьютером инструкции содержат, например, инструкции и данные, которые, при исполнении в обрабатывающем устройстве(ах) 102, заставляют компьютерную систему 101 выполнять определенную функцию или совокупность функций. Исполняемые компьютером инструкции могут быть представлены, например, двоичными данными, инструкциями в промежуточном формате, таком как язык ассемблера, или даже исходным кодом.
[0035]
Специалистам в данной области техники будет понятно, что настоящее изобретение может быть реализовано на практике в сетевых вычислительных средах со многими типами конфигураций компьютерных систем, включающих в себя персональные компьютеры, настольные компьютеры, дорожные компьютеры, устройства обработки сообщений, переносные устройства, многопроцессорные системы, микропроцессорную или программируемую бытовую электронику, сетевые ПК, миникомпьютеры, большие многопользовательские компьютеры, подвижные телефоны, КПК, планшеты, устройства персонального вызова, маршрутизаторы, коммутаторы, и тому подобное. Настоящее изобретение также может быть реализовано на практике в средах распределенных систем, где задачи выполняют как локальные, так и удаленные компьютерные системы, которые связаны (посредством либо проводных каналов передачи данных, либо беспроводных каналов передачи данных, либо комбинации проводных и беспроводных каналов передачи данных) через сеть. Собственно, в среде распределенных систем компьютерная система может включать в себя множество составляющих компьютерных систем. В среде распределенных систем программные модули могут быть расположены как в локальных, так и в удаленных запоминающих устройствах.
[0036]
Специалистам в данной области техники также будет понятно, что настоящее изобретение может быть реализовано на практике в среде облачных вычислений. Среды облачных вычислений могут быть распределенными, хотя это не обязательно. При распределении среды облачных вычислений могут быть распределены по всему миру в рамках организации и/или иметь компоненты, которыми владеют различные организации. В данном описании изобретения и последующей формуле изобретения "облачные вычисления" определяются как модель для предоставления по требованию сетевого доступа к разделяемому пулу настраиваемых вычислительных ресурсов (например, сетей, обслуживающих узлов, хранилищ, приложений и услуг). Определение "облачные вычисления" не ограничивается какими-либо другими многочисленными преимуществами, которые могут быть получены благодаря такой модели при правильном развертывании.
[0037]
Модель облачных вычислений может складываться из различных характеристик, таких как самообслуживание по требованию, свободный доступ к сети, объединение ресурсов, способность к быстрой адаптации, измеримое обслуживание и так далее. Модель облачных вычислений также может принимать форму различных моделей обслуживания, таких как, например, Программное обеспечение как услуга (SaaS), Платформа как услуга ("PaaS) и Инфраструктура как услуга (IaaS). Модель облачных вычислений также может быть развернута с использованием разных моделей развертывания, таких как частное облако, коллективное облако, публичное облако, гибридное облако, и так далее.
[0038]
Некоторые варианты осуществления, такие как среда облачных вычислений, могут содержать систему, которая включает в себя один или несколько узлов, каждый из которых способен обеспечивать функционирование одной или нескольких виртуальных машин. Во время работы виртуальные машины эмулируют действующую вычислительную систему, поддерживая операционную систему, а также, возможно, одно или несколько других приложений. В некоторых вариантах осуществления каждый узел включает в себя гипервизор (программу управления операционными системами), который эмулирует виртуальные ресурсы для виртуальных машин, используя физические ресурсы, которые представлены абстрагировано для виртуальных машин. Гипервизор также обеспечивает надлежащую изоляцию между виртуальными машинами. Таким образом, с точки зрения любой данной виртуальной машины, гипервизор создает иллюзию того, что виртуальная машина взаимодействует с физическим ресурсом, даже при том, что виртуальная машина взаимодействует лишь с внешним представлением (например, виртуальным ресурсом) физического ресурса. Примеры физических ресурсов включают в себя вычислительную мощность, память, дисковое пространство, пропускную способность сети, медиа-накопители, и так далее.
[0039]
Как показано, хранилище 104 данных может хранить исполняемые компьютером инструкции и/или структуры данных, представляющие прикладные программы, такие как, например, трассировщик 104a, ядро 104b операционной системы и приложение 104c (например, приложение, которое является объектом трассировки для трассировщика 104a, и один или несколько файлов 104d трассировки). Когда эти программы исполняются (например, с использованием обрабатывающего устройства 102), системная память 103 может хранить соответствующие данные времени выполнения, такие как структуры данных времени выполнения, исполняемые компьютером инструкции, и т.д. Поэтому Фиг. 1 показывает системную память 103 как включающую в себя программный код 103a времени выполнения и данные 103b времени выполнения приложения (например, которые соотносятся с приложением 104c).
[0040]
Трассировщик 104a может использоваться для записи с точностью до бита трассировки исполнения приложения, такого как приложение 104c, и сохранять данные трассировки в файле(ах) 104d трассировки. В некоторых вариантах осуществления трассировщик 104a является автономным приложением, тогда как в других вариантах осуществления трассировщик 104a интегрирован в другой компонент программного обеспечения, такой как ядро 104b операционной системы, гипервизор, облачная структура, и т.д. Хотя файл(ы) 104d трассировки изображен как хранящийся в хранилище 104 данных, файл(ы) 104d трассировки также может быть записан монопольно или временно в системной памяти 103 или в каком-то другом устройстве хранения.
[0041]
Фиг. 1 включает в себя упрощенное представление внутренних аппаратных компонентов обрабатывающего устройства(в) 102. Как показано, каждое обрабатывающее устройство 102 включает в себя множество блоков 102a обработки. Каждый блок обработки может быть физическим (т.е. физическим ядром обрабатывающего устройства) и/или логическим (т.е. логическим ядром, представленным физическим ядром, которое поддерживает гиперпараллельность, при которой на физическом ядре исполняется более одного потока выполнения приложения). Таким образом, например, даже при том, что обрабатывающее устройство 102 в некоторых вариантах осуществления может включать в себя только один физический блок обработки (ядро), он мог бы включать в себя два или более логических блоков 102a обработки, представленных этим одним физическим блоком обработки.
[0042]
Каждый блок 102a обработки исполняет инструкции обрабатывающего устройства, которые задаются приложениями (например, трассировщиком 104a, операционным ядром 104b, приложением 104c, и т.д.), и такие инструкции выбираются из предварительно заданной архитектуры набора инструкций (ISA - instruction set architecture) обрабатывающего устройства. Конкретная ISA каждого обрабатывающего устройства 102 варьируется в зависимости от производителя обрабатывающего устройства и модели обрабатывающего устройства. Распространенные ISA включают в себя архитектуры IA-64 и IA-32 от компании INTEL, INC., архитектуру AMD64 от компании ADVANCED MICRO DEVICES, INC. и различные архитектуры Advanced RISC Machine ("ARM") от компании ARM HOLDINGS, PLC, хотя большое количество других ISA существуют и могут использоваться настоящим изобретением. Вообще, "инструкция" является наименьшей внешне видимой (т.е. внешне по отношению к обрабатывающему устройству) единицей кода, которая может исполняться обрабатывающим устройством.
[0043]
Каждый блок 102a обработки получает инструкции обрабатывающего устройства из разделяемого кэша 102b и исполняет инструкции обрабатывающего устройства на основе данных в разделяемом кэше 102b, на основе данных в регистрах 102d, и/или без входных данных. Вообще, разделяемый кэш 102b представляет собой оперативную память небольшого объема (т.е. небольшого по сравнению с обычным объемом системной памяти 103), которая хранит копии на обрабатывающем устройстве частей резервного хранилища, такого как системная память 103 и/или другой кэш. Например, при исполнении кода 103a приложения разделяемый кэш 102b вмещает части данных 103b времени выполнения приложения. Если блоку(ам) 102a обработки требуются данные, еще не сохраненные в разделяемом кэше 102b, то происходит "кэш-промах", и эти данные извлекаются из системной памяти 103 (вероятно, "вытесняя" некоторые другие данные из разделяемого кэша 102b).
[0044]
Как правило, разделяемый кэш 102b содержит множество "строк кэша", каждая из которых хранит участок памяти из резервного хранилища. Например, Фиг. 2 показывает пример, по меньшей мере, части разделяемого кэша 200, который включает в себя множество строк 203 кэша, каждая из которых включает в себя адресную часть 201 и часть 202 значения. Адресная часть 201 каждой строки 203 кэша может хранить адрес в резервном хранилище (например, системной памяти 103), которому соответствует эта строка, а часть 202 значения может первоначально хранить значение, принятое из резервного хранилища. Часть 202 значения может быть модифицирована блоками 102a обработки, и впоследствии вытеснена обратно в резервное хранилище. Как обозначено эллипсами, разделяемый кэш 200 может включать в себя большое количество строк кэша. Например, современное обрабатывающее устройство INTEL может содержать кэш уровня 1, содержащий 512 или более строк кэша. В этом кэше каждая строка кэша обычно может использоваться для хранения 64-байтового (512-битного) значения со ссылкой на 8-байтовый (64-битный) адрес памяти.
[0045]
Адрес, хранящийся в адресной части 201 каждой строки 203 кэша, может быть физическим адресом, таким как фактический адрес памяти в системной памяти 103. В качестве альтернативы, адрес, хранящийся в адресной части 201 каждой строки 203 кэша, может быть виртуальным адресом, который является адресом, назначенным физическому адресу для обеспечения абстракции. Такие абстракции могут использоваться, например, чтобы способствовать изоляции памяти между разными процессами, исполняемыми на обрабатывающем устройстве(ах) 102. При использовании виртуальных адресов обрабатывающее устройство 102 может включать в себя буфер 102f быстрого преобразования адреса (TLB - translation lookaside buffer) (обычно это составная часть блока управления памятью (MMU - memory management unit)), который поддерживает отображение между физическим и виртуальным адресом памяти.
[0046]
Разделяемый кэш 102b может включать в себя часть кэша кода и часть кэша данных. Например, при исполнении кода 103a приложения, часть кода разделяемого кэша 102b хранит, по меньшей мере, часть инструкций обрабатывающего устройства, хранящихся в коде 103a приложения, а часть данных разделяемого кэша 102b хранит, по меньшей мере, часть структур данных из данных 103b времени выполнения приложения. Часто кэш обрабатывающего устройства разделяется на отдельные ярусы/уровни (например, уровень 1 (L1), уровень 2 (L2) и уровень 3 (L3)), причем некоторые ярусы (например, L3), теоретически, существуют отдельно от обрабатывающего устройства(в) 102. Таким образом, разделяемый кэш 102b может содержать один из этих уровней (L1) или может содержать множество этих уровней.
[0047]
При использовании нескольких уровней кэша блок(и) 102a обработки взаимодействуют непосредственно с самым нижним уровнем (L1). В большинстве случаев данные перетекают между уровнями (например, при считывании кэш L3 взаимодействует с системной памятью 103 и подает данные в кэш L2, а кэш L2, в свою очередь, подает данные в кэш L1). Когда блок 102a обработки должен выполнить запись, кэши координируются, чтобы гарантировать, что в тех кэшах, которые имели подвергшиеся изменению данные, которые разделялись блоком(ами) 102a обработки, их больше нет. Эта координация выполняется с использованием протокола когерентности кэша (обсуждается позже).
[0048]
Кэши могут быть инклюзивными, эксклюзивными, или включать в себя как инклюзивное, так и эксклюзивное поведение. Например, в инклюзивном кэше уровень L3 будет хранить надмножество данных в уровнях L2 ниже него, а уровни L2 хранят надмножество уровней L1 ниже них. В эксклюзивных кэшах уровни могут быть непересекающимися, например, если в кэше L3 имеются данные, которые нужны кэшу L1, они могут обмениваться информацией, такой как данные, адрес, и тому подобное.
[0049]
Каждый блок 102 обработки также включает в себя микропрограмму 102c, которая содержит управляющую логику (т.е. исполняемые инструкции), которая управляет работой обрабатывающего устройства 102, и которая обычно выполняет функцию интерпретатора между аппаратным обеспечением обрабатывающего устройства и ISA обрабатывающего устройства, раскрытой обрабатывающим устройством 102 для исполнения приложений. Микропрограмма 102 может быть на практике реализована во встроенном в обрабатывающее устройство хранилище, таком как ПЗУ, ЭСППЗУ, и т.д.
[0050]
Регистры 102d представляют собой аппаратные ячейки хранения, которые задаются на основе ISA обрабатывающего устройства(в) 102, и из которых осуществляется считывание и/или в которые осуществляется запись благодаря инструкциям обрабатывающего устройства. Например, регистры 102d обычно используются для хранения значений, извлеченных из разделяемого кэша 102b, для использования инструкциями, для хранения результатов исполнения инструкций и/или для хранения статуса или состояния, к примеру, некоторых побочных эффектов исполнения инструкций (например, признак изменения значения, достижение значением нуля, возникновение переноса, и т.д.), счетчика циклов обрабатывающего устройства, и т.д. Поэтому некоторые регистры 102d могут содержать "флаги", которые используются, чтобы сигнализировать о некотором изменении состояния, вызванном исполнением инструкций обрабатывающего устройства. В некоторых вариантах осуществления обрабатывающие устройства 102 также могут включать в себя управляющие регистры, которые используются для управления разными аспектами работы обрабатывающего устройства.
[0051]
В некоторых вариантах осуществления обрабатывающее устройство(а) 102 может включать в себя один или несколько буферов 102e. Как будет обсуждаться в данном документе ниже, буфер(ы) 102e может использоваться в качестве временной ячейки хранения для данных трассировки. Таким образом, например, обрабатывающее устройство(а) 102 может хранить части данных трассировки в буфере(ах) 102e, и сбрасывать эти данные в файл(ы) 104d трассировки в подходящее время, к примеру, когда не занята полоса пропускания шины памяти. В некоторых реализациях буфер(ы) 102e может быть составной частью разделяемого кэша 102b.
[0052]
Как упоминалось выше, обрабатывающие устройства, обладающие разделяемым кэшем 102b, работают с кэшем согласно протоколу когерентности кэша (CCP). В частности, CCP задают, как поддерживается согласованность между данными в разделяемом кэше 102b и резервном хранилище данных (например, системной памяти 103 или другом кэше), поскольку различные блоки 102a обработки считывают и записывают данные в разделяемом кэше 102b, и как обеспечивается, чтобы различные блоки 102a обработки всегда считывали действительные данные из данной ячейки в разделяемом кэше 102b. Как правило, CCP связаны с моделью памяти, заданной ISA обрабатывающего устройства 102, и приспособлены к ней.
[0053]
Примеры общих CCP включают в себя протокол MSI (т.е. Modified, Shared, and Invalid - Модифицированная, Разделяемая и Недействительная), протокол MESI (т.е. Modified, Exclusive, Shared, and Invalid - Модифицированная, Эксклюзивная, Разделяемая и Недействительная), и протокол MOESI (т.е. Modified, Owned, Exclusive, Shared, and Invalid - Модифицированная, Собственная, Эксклюзивная, Разделяемая и Недействительная). Каждый из этих протоколов определяет состояние для отдельных ячеек (например, строк) в разделяемом кэше 102b. "Модифицированная" ячейка кэша содержит в себе данные, которые были модифицированы в разделяемом кэше 102b и поэтому, вероятно, не согласованы с соответствующими данными в резервном хранилище (например, в системной памяти 103 или в другом кэше). Когда ячейка, имеющая состояние "модифицированная", вытесняется из разделяемого кэша 102b, общие CCP требуют, чтобы кэш гарантировал, что его данные записаны обратно в резервное хранилище, или что другой кэш взял на себя эту ответственность. "Разделяемая" ячейка кэша содержит в себе данные, которые не модифицированы по сравнению с данными в резервном хранилище, находятся в состоянии только для чтения и разделяются блоком(ами) 102a обработки. Разделяемый кэш 102b может вытеснить эти данные, не записывая их в резервное хранилище. "Недействительная" ячейка кэша не содержит в себе действительных данных и может считаться пустой и пригодной для сохранения данных в результате кэш-промаха. "Эксклюзивная" ячейка кэша содержит в себе данные, которые совпадают с резервным хранилищем, и используется только одним блоком 102a обработки. Она может быть изменена на состояние "разделяемая" в любое время (т.е. в ответ на запрос на считывание) или может быть изменена на состояние "модифицированная" при записи в нее. "Собственная" ячейка кэша разделяется двумя или более блоками 102a обработки, но один из блоков обработки имеет эксклюзивное право вносить в нее изменения. Когда такой блок обработки вносит изменения, он прямо или косвенно уведомляет другие блоки обработки, так как уведомляемым блокам обработки может потребоваться признание недействительности или обновление, в зависимости от реализации CCP.
[0054]
Степень детализации, с которой разные CCP отслеживают когерентность кэша и делают эти данные когерентности кэша доступными для трассировщика 104a, может варьироваться. Например, на одной границе диапазона, некоторые CCP отслеживают когерентность кэша для каждой строки кэша, а также для каждого блока обработки. Следовательно, эти CCP могут отслеживать состояние каждой строки кэша, и как она связана с каждым блоком обработки. Как будет продемонстрировано в примере, который последует применительно к Фиг. 6A-6D, это означает, что отдельная строка кэша может иметь информацию о своем состоянии, и как она связана с каждым блоком 102a обработки. Другие CCP менее детализированы и отслеживают когерентность кэша только на уровне строки кэша (и не имеют информации по каждому блоку обработки). На другой границе диапазона производители обрабатывающих устройств могут выбирать для отслеживания когерентности кэша только уровень строки кэша для эффективности, поскольку одновременно только одно обрабатывающее устройство может эксклюзивно владеть строкой (эксклюзивной, модифицированной и т.д.). В качестве примера средней степени детализации CCP может отслеживать когерентность кэша для каждой строки кэша, а также индекс (например, 0, 1, 2, 3 для обрабатывающего устройства с четырьмя блоками обработки) для блока обработки, который имеет текущее состояние строки кэша.
[0055]
Варианты осуществления задействуют разделяемый кэш 102b обрабатывающего устройства, чтобы эффективно записывать с точностью до бита трассировку исполнения приложения 104c и/или ядра 104b операционной системы. Эти варианты осуществления строятся на наблюдении, что обрабатывающее устройство 102 (включающее в себя разделяемый кэш 102b) формирует полу- или квазизамкнутую систему. Например, после загрузки части данных для обработки (т.е. данных кода и данных приложения времени выполнения) в разделяемый кэш 102b, обрабатывающее устройство 102 может работать само по себе, без какого-либо ввода данных, как полу- или квазизамкнутая система в течение коротких интервалов времени. В частности, один или несколько блоков 102a обработки исполняют инструкции из части кода разделяемого кэша 102b, используя данные времени выполнения, хранящиеся в частях данных разделяемого кэша 102b, и используя регистры 102d.
[0056]
Когда блоку 102a обработки требуется некоторое поступление информации (например, потому что инструкция, которую он исполняет, будет исполнять или может исполнить, обращается к данным кода или к данным времени выполнения, которых еще нет в разделяемом кэше 102b), происходит "кэш-промах", и эта информация заносится в разделяемый кэш 102b из системной памяти 103. Например, если кэш-промах данных происходит, когда исполняемая инструкция выполняет операцию в памяти по адресу памяти в пределах данных 103b времени выполнения приложения, данные из этого адреса памяти заносятся в одну из строк кэша части данных разделяемого кэша 102b. Аналогично, если происходит кэш-промах кода, когда инструкция выполняет операцию в памяти по коду 103a приложения с адресом памяти, хранящемуся в системной памяти 103, код из этого адреса памяти заносится в одну из строк кэша части кода разделяемого кэша 102b. Затем блок 102a обработки продолжает исполнение, используя новую информацию в разделяемом кэше 102b, пока новая информация снова не будет занесена в разделяемый кэш 102b (например, вследствие другого кэш-промаха или некэшированного считывания).
[0057]
Автор настоящего изобретения заметил, что для записи представления с точностью до бита исполнения приложения трассировщик 104a может записывать достаточно данных, чтобы иметь возможность повторить поступление информации в разделяемый кэш 102b во время исполнения этого потока(ов) выполнения приложения. Первый подход к этому состоит в том, чтобы записывать все данные, которые заносятся в разделяемый кэш 102b, путем регистрации всех кэш-промахов и некэшированных считываний (т.е. считываний из аппаратных компонентов и некэшируемой памяти), а также время в ходе исполнения, когда каждый фрагмент данных был занесен в разделяемый кэш 102b (например, используя количество исполненных инструкций или какой-нибудь другой счетчик).
[0058]
Второй подход, который приводит к значительно меньшим файлам трассировки, чем первый подход, состоит в том, чтобы отслеживать и записывать строки кэша, которые "потреблялись" каждым блоком 102a обработки. Как используется в данном документе, блок обработки "потребил" строку кэша, если он знает ее текущее значение. Это может быть потому, что блок обработки является тем, который записал текущее значение строки кэша, или потому, что блок обработки выполнил считывание в строке кэша. Этот второй подход охватывает расширения разделяемого кэша 102b, которые позволяют обрабатывающему устройству 102 идентифицировать, для каждой строки кэша, один или несколько блоков 102a обработки, которые потребляли строку кэша.
[0059]
В соответствии с вариантами осуществления в данном документе, третий подход состоит в том, чтобы задействовать CCP обрабатывающего устройства для определения подмножества "потребляемых" строк кэша для записи в файл(ы) 104d, и это по-прежнему позволит повторить действия разделяемого кэша 102b. Этот третий подход приводит к значительно меньшим файлам трассировки, а значит, значительно меньшим издержкам, чем и первый и второй подходы.
[0060]
Некоторые варианты осуществления в данном документе записывают потоки данных трассировки, которые соответствуют блокам обработки/потокам выполнения. Например, файл(ы) 104 трассировки может включать в себя один или несколько отдельных потоков данных трассировки для каждого блока обработки. В этих вариантах осуществления пакеты данных в каждом потоке данных трассировки могут не иметь идентификации блока обработки, к которому относится пакет данных, так как эта информация присуща на основе самого потока данных трассировки. В этих вариантах осуществления, если компьютерная система 101 включает в себя несколько обрабатывающих устройств 102 (т.е. в разных гнездах для установки обрабатывающих устройств), файл(ы) трассировки может иметь один или несколько разных потоков данных трассировки для каждого блока 102a обработки в разных обрабатывающих устройствах 102. Множественные потоки данных могут использоваться даже для одного потока выполнения. Например, некоторые варианты осуществления могут соотносить один поток данных с блоком обработки, используемым потоком выполнения, и соотносить один или несколько дополнительных потоков данных с каждым разделяемым кэшем, используемым потоком выполнения.
[0061]
В других вариантах осуществления файл(ы) 104 трассировки может включать в себя один поток данных трассировки для обрабатывающего устройства 102 и может идентифицировать в каждом пакете данных, к какому блоку обработки относится пакет данных. В этих вариантах осуществления, если компьютерная система 101 включает в себя несколько обрабатывающих устройств 102, файл(ы) 104 трассировки может включать в себя отдельный поток данных трассировки для каждого из нескольких обрабатывающих устройств 102. Вне зависимости от формата файла(ов) трассировки пакеты данных для каждого блока 102a обработки, как правило, записываются независимо от других блоков обработки, что позволяет независимо воспроизводить разные потоки выполнения, которые исполнялись в разных блоках 102a обработки. Однако файлы трассировки могут включать в себя некоторую информацию, будь то прописанная или присущая, которая обеспечивает частичную упорядоченность между разными потоками выполнения.
[0062]
Фиг. 3 показывает блок-схему последовательности операций способа 300 для выполнения записи трассировки на основе кэша с использованием данных CCP. Способ 300 может включать в себя этапы, которые выполняются обрабатывающим устройством 102 по мере того, как трассировщик 104a выполняет трассировку приложения 104c и/или ядра 104b операционной системы. Действия, производимые обрабатывающим устройством 102, могут основываться на встроенной логике в обрабатывающем устройстве 102, программно-закодированной логике (т.е. микропрограмме 102c), и/или другом программном приложении, таком как трассировщик 104a, ядро 104b операционной системы, или гипервизор. Хотя Фиг. 3 и показывает последовательность этапов, следует понимать, что варианты осуществления могут выполнять многие из этих этапов в любом порядке, причем некоторые даже выполняются параллельно. Соответственно, последовательность этапов, продемонстрированная в способе 300, не является ограничивающей.
[0063]
Как изображено, способ 300 включает в себя этап 301, на котором обнаруживают взаимодействие между кэшем и резервным хранилищем. В некоторых вариантах осуществления этап 301 содержит этап, на котором обнаруживают операцию, которая вызывает взаимодействие между конкретной строкой кэша из множества строк кэша и одним или несколькими резервными хранилищами. Например, при исполнении потока выполнения приложения 104c или ядра 104b операционной системы в одном из блоков 102a обработки, блок обработки может вызвать взаимодействие между строкой в разделяемом кэше 102b и резервным хранилищем (например, системной памятью 103 или другим кэшем). Обнаружение может быть выполнено, например, обрабатывающим устройством 102 на основе исполнения его микропрограммы 102c.
[0064]
Способ 300 также включает в себя этап 302, на котором идентифицируют блок обработки, который вызвал взаимодействие. В некоторых вариантах осуществления этап 302 содержит этап, на котором идентифицируют конкретный блок обработки из множества блоков обработки, который вызвал операцию. Например, на основе исполнения микропрограммы 102c, обрабатывающее устройство 102 может идентифицировать, какой из блоков 102a обработки вызвал операцию, обнаруженную на этапе 301.
[0065]
Способ 300 также включает в себя этап 303, на котором определяют, разрешена ли регистрация для блока обработки. В некоторых вариантах осуществления этап 303 содержит этап, на котором используют один или несколько управляющих битов регистрации, чтобы определить, что регистрация разрешена для конкретного блока обработки. Например, обрабатывающее устройство 102 может определить, имеет ли блок обработки, идентифицированный на этапе 302, разрешенную регистрацию, основываясь на одном или нескольких управляющих битах регистрации. Использование управляющего бита(ов) регистрации позволяет динамически разрешать и запрещать регистрацию разных блоков обработки. Таким образом, благодаря использованию управляющего бита(ов) регистрации трассировщик 104a может динамически управлять тем, для какого потока(ов) выполнения производится трассировка, и/или для какой части(ей) исполнения разных потоков выполнения производится трассировка.
[0066]
Конкретная форма и функциональное назначение управляющего бита(ов) регистрации могут варьироваться. В некоторых вариантах осуществления, например, управляющий бит(ы) регистрации является/являются составной частью одного из регистров 102d, такого как управляющий регистр. В этих вариантах осуществления один управляющий бит регистрации может соответствовать одному блоку 102a обработки, либо множеству блоков 102a обработки. Соответственно, регистр 102d включает в себя один управляющий бит регистрации (например, соответствующий всем блокам обработки, или конкретному блоку обработки, или подмножеству блоков обработки), или может потенциально включать в себя множество управляющих битов регистрации (например, каждый из которых соответствует одному или нескольким блокам обработки). В других вариантах осуществления управляющий бит(ы) регистрации содержит, или иным образом соотнесен с ним, идентификатор адресного пространства (ASID - address space identifier) и/или идентификатор контекста процесса (PCID - process-context identifier), соответствующий инструкции, которая вызвала взаимодействие между кэшем и резервным хранилищем. Соответственно, например, способ 300 может производить трассировку блока обработки только тогда, когда он исполняет инструкции, соотнесенные с одним или несколькими конкретными ASID/PCID. Таким образом, способ 300 может записывать только определенное адресное пространство(а) и/или конкретный контекст(ы) процесса. Комбинации тоже возможны. Например, управляющий бит(ы) регистрации может сохраняться в одном или нескольких регистрах 102d, а устанавливаться/очищаться на основе текущих значений ASID/PCID. Независимо от формы управляющего бита(ов) регистрации, некоторые варианты осуществления могут иметь возможность устанавливать/очищать управляющий бит(ы) регистрации при переключениях контекста, позволяя способу 300 производить трассировку только конкретных потоков выполнения.
[0067]
Способ 300 также включает в себя этап 304, на котором определяют, участвует ли строка кэша в регистрации. В некоторых вариантах осуществления этап 304 содержит, на основе, по меньшей мере, того, что регистрация разрешена для конкретного блока обработки, этап, на котором определяют, участвует ли конкретная строка кэша в регистрации. Например, обрабатывающее устройство 102 может определить, вовлечена ли в регистрацию строка кэша, вовлеченная в операцию, обнаруженную на этапе 301. Как будет более подробно обсуждаться ниже, существует несколько механизмов, которые могут использоваться для обнаружения, такие как использование битов в пределах разделяемого кэша 102b или использование блокировки входа кэша.
[0068]
Способ 300 также включает в себя этап 305, на котором используют CCP для идентификации того, что есть данные, которые должны быть зарегистрированы в трассировке. Например, обрабатывающее устройство 102 может обратиться к своему CCP, чтобы определить, какие переходы в состоянии кэша произошли в результате операции, и служат ли эти переходы основанием для регистрации данных. Подробные примеры использования CCP для идентификации данных трассировки приведены далее в отношении Фиг. 6A-9B.
[0069]
Способ 300 также включает в себя этап 306, на котором регистрируют надлежащие данные в трассировке с использованием CCP. В некоторых вариантах осуществления этап 306 содержит этап, на котором вызывают регистрацию данных в трассировке, причем эти данные могут использоваться для воспроизведения операции. Когда данные должны быть зарегистрированы в файле(ах) трассировки, один или несколько пакетов данных могут быть добавлены в надлежащие потоки данных трассировки, такие как поток данных трассировки, который соответствует конкретному блоку обработки, или поток данных трассировки, который соответствует обрабатывающему устройству 102 в целом. Если надлежащий поток данных трассировки соответствует обрабатывающему устройству 102 в целом, один или несколько пакетов данных могут идентифицировать конкретный блок обработки. Необходимо отметить, что если поток данных трассировки соответствует обрабатывающему устройству 102 в целом, присущий порядок пакетов данных в самом потоке данных предоставляет некоторую дополнительную информацию об упорядоченности, которая может быть недоступной, если используется несколько потоков данных.
[0070]
Следует отметить, что когда разделяемый кэш 102b содержит несколько уровней кэша, в некоторых вариантах осуществления способ 300 работает на уровне кэша, который взаимодействует с системной памятью 103, поскольку именно этот уровень кэша обрабатывает кэш-промахи. Работа на этом уровне позволяет представлять действия кэша каждого блока обработки 102a без избыточности (т.е. не представляя действия блока более одного раза). Таким образом, например, если компьютерная система 101 включает в себя два обрабатывающих устройства 102 (т.е. два гнезда для установки обрабатывающих устройств) и содержит один "инклюзивный" кэш L3 для каждого гнезда, а также "инклюзивные" кэши L2 ниже кэша L3, в некоторых вариантах осуществления способ 300 работает на кэшах L3. Способ 300 также может работать на нескольких уровнях кэша. Например, если компьютерная система 101 включает в себя одно обрабатывающее устройство 102 (т.е. одно гнездо для установки обрабатывающих устройств) и содержит один "эксклюзивный" кэш L3 для гнезда, а также "инклюзивные" кэши L2 ниже кэша L3, способ 300 может работать на кэшах как L3, так и L2. Дополнительные примеры регистрации в пределах кэшей, показывающие смешанное инклюзивное/эксклюзивное поведение, обсуждаются ниже.
[0071]
Как упоминалось выше применительно к этапу 304, существует несколько механизмов, которые могут использоваться обрабатывающим устройством 102 для определения, является ли строка кэша "участником регистрации". Одним является расширение каждой строки разделяемого кэша 102b одним или несколькими дополнительными "учетными битами", которые могут использоваться как флаг, как идентификаторы блока обработки, или как индекс обрабатывающего устройства. Логика для управления этими "учетными битами" может быть составной частью микропрограммы 102c обрабатывающего устройства.
[0072]
Чтобы показать этот вариант осуществления, Фиг. 4A показывает иллюстративный разделяемый кэш 400a, подобный разделяемому кэшу 200, показанному на Фиг. 2, который расширяет каждую из своих строк 404 кэша одним или несколькими дополнительными учетными битами 401. Таким образом, каждая строка 404 кэша включает в себя учетный бит(ы) 401, обычные адресные биты 402 и биты 403 значения.
[0073]
В некоторых вариантах осуществления учетный бит(ы) 401 каждой строки кэша содержит один бит, который выполняет функцию флага (т.е. включен или выключен), используемого обрабатывающим устройством 102 для указания, участвует или нет строка кэша в регистрации трассировки. Если CCP обрабатывающего устройства имеет достаточную степень детализации (например, если CCP отслеживает состояние когерентности для каждой строки кэша либо как ее отношение к каждому блоку обработки, либо со ссылкой на индекс для блока обработки, которому принадлежит состояние когерентности строки кэша), этот единственный бит может быть достаточным для обеспечения записи надежной полностью детерминированной трассировки (т.е. такой, которая гарантирует способность полной реконструкции трассируемого исполнения).
[0074]
В других реализациях учетный бит(ы) 401 каждой строки включает в себя множество битов. Множество битов можно использовать несколькими способами. Используя один подход, упоминаемый в данном документе как "биты блоков", учетный бит(ы) 401 каждой строки кэша может включать в себя некоторое количество битов блоков, равное количеству блоков 102a обработки обрабатывающего устройства 102 (например, количеству логических блоков обработки, если обрабатывающее устройство 102 поддерживает гиперпараллельность, или количеству физических блоков обработки, если гиперпараллельность не поддерживается). Эти биты блоков могут использоваться обрабатывающим устройством 102, чтобы отслеживать, какие один или несколько конкретных блоков обработки потребляли строку кэша (или, если строка кэша не потреблялась, чтобы отметить, что ни один из блоков обработки не потреблял ее). Таким образом, например, разделяемый кэш 102b, который разделяется двумя блоками 102a обработки, может включать в себя два бита блоков для каждой строки кэша. В связи с этими битами блоков, добавленными к каждой строке кэша, варианты осуществления расширяют микропрограмму 102c обрабатывающего устройства, чтобы задействовать эти биты блоков для отслеживания того, было ли текущее значение в строке кэша зарегистрировано (т.е. в файле 104d трассировки) от имени каждого блока обработки, или иным образом известно блоку обработки. Если CCP обрабатывающего устройства имеет более грубую степень детализации (например, если CCP отслеживает состояние когерентности только на уровне строки кэша), эти биты блоков могут предоставлять дополнительную информацию для обеспечения надежной трассировки. Например, если строка кэша помечена CCP как разделяемая или эксклюзивная, биты блоков могут использоваться для идентификации того, какой блок(и) обработки разделяет строку кэша, или какой блок обработки имеет эксклюзивные права.
[0075]
При использовании другого подхода, упоминаемого в данном документе как "индексные биты", учетный бит(ы) 401 каждой строки кэша может включать в себя некоторое количество индексных битов, достаточных для представления индекса для каждого из блоков 102a обработки обрабатывающего устройства(в) 102 компьютерной системы 101, которые участвуют в регистрации, вместе с "зарезервированным" значением (например, -1). Например, если обрабатывающее устройство(а) 102 компьютерной системы 101 включает в себя 128 блоков 102a обработки, эти блоки обработки могут идентифицироваться по значению индекса (например, 0-127), используя только семь индексных битов на каждую строку кэша. В некоторых вариантах осуществления одно значение индекса резервируется (например, "недействительный"), чтобы указывать, что никакое обрабатывающее устройство не зарегистрировало строку кэша. Соответственно, это будет означать, что семь индексных битов фактически смогут представлять 127 блоков 102a обработки плюс зарезервированное значение. Например, двоичные значения 0000000-1111110 могут соответствовать индексным ячейкам 0-126 (в десятичном исчислении), а двоичное значение 1111111 (например, -1 или 127 в десятичном исчислении, в зависимости от интерпретации), может соответствовать "недействительному", чтобы указывать, что никакое обрабатывающее устройство не зарегистрировало соответствующую строку кэша, хотя это обозначение может варьироваться, в зависимости от реализации. Таким образом, биты блоков могут использоваться обрабатывающим устройством 102 для отслеживания, участвует ли строка кэша в регистрации трассировки (например, значение, отличное от -1), и как индекс для конкретного блока обработки, который потреблял строку кэша (например, блок обработки, который последним потреблял ее). Этот второй подход имеет преимущество, заключающееся в поддержке большого числа блоков обработки при небольших издержках в разделяемом кэше 102b, с недостатком, заключающимся в меньшей степени детализации по сравнению с первым подходом (т.е. только один блок обработки идентифицируется за один раз). Опять же, если CCP обрабатывающего устройства имеет более грубую степень детализации (например, если CCP отслеживает состояние когерентности только на уровне строки кэша), эти индексные биты могут предоставлять дополнительную информацию для обеспечения надежной трассировки. Например, если строка кэша помечена CCP как разделяемая или эксклюзивная, индексные биты могут использоваться для идентификации, по меньшей мере, одного блока обработки, который разделяет строку кэша, или того, какой блок обработки имеет эксклюзивные права.
[0076]
Другой механизм, который может использоваться обрабатывающим устройством 102 для определения того, является ли строка кэша участником регистрации, может воспользоваться концепциями, обсуждаемыми применительно к Фиг. 4A, но без расширения каждой строки кэша дополнительным учетным битом(ами) 401 для учетных битов. Вместо этого данный механизм резервирует одну или несколько строк 404 кэша для хранения учетных битов. Фиг. 4B показывает пример разделяемого кэша 400b, который включает в себя обычные строки 405 кэша, в которых хранятся адреса 402 памяти и значения 403, а также одну или несколько зарезервированных строк 406 кэша для хранения учетных битов, которые применяются для обычных строк 405 кэша. Биты зарезервированной строки(строк) 406 кэша распределяются в разные группы учетных битов, каждая из которых соответствует одной отдельной из обычных строк 405 кэша. Эти группы учетных битов могут выполнять функцию флагового бита, битов блоков или индексных битов, в зависимости от реализации.
[0077]
Другой механизм, который может использоваться обрабатывающим устройством(ами) 102 для определения того, является ли строка кэша участником регистрации, заключается в том, чтобы задействовать ассоциативные кэши и блокировку входа. Поскольку разделяемый кэш 102b обрабатывающего устройства, как правило, намного меньше системной памяти 103 (часто на порядки), значит обычно в системной памяти 103 намного больше ячеек памяти, чем строк в разделяемом кэше 102b. Поэтому каждое обрабатывающее устройство определяет механизм для отображения множественных ячеек памяти системной памяти в строку(и) в разделяемом кэше. Как правило, обрабатывающие устройства применяют один из двух общих методов: прямое отображение и ассоциативное отображение. При использовании прямого отображения разные ячейки памяти в системной памяти 103 отображаются только в одну строку в кэше, так что каждая ячейка памяти может кэшироваться только в конкретную строку в кэше.
[0078]
С другой стороны, при использовании ассоциативного отображения разные ячейки в системной памяти 103 могут кэшироваться в одну из множества строк в разделяемом кэше 102b. Фиг. 5 показывает пример 500 ассоциативных отображений кэша. В этом случае строки 504 кэша из кэша 502 логически разделены на разные адресные группы по две строки кэша в каждой, в том числе первую группу из двух строк 504a и 504b кэша (отождествленную с индексом 0) и вторую адресную группу из двух строк 504c и 504d кэша (отождествленную с индексом 1). Каждая строка кэша в адресной группе соотнесена со своим "входом", так что строка 504a кэша идентифицируется индексом 0, входом 0, строка 504b кэша идентифицируется индексом 0, входом 1, и так далее. Как изображено дополнительно, ячейки 503a, 503c, 503e и 503g памяти (индексы 0, 2, 4 и 6 памяти) отображаются в индекс 0. Соответственно, каждая из этих ячеек в системной памяти может кэшироваться в любую строку кэша в пределах группы с индексом 0 (т.е. строки 504a и 504b кэша). Конкретные шаблоны изображенных отображений предназначены только для иллюстративных и концептуальных целей и не должны интерпретироваться как единственный способ, которым индексы памяти могут отображаться в строки кэша.
[0079]
Ассоциативные кэши, как правило, упоминаются как ассоциативные кэши с N входами, где N является количеством "входов" в каждой адресной группе. Таким образом, кэш 500 на Фиг. 5 может упоминаться как ассоциативный кэш с 2 входами. Обрабатывающие устройства обычно реализуют кэши с N входами, где N является степенью двух (например, 2, 4, 8, и т.д.), причем обычно значения N выбираются из 4 и 8 (хотя варианты осуществления в данном документе не ограничиваются никакими конкретными значениями N или подмножествами значений N). В частности, ассоциативный кэш с 1 входом в целом эквивалентен кэшу с прямым отображением, поскольку каждая адресная группа содержит в себе только одну строку кэша. Дополнительно, если N равно количеству строк в кэше, он упоминается как полностью ассоциативный кэш, поскольку он содержит единственную адресную группу, содержащую в себе все строки в кэше. В полностью ассоциативных кэшах любая ячейка памяти может кэшироваться в любую строку в кэше.
[0080]
Следует отметить, что Фиг. 5 представляет упрощенный вид системной памяти и кэшей, чтобы проиллюстрировать общие принципы. Например, хотя на Фиг. 5 отдельные ячейки памяти отображаются в строки кэша, следует понимать, что каждая строка в кэше, как правило, хранит данные, относящиеся к нескольким адресуемым ячейкам в системной памяти. Таким образом, на Фиг. 5, каждая ячейка (503a-503h) в системной памяти (501), может фактически представлять множество адресуемых ячеек памяти. Дополнительно, отображения могут быть между фактическими физическими адресами в системной памяти 501 и строками в кэше 502, или могут использовать промежуточный уровень виртуальных адресов.
[0081]
Ассоциативные кэши могут использоваться для определения того, является ли строка кэша участником регистрации, посредством использования блокировки входа. Блокировка входа блокирует или резервирует определенные входы в кэше для какой-либо цели. В частности, варианты осуществления в данном документе используют блокировку входа, чтобы зарезервировать один или несколько входов для потока выполнения, который трассируется, так что заблокированные/зарезервированные входы используются исключительно для хранения кэш-промахов, относящихся к исполнению этого потока выполнения. Таким образом, возвращаясь к Фиг. 5, если "вход 0" был заблокирован для трассируемого потока выполнения, то строки 504a и 504c кэша (т.е. индекс 0, вход 0 и индекс 1, вход 0) будут использоваться исключительно для кэш-промахов, относящихся к исполнению этого потока выполнения, а остальные строки кэша будут использоваться для всех других кэш-промахов. Таким образом, чтобы определить, является ли конкретная строка кэша участником регистрации, обрабатывающему устройству 102 нужно только определить, является ли строка кэша составной частью входа, который зарезервирован для потока выполнения, который трассируется.
[0082]
Фиг. 6A-6D показывают конкретный пример 600 применения способа 300, показанного на Фиг. 3, в контексте Фиг. 1, 2, 4A, 4B и 5. Фиг. 6A показывает первую таблицу 600a, которая демонстрирует действия считывания и записи четырьмя блоками 102a обработки (т.е. P0-P3) на одной строке в разделяемом кэше 102b. Фиг. 6B показывает вторую таблицу 600b, которая указывает один вариант осуществления отслеживаемого состояния когерентности кэша (например, как отслеживаемого с использованием CCP обрабатывающего устройства) на основе этих считываний и записей. Фиг. 6C показывает третью таблицу 600c, которая демонстрирует, что могло бы храниться в учетных битах разделяемого кэша 102b (как описано со ссылкой на Фиг. 4A и 4B), если учетные биты вообще используются. Хотя обычно используется только один тип учетных битов (т.е. биты блоков для каждой строки, индексные биты для каждой строки, или флаговый бит для каждой строки), для полноты описания таблица 600c демонстрирует все, биты 603 блоков, индексные биты 604 и флаговый бит 605. Наконец, Фиг. 6D показывает четвертую таблицу 600d, которая демонстрирует иллюстративные типы данных 606 регистрации, которые потенциально могут быть записаны в файл(ы) 104d трассировки в отношении каждой операции.
[0083]
Для простоты описания таблица 600a изображает операции только одного блока 102a обработки за раз, но следует понимать, что принципы, описанные в данном документе, применяются и к ситуациям, когда есть одновременные действия (например, одновременные считывания двумя или более блоками обработки одной и той же строки кэша). Дополнительно, примеры, описанные в отношении Фиг. 6A-6D, предполагают, что отслеживание разрешено для блоков P0-P2 обработки и запрещено для блока P3 обработки. Например, как обсуждалось выше, это может управляться битом, соответствующим каждому блоку обработки, к примеру, множеством битов управляющего регистра.
[0084]
Первоначально, для простоты описания, в этом примере будут использоваться упрощенные состояния строк кэша, которые выводятся из состояний строк кэша (т.е. Модифицированная, Собственная, Эксклюзивная, Разделяемая и Недействительная), используемых в CCP, обсужденных выше (т.е. MSI, MESI и MOESI). При таком упрощении эти состояния отображаются либо в состояние "считывание" (т.е. строка кэша была считана), либо в состояние "запись" (т.е. строка кэша была записана). Таблица 1 ниже демонстрирует один пример этих отображений. Необходимо отметить, что эти отображения используются лишь в качестве примера и не являются ограничивающими. Например, могут существовать CCP и состояния, отличные от обсуждаемых в данном документе, и специалисту в данной области техники будет понятно, с учетом раскрытия изобретения в данном документе, что аналогичные отображения могут быть сделаны для многих разных CCP.
<b>Состояние в протоколе</b>
<b>Отображенное состояние</b>
Модифицированная
Запись
Собственная
Считывание
Эксклюзивная
Запись
Разделяемая
Считывание
Недействительная
Нет отображения, строка кэша считается пустой
Таблица 1
[0085]
Существенно, что варианты осуществления могут регистрировать данные CCP на различных уровнях, в зависимости от того, какие данные доступны со стороны обрабатывающего устройства 102, и/или на основе вариантов выбора реализации. Например, данные CCP могут регистрироваться на основе "отображенных" состояний CCP (таких, как показанные в Таблице 1), на основе фактических состояний CCP (Модифицированная, Собственная, Эксклюзивная, Разделяемая и/или Недействительная), которые видны обрабатывающему устройству 102, и/или даже на основе "необработанных" данных CCP более низкого уровня, которые обычно не могут быть видны обрабатывающему устройству 102.
[0086]
Обращаясь к Фиг. 6A-6D, таблица 600a включает в себя первый столбец 601, демонстрирующий идентификатор (ID), который используется для определения глобального порядка среди операций. Таблица 600a также включает в себя четыре дополнительных столбца 602a-602d, каждый из которых соответствует одному из блоков обработки. Хотя в этом примере для простоты используется глобальный ID, следует понимать, что на практике каждый блок обработки обычно упорядочивает операции, используя свои собственные независимые наборы идентификаторов. Эти ID могут содержать счетчик инструкций (IC - instruction count) или любой другой подходящий механизм для определения порядка среди операций, такой как "счетчик скачков" плюс программный счетчик. Следует обратить внимание, что в примере память используется таким образом, чтобы согласовываться с CPP MSI, MESI и MOESI, но для простоты используются только состояния "модифицированная", "разделяемая" и "недействительная". Однако нужно отметить, что некоторые CCP могут предоставлять свои собственные уникальные и/или монотонно прирастающие ID, которые тоже могут записываться в трассировке (например, в каждом пакете, или в случайных пакетах), чтобы строго упорядочить элементы трассировки. Даже если CCP не предоставляет такой ID, потенциально можно использовать значение таймера гнезда (например, TSC) или другой упорядочиваемый ID.
[0087]
Как продемонстрировано в таблице 600a, по идентификатору ID[0] блок P0 обработки выполняет считывание, которое вызывает кэш-промах, в результате чего данные DATA[1] заносятся в строку кэша. Соответственно, таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша теперь "разделяется" блоком P0. Таблица 600c демонстрирует, что если используются биты 603 блоков, они указывают, что блок P0 обработки потреблял (т.е. считывал) строку кэша (и что блоки P1-P3 обработки не потребляли), что если используются индексные биты 604, они указывают, что P0 потреблял строку кэша, и что если используется флаговый бит 605, он указывает, что какой-то блок обработки потреблял строку кэша. Учитывая этот статус, на этапе 303 обрабатывающее устройство 102 определит, что регистрация разрешена для P0, а на этапе 304 оно определит, что строка кэша участвует в регистрации (т.е. используя биты 603 блоков, индексные биты 604, флаговый бит 605 или блокировку входа). Соответственно, на этапе 306 обрабатывающее устройство 102 задействует CCP для регистрации надлежащих данных в файл(ы) трассировки, при необходимости. В данном случае, поскольку строка кэша переходит из состояния недействительная (пустая) в состояние считывания (таблица 600a)/разделяемая (таблица 600b), данные должны быть зарегистрированы. Как продемонстрировано в данных 606 регистрации в таблице 600d, обрабатывающее устройство 102 может отметить блок (P0) обработки при необходимости (т.е. в зависимости от того, регистрируются ли пакеты данных для отдельных потоков данных по каждому блоку обработки, или для одного потока данных); адрес (@) строки кэша; счетчик инструкций или какой-то другой счетчик; и данные (DATA[1]), которые были занесены в строку кэша. Хотя, как обсуждалось выше, счетчик инструкций обычно будет специфичным для блока обработки значением, для простоты таблица 600d отсылает к счетчику инструкций, имея в виду соответствующий глобальный ID (т.е. IC[0], в данном случае).
[0088]
Следует отметить, что адрес (@) строки кэша и данные (например, DATA[1]) в некоторых вариантах осуществления могут сжиматься в файле(ах) 104d трассировки. Например, адреса памяти могут быть сжаты путем отказа от записи "старших" битов адреса памяти, за счет привязки (явно либо неявно) к "старшим" битам в ранее записанном адресе памяти. Данные могут быть сжаты путем группировки битов значения данных во множество групп, каждая из которых содержит множество битов, и ассоциировании каждой группы с соответствующим "флаговым" битом. Если группа равняется конкретному шаблону (например, все 0, все 1, и т.д.), может быть установлен флаговый бит, и эта группа битов не должна сохраняться в трассировке.
[0089]
Далее, таблица 600a демонстрирует, что по ID[1] блок P1 обработки выполняет считывание в строке кэша, считывая данные DATA[1]. Таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша теперь "разделяется" блоками P0 и P1. Таблица 600c демонстрирует, что эти блоки P0 и P1 обработки потребляли строку кэша (биты 603 блоков), что P1 потреблял строку кэша (индексные биты 604), или что какой-то блок обработки потреблял строку кэша (флаговый бит 605). Отметим, что для индексных битов 604 также корректно было бы по-прежнему ссылаться на P0 вместо P1. Таблица 600d демонстрирует, что, используя CCP, обрабатывающее устройство 102 определяет, что запись операции должна быть зарегистрирована. Как продемонстрировано, обрабатывающее устройство 102 может отметить блок (P1) обработки; адрес (@) строки кэша; счетчик инструкций (IC[1]); что строка кэша перешла из состояния считывания (разделяемая) в состояние считывания (разделяемая); и что P0 имел предшествующий доступ к предшествующей строке кэша, но теперь P0 и P1 имеют доступ.
[0090]
Далее, таблица 600a демонстрирует, что по ID[2] блок P0 обработки выполняет запись в строку кэша, записывая данные DATA[2]. Таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша теперь "модифицирована" блоком P0 и "недействительна" для P1. Таблица 600c демонстрирует, что только блок P0 обработки потреблял (т.е. обновил ее значение) строку кэша (биты 603 блоков), что P0 потреблял строку кэша (индексные биты 604), или что какой-то блок обработки потреблял строку кэша (флаговый бит 605). Таблица 600d демонстрирует, что, используя CCP, обрабатывающее устройство 102 определяет, что запись операции должна быть зарегистрирована, так как строка кэша была записана/модифицирована. Как продемонстрировано, обрабатывающее устройство 102 может отметить блок (P0) обработки; адрес (@) строки кэша; счетчик инструкций (IC[2]); что строка кэша перешла из состояния считывания (разделяемая) в состояние записи (модифицированная); и что P0 и P1 имели предшествующий доступ к предшествующей строке кэша, но теперь только P0 имеет доступ.
[0091]
Следует отметить, что информация о том, какой блок(и) обработки имел предшествующий доступ к строке кэша, могла быть найдена с использованием состояния в CCP, продемонстрированного в таблице 600b. Однако нужно отметить, что некоторые CCP могут не поддерживать достаточную информацию, чтобы сделать это (например, CCP, который отслеживает состояние когерентности только на уровне строки кэша). В качестве альтернативы, если используются биты 603 блоков, эта информация может быть получена из битов блоков. Соответственно, данные 606 регистрации, продемонстрированные на Фиг. 6D, предполагают либо надежный CCP, который поддерживает эту информацию, либо использование битов 603 блоков.
[0092]
Если ничто из этого не используются (например, если CCP не является таким надежным, и если индексные биты 604, флаговый бит 605 или блокировка входа используются вместо битов 603 блоков), данные 606 регистрации могут быть менее полными или большего объема. В качестве первого примера, если CCP отслеживает состояние когерентности только на уровне строки кэша, и если используются индексные биты 604, они могут использоваться для идентификации того, что состояние строки кэша является недействительным (для всех блоков обработки), что оно является модифицированным (вместе с индексом блока обработки, который ее модифицировал), что оно является эксклюзивным (вместе с индексом блока обработки, который имеет эксклюзивные права), или что оно является разделяемым (и все блоки обработки могут иметь доступ). Это может привести к более простой аппаратной реализации с тем недостатком, что, когда нужно изменить строку кэша с разделяемой на модифицированную или эксклюзивную, должны быть уведомлены все блоки обработки, а не только те, которые были бы известны CCP с большей степенью детализации как разделяющие строку кэша. В качестве второго примера, индексные биты 604 могут использоваться для идентификации последнего блока обработки, который получал доступ к строке кэша. Тогда, если кэш является инклюзивным (т.е. многие считывания скрыты за доступами на уровнях кэша L2 или L1), то даже если блоки обработки считывают одну и ту же строку кэша, кэш L3 может видеть относительно немного повторных запросов от одних и тех же блоков обработки. При регистрации каждого изменения индекса для считывание->считывание и последующей регистрации считывание->запись, запись->запись и запись->считывание индекс с тем же успехом дает такие же данные, как использование битов 603 блоков, за счет трассировки, вероятно, немного большего размера. В качестве третьего примера, каждая строка кэша может включать в себя один флаговый бит, но CCP может отслеживать состояние когерентности для каждой строки кэша в отношении индекса для блока обработки, который владеет состоянием когерентности строки кэша. В этом случае трассировка может записывать больше смещений состояний строки кэша, чем если бы использовались биты блоков, или CCP отслеживал отдельные блоки обработки, но трассировка все еще может быть полностью детерминированной. Краткое сравнение размера файла трассировки при наличии информации о каждом блоке обработки, в сопоставлении с информацией только об индексе обрабатывающего устройства, приводится в дальнейшем в этом документе со ссылками на Фиг. 9A и 9B.
[0093]
Возвращаясь к Фиг. 6A, таблица 600a демонстрирует, что по ID[3] блок P1 обработки выполняет считывание из строки кэша, считывая данные DATA[2]. Таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша теперь "разделяется" блоками P0 и P1. Таблица 600c демонстрирует, что блоки P0 и P1 обработки потребляли строку кэша (биты 603 блоков), что P1 потреблял строку кэша (индексные биты 604) или что какой-то блок обработки потреблял строку кэша (флаговый бит 605). Отметим, что для индексных битов 604 также корректно было бы по-прежнему ссылаться на P0 вместо P1. Таблица 600d демонстрирует, что, используя CCP, обрабатывающее устройство 102 определяет, что запись операции должна быть зарегистрирована, так как строка кэша перешла из состояния записи (модифицированная) в состояние считывания (разделяемая). Как продемонстрировано, обрабатывающее устройство 102 может отметить блок (P1) обработки; адрес (@) строки кэша; счетчик инструкций (IC[3]); что строка кэша перешла из состояния записи (модифицированная) в состояние считывания (разделяемая); и что P0 имел предшествующий доступ к предшествующей строке кэша, но теперь P0 и P1 имеют доступ.
[0094]
Далее, таблица 600a демонстрирует, что по ID[4] блок P0 обработки снова выполняет запись в строку кэша, на этот раз записывая данные DATA[3]. Таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша снова "модифицирована" блоком P0 и "недействительна" для P1. Таблица 600c демонстрирует, что только блок P0 обработки потреблял строку кэша (биты 603 блоков), что P0 потреблял строку кэша (индексные биты 604), или что какой-то блок обработки потреблял строку кэша (флаговый бит 605). Таблица 600d демонстрирует, что, используя CCP, обрабатывающее устройство 102 определяет, что запись операции должна быть зарегистрирована, так как строка кэша была записана/модифицирована. Как продемонстрировано, обрабатывающее устройство 102 может отметить блок (P0) обработки; адрес (@) строки кэша; счетчик инструкций (IC[4]); что строка кэша перешла из состояния считывания (разделяемая) в состояние записи (модифицированная); и что P0 и P1 имели предшествующий доступ к предшествующей строке кэша, но теперь только P0 имеет доступ.
[0095]
Далее, таблица 600a демонстрирует, что по ID[5] блок P2 обработки выполняет считывание из строки кэша, считывая данные DATA[3]. Таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша теперь "разделяется" блоками P0 и P2. Таблица 600c демонстрирует, что блоки P0 и P2 обработки потребляли строку кэша (биты 603 блоков), что P2 потреблял строку кэша (индексные биты 604) или что какой-то блок обработки потреблял строку кэша (флаговый бит 605). Отметим, что для индексных битов 604 также корректно было бы по-прежнему ссылаться на P0 вместо P2. Таблица 600d демонстрирует, что, используя CCP, обрабатывающее устройство 102 определяет, что запись операции должна быть зарегистрирована, так как строка кэша перешла из состояния записи (модифицированная) в состояние считывания (разделяемая). Как продемонстрировано, обрабатывающее устройство 102 может отметить блок (P2) обработки; адрес (@) строки кэша; счетчик инструкций (IC[5]); что строка кэша перешла из состояния записи (модифицированная) в состояние считывания (разделяемая); и что P0 имел предшествующий доступ к предшествующей строке кэша, но теперь P0 и P2 имеют доступ.
[0096]
Далее, таблица 600a демонстрирует, что по ID[6] блок P1 обработки выполняет считывание из строки кэша, также считывая данные DATA[3]. Таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша теперь "разделяется" блоками P0, P1 и P2. Таблица 600c демонстрирует, что блоки P0, P1 и P2 обработки потребляли строку кэша (биты 603 блоков), что P1 потреблял строку кэша (индексные биты 604) или что какой-то блок обработки потреблял строку кэша (флаговый бит 605). Отметим, что для индексных битов 604 также корректно было бы по-прежнему ссылаться на P0 или P2 вместо P1. Таблица 600d демонстрирует, что, используя CCP, обрабатывающее устройство 102 определяет, что запись операции должна быть зарегистрирована. Как продемонстрировано, обрабатывающее устройство 102 может отметить блок (P1) обработки; адрес (@) строки кэша; счетчик инструкций (IC[6]); что строка кэша перешла из состояния считывания (разделяемая) в состояние считывания (разделяемая); и что P0 и P2 имели предшествующий доступ к предшествующей строке кэша, но теперь P0, P1 и P2 имеют доступ.
[0097]
Далее, таблица 600a демонстрирует, что по ID[7] блок P3 обработки выполняет считывание из строки кэша, также считывая данные DATA[3]. Таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша теперь "разделяется" блоками P0, P1, P2 и P3. Таблица 600c демонстрирует, что ни один из битов 603 блоков, индексных битов 604 или флагового бита 605 не был обновлен. Это связано с тем, что регистрация запрещена для P3, и, для целей трассировки, он, таким образом, не "потреблял" строку кэша при выполнении считывания. Таблица 600d демонстрирует, что никакие данные не были зарегистрированы. Это связано с тем, что на этапе 303 обрабатывающее устройство 102 определит, что регистрация не разрешена для P3.
[0098]
Далее, таблица 600a демонстрирует, что по ID[8] блок P3 обработки выполняет запись в строку кэша, записывая данные DATA[4]. Таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша теперь "недействительна" для P0, P1 и P2, и "модифицирована" блоком P3. Таблица 600c демонстрирует, что биты 603 блоков, индексные биты 604 и флаговый бит 605, все отражают строку кэша как не потребленную никаким блоком обработки. Это связано с тем, что регистрация запрещена для P3, поэтому, для целей трассировки, он не "потребляет" строку кэша при выполнении записи; кроме того, запись делает недействительным значение в строке кэша для других блоков обработки. Таблица 600d демонстрирует, что никакие данные не были зарегистрированы. Опять же, это связано с тем, что на этапе 303 обрабатывающее устройство 102 определит, что регистрация не разрешена для P3.
[0099]
Далее, таблица 600a демонстрирует, что по ID[9] блок P0 обработки выполняет запись в строку кэша, записывая данные DATA[5]. Таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша теперь "модифицирована" блоком P0 и "недействительна" для P3. Таблица 600c демонстрирует, что никакой блок обработки не потреблял строку кэша. Это связано с тем, что никакой элемент регистрации не был внесен в связи с этой операцией, как отражено в таблице 600d. Никакой элемент регистрации не должен вноситься, потому что записанные данные будут повторяться посредством нормального исполнения инструкций потока выполнения блока P0. Однако в некоторых случаях элемент может быть записан в трассировку при этих обстоятельствах (т.е. запись в строку кэша, которая не зарегистрирована блоком обработки при разрешенной регистрации), чтобы предоставить дополнительные данные потребителю трассировки. При этих обстоятельствах элемент регистрации можно рассматривать как считывание значения строки кэша плюс запись DATA[5].
[00100]
Далее, таблица 600a демонстрирует, что по ID[10] блок P2 обработки выполняет считывание из строки кэша, считывая данные DATA[5]. Таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша теперь "разделяется" блоками P0 и P2. Таблица 600c демонстрирует, что блок P2 обработки потреблял строку кэша (биты 603 блоков), что P2 потреблял строку кэша (индексные биты 604) или что какой-то блок обработки потреблял строку кэша (флаговый бит 605). Таблица 600d демонстрирует, что, используя CCP, обрабатывающее устройство 102 определяет, что запись операции должна быть зарегистрирована, так как значение строки кэша ранее не регистрировалась (т.е. оно не регистрировалась по ID[9]). Как продемонстрировано, обрабатывающее устройство 102 может отметить блок (P2) обработки; адрес (@) строки кэша; счетчик инструкций (IC[10]); данные (DATA[5]), которые были занесены в строку кэша; и что P2 имеет доступ к строке кэша. Также может быть зарегистрировано, что P0 тоже имеет доступ к строке кэша, в зависимости от того, какую информацию предоставляют конкретный CCP и учетные биты.
[00101]
Далее, таблица 600a демонстрирует, что по ID[11] блок P1 обработки выполняет считывание из строки кэша, также считывая данные DATA[5]. Таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша теперь "разделяется" блоками P0, P1 и P2. Таблица 600c демонстрирует, что блоки P1 и P2 обработки потребляли строку кэша (биты 603 блоков), что P1 потреблял строку кэша (индексные биты 604) или что какой-то блок обработки потреблял строку кэша (флаговый бит 605). Отметим, что для индексных битов 604 также корректно было бы по-прежнему ссылаться на P2 вместо P1. Таблица 600d демонстрирует, что, используя CCP, обрабатывающее устройство 102 определяет, что запись операции должна быть зарегистрирована. Как продемонстрировано, обрабатывающее устройство 102 может отметить блок (P1) обработки; адрес (@) строки кэша; счетчик инструкций (IC[11]); что строка кэша перешла из состояния считывания (разделяемая) в состояние считывания (разделяемая); и что P2 имел предшествующий доступ к предшествующей строке кэша, но теперь P1 и P2 имеют доступ. Следует обратить внимание, что значение (DATA[5]) не нужно регистрировать, так как оно было зарегистрировано блоком P2 по ID[10].
[00102]
Далее, таблица 600a демонстрирует, что по ID[11] блок P0 обработки выполняет считывание из строки кэша, также считывая данные DATA[5]. Таблица 600b демонстрирует, что CCP обрабатывающего устройства отмечает, что строка кэша теперь "разделяется" блоками P0, P1 и P2. Таблица 600c демонстрирует, что блоки P0, P1 и P2 обработки потребляли строку кэша (биты 603 блоков), что P0 потреблял строку кэша (индексные биты 604) или что какой-то блок обработки потреблял строку кэша (флаговый бит 605). Отметим, что для индексных битов 604 также корректно было бы по-прежнему ссылаться на P1 или P2 вместо P0. Таблица 600d демонстрирует, что, используя CCP, обрабатывающее устройство 102 определяет, что запись операции должна быть зарегистрирована. В данном случае обрабатывающее устройство 102 может отметить блок (P0) обработки; адрес (@) строки кэша; счетчик инструкций (IC[12]); что строка кэша перешла из состояния считывания (разделяемая) в состояние считывания (разделяемая); и что P1 и P2 имели предшествующий доступ к предшествующей строке кэша, но теперь P0, P1 и P2 имеют доступ. Значение (DATA[5]) не регистрируется, так как оно доступно со стороны P2.
[00103]
В качестве альтернативы, возможно, что обрабатывающее устройство 102 ссылается на P0 только по ID[12], так как P0 уже имеет значение строки кэша (т.е. потому что он записал это значение по ID[9]). Можно даже отказаться от любой регистрации по ID[12], так как можно использовать эвристические правила при воспроизведении для восстановления значения (т.е. DATA[5]) без представления информации о том, что P0 участвует в трассировке. Однако эти методы могут быть затратными в вычислительном отношении и снижать способность системы обнаруживать, когда воспроизведение "сорвано". Примером эвристического правила является признание того, что доступ к памяти разных блоков обработки, как правило, строго упорядочен (на основе данных CCP), поэтому при воспроизведении может использоваться последнее значение в этих блоках для данной ячейки памяти.
[00104]
Далее, таблица 600a демонстрирует, что по ID[13] строка кэша вытесняется. В результате таблица 600b демонстрирует, что элементы CCP пусты, таблица 600c демонстрирует, что учетные биты не отражают блоки обработки как потреблявшие строку кэша, а таблица 600d демонстрирует, что никакие данные не регистрируются.
[00105]
Следует отметить, что хотя, для полноты, данные 606 регистрации перечисляют все конечные состояния доступа (т.е. какие блоки обработки в данный момент имеют доступ к строке кэша), эта информация потенциально неявно задана, и размер файла трассировки может быть уменьшен путем ее отбрасывания. Например, при переходе запись->считывание, список блоков обработки, имеющих доступ после считывания, всегда состоит из блока обработки, который имел предшествующий доступ, плюс блок обработки, который выполнил считывание. При переходе считывание->запись, или переходе запись->запись, список блоков обработки, имеющих доступ на запись после записи, всегда состоит из блока обработки, который выполнил запись. При переходе считывание->считывание, список блоков обработки, имеющих доступ после считывания, всегда состоит из блоков обработки, имевших доступ перед переходом, плюс блок обработки, который выполнил считывание.
[00106]
В общем, чтобы сгенерировать полностью детерминированный файл трассировки, CCP будет предписывать, что все переходы (т.е. запись->считывание, запись->запись, считывание->запись и считывание->считывание) среди блоков обработки (например, от P0 к P1) регистрируются. Однако, переходы в пределах одного и того же блока обработки (например, от P0 к P0) не должны регистрироваться. Они не должны регистрироваться, потому что они будут повторяться посредством нормального исполнения потока выполнения, который исполнялся в этом блоке обработки.
[00107]
Следует понимать, что при использовании данных, таких как те, которые зарегистрированы в приведенном выше примере, и с дополнительными сведениями из CCP, используемого обрабатывающим устройством 102, на котором производилась запись, может быть реконструирована полная упорядоченность операций, которые происходили в каждом потоке выполнения, а также может быть реконструирована, по меньшей мере, частичная упорядоченность операций среди разных блоков обработки. Таким образом, в процессе индексации и/или посредством воспроизведения файла трассировки, в равной степени, каждая из вышеперечисленных операций может быть реконструирована, даже если они не все были явно записаны в файл(ы) 104d трассировки.
[00108]
В некоторых вариантах осуществления трассировщик 104a может записывать дополнительные пакеты данных в файл(ы) 104d трассировки для того, чтобы улучшить регистрацию упорядоченности операций среди блоков обработки. Например, трассировщик 104a может записывать некоторую информацию об упорядоченности событий, такую как монотонно прирастающие числа (MIN - monotonically incrementing number) (или какой-то другой счетчик/таймер), чтобы обеспечить полную упорядоченность событий, которые имеют MIN (или другой счетчик/таймер) среди потоков выполнения. Эти MIN могут использоваться для идентификации пакетов данных, соответствующих событиям, которые определены как "упорядочиваемые" среди потоков выполнения. Эти события могут определяться на основе "модели памяти трассировки", которая определяет, как потоки выполнения могут взаимодействовать через разделяемую память, и разделение ими данных в памяти. В качестве другого примера, трассировщик 104a может (периодически или случайным образом) записывать хэш-значение состояния обрабатывающего устройства на основе заданного детерминистского алгоритма и заданного набора регистров (например, программный счетчик, стек, регистры общего назначения, и т.д.). В качестве еще одного примера, трассировщик 104a может (периодически или случайным образом) принудительно регистрировать данные строки кэша. В качестве еще одного примера, трассировщик 104a может вносить в трассировку пакеты "переходов", которые регистрируют хэш-значение всех или части (например, несколько битов) данных, которые они неявно переносят. Таким образом, когда эти неявные данные реконструируются при воспроизведении, подходящие части этих неявных данных могут быть хэшированы и сопоставлены с этими пакетами перехода, чтобы помочь идентифицировать их упорядоченность. Это может быть полезно, например, если CCP не может отслеживать индексы обрабатывающего устройства, соотнесенные со строками кэша, если строки кэша находятся в разделяемом состоянии.
[00109]
Когда трассировщик 104a записывает дополнительные пакеты данных в файл(ы) 104d трассировки, чтобы улучшить упорядоченность, есть возможность пропустить запись некоторых переходов среди блоков обработки. Например, есть возможность пропустить запись некоторых переходов считывание->считывание среди потоков выполнения. Это может привести в некоторых ситуациях к "ослабленной" недетерминированной трассировке, поскольку упорядоченность некоторых считываний может быть невозможно полностью реконструировать на основе трассировки и CCP, но дополнительная информация об упорядоченности (например, MIN, хэш-значения состояния обрабатывающего устройства, дополнительные данные строки кэша) может помочь уменьшить область поиска во время воспроизведения, чтобы найти действительную упорядоченность считываний, которые не "срывают" воспроизведение трассировки. Преимущества пропуска некоторых переходов считывание->считывание среди потоков выполнения включают в себя размер трассировки и потенциально упрощенные модификации обрабатывающего устройства 101 для облегчения осуществления трассировки.
[00110]
Фиг. 7A показывает пример, в котором некоторые переходы считывание->считывание могут быть исключены из трассировки в зависимости от того, как отслеживаются обрабатывающие устройства. Подобно Фиг. 6A, Фиг. 7A включает в себя таблицу 700a с глобальным ID 701 и три столбца (702a-702c), соответствующих трем блокам обработки (P0-P2). Пропуск некоторых переходов считывание->считывание основывается на двух наблюдениях. Во-первых, записи должны быть упорядочены; однако все считывания между двумя последовательными записями (например, считывания по ID[3]-ID[7]) будут считывать одно и то же значение, так что порядок среди этих считываний не имеет значения (а значит трассировка с пропущенными переходами считывание->считывание может быть детерминированной). Во-вторых, наличие "пересечения" считывания и записи при воспроизведении (т.е. считывание и запись в одной и той же строке кэша, воспроизводимые в неправильном порядке) означает, что правильные данные не используются для воспроизведения; однако, наличие данных (например, MIN и т.д.), позволяющих избежать этой ошибки, поможет идентифицировать действительную упорядоченность.
[00111]
В примере, продемонстрированном в таблице 700a, блок P2 обработки выполняет только считывание разделяемых данных, и эти разделяемые считывания только "захватываются" из других считываний (например, полагая, что ID[9] оставил строку кэша разделяемой). Если никакие элементы регистрации не вносятся ни для одного из переходов считывание->считывание (т.е. ID[4]-ID[7] и ID[10]), в трассировке не будет информации для правильного размещения считываний P2. На основе записей можно сделать вывод, что P2 никогда не считывает значение DATA[1] (т.е. так как запись по ID[2] не захватывается из P2), и в отсутствие элементов регистрации для переходов считывание->считывание P2 (т.е. ID[4], ID[7] и ID[10]), все, о чем можно сделать вывод для P2, заключается в том, что было, по меньшей мере, одно считывание со стороны P2 между ID[2] и ID[8]. Однако, если были элементы регистрации для ID[4] и ID[10], может быть определено расположение остальных считываний, регистрация которых может не потребоваться (т.е. ID[5]-ID[7], как показано на Фиг. 7B). Каждое из этих считываний относится к тому же разделу между записями, что и последнее зарегистрированное считывание (т.е. по ID[4]). Следовательно, расположение этих считываний может быть определено на основе того, что записи захватываются (а если нет операции захвата считывания, то нет записи после нее до следующего зарегистрированного пакета).
[00112]
Принимая во внимание таблицу 700a, Фиг. 7B показывает пример регистрации данных с пропуском переходов считывание->считывание, выделенных на Фиг. 7A, которые могли быть зарегистрированы, если используются "биты блоков". Фиг. 7C показывает таблицу 700c, которая демонстрирует регистрацию данных, которые могут быть записаны, если используются "индексные биты", и индексы обновляются при считываниях.
[00113]
Как вкратце упоминалось выше, некоторые кэши включают в себя как инклюзивные, так и эксклюзивные уровни (т.е. не полностью инклюзивный кэш). Методы регистрации, описанные в данном документе, применимы к этим кэшам, как и к целиком инклюзивным или эксклюзивным кэшам. В качестве примера, Фиг. 8A показывает вычислительную среду 800a, которая включает в себя два обрабатывающих устройства 801a/801b (например, два обрабатывающих устройства в соответствующих гнездах). Каждое обрабатывающее устройство 801 включает в себя четыре блока 802a/802b обработки (например, физические или логические блоки обработки). Каждое обрабатывающее устройство 801 также включает в себя трехуровневый кэш, включающий в себя уровень 803a/803b L1, уровень 804a/804b L2 и уровень 805a/805b L3. Как показано, каждый кэш включает в себя четыре кэша 803 L1, каждый из которых соответствует одному из блоков 802 обработки. Помимо этого, каждый кэш включает в себя два кэша 804 L2, каждый из которых соответствует двум из блоков 802 обработки. Помимо этого, каждый кэш включает в себя один кэш 805 L3 для всех блоков 802 обработки в обрабатывающем устройстве 801. Блоки обработки и некоторые из кэшей идентифицируются индивидуально, например, блоки 802a обработки обрабатывающего устройства 801a идентифицируются как A0-A3, кэши L2 идентифицируются как A4 и A5, а кэш L3 идентифицируется как A6. Подобные идентификаторы используются для соответствующих компонентов в обрабатывающем устройстве 801b. Звездочки (*), соотнесенные с блоками A0, A1, A2, B0 и B1 обработки, указывают, что регистрация разрешена для этих блоков обработки.
[00114]
В вычислительной среде 800a кэши могут проявлять сочетание инклюзивного и эксклюзивного поведения. Например, для кэша L3 A6 обрабатывающего устройства 801a может быть неэффективно хранить строку кэша, если ее использует только блок A0 обработки. Вместо этого, в таком случае строка кэша может быть сохранена в кэше L1 A0 и кэше L2 A4, но не в кэше L1 A1 или кэше L2 A5 или более низких кэшах. Чтобы освободить место, некоторые кэши могут позволить кэшу L3 A6 вытеснить эту строку кэша в такой ситуации. Когда это происходит, A1 может получить строку кэша из кэша L2 A4, как это было бы нормально в инклюзивном кэше. Однако, поскольку строка кэша не существует в кэше L3 A6 или кэше L2 A5, некоторые реализации кэша могут также позволить боковое смещение строки кэша, к примеру, из кэша L1 A0 в кэши L1 A2 или A3. Это может создать некоторые проблемы для трассировки с использованием CCP. Приведенные ниже примеры показывают, как может совершаться трассировка с использованием CCP в таких ситуациях.
[00115]
Фиг. 8B показывает таблицу 800b, которая демонстрирует иллюстративные операции считывания и записи, выполняемые некоторыми блоками 802 обработки. Формат таблицы 800b аналогичен формату таблицы 600a. С учетом вычислительной среды 800a и таблицы 800b, теперь приводятся три разных примера регистрации, каждый из которых использует разные варианты поведения кэша. Эти примеры описываются в контексте следующих принципов регистрации с использованием CCP:
(1) Как правило, данные регистрируют, когда адрес (строка кэша) переходит от "незарегистрированной" к "зарегистрированной" (т.е. на основе определения того, что строка кэша участвует в регистрации, на этапе 304);
(2) Как правило, отказываются от регистрации, когда строка кэша переходит от "зарегистрированной" к "незарегистрированной" или "вытесненной" (хотя регистрация по-прежнему будет действительной, если эти данные будут зарегистрированы). Тем не менее, это действительно для регистрации вытеснений данных. Это увеличивает размер трассировки, но предоставляет дополнительную информацию, которая может помочь идентифицировать упорядоченность среди потоков данных трассировки, может помочь идентифицировать, когда воспроизведение трассировки "сорвано", и может обеспечить дополнительный анализ трассировки. Что касается анализа трассировки, регистрация вытеснений данных может предоставить больше информации о том, как использовался кэш, может использоваться для идентификации характеристик производительности исполняемого кода и может помочь точно определить временное окно, в течение которого данная строка кэша хранила конкретное значение. Варианты осуществления для регистрации вытеснений данных обсуждаются позже применительно к Фиг. 10A и 10B;
(3) Смещение регистрируют, когда строка кэша смещается между ядрами или статусом когерентности кэша таким образом, что предоставляется новая информация;
(4) Когда блок обработки делает запись, делают недействительной строку кэша для всех других блоков обработки. Если строка кэша не была уже зарегистрирована для блока обработки, система может либо не регистрировать строку кэша, либо рассматривать запись как: (i) считывание (т.е. которое регистрирует строку кэша и включает отслеживание регистрации), вместе с (ii) записью, предполагая, что память в строке кэша доступна для чтения блоку обработки. Может быть допустимо, но менее эффективно, чтобы обрабатывающее устройство отключило регистрацию и не регистрировало запись, но это приведет к потере информации, которая должна быть реконструирована при воспроизведении, и в среднем это может быть неэффективным по размеру трассировки, так как дешевле зарегистрировать ссылку, чем регистрировать полную строку кэша данных позже;
(5) Обоснованной является чрезмерная регистрация (например, как в принципе 2 выше), чтобы помочь с реконструкцией трассировки позже. Хотя это наращивает размер трассировки, это не влияет на корректность. Например, некоторые переходы считывание->считывание могут быть пропущены (как описано выше применительно к Фиг. 7A-7C), но любой межъядерный переход, который начинается или заканчивается записью, должен быть явно или неявно зарегистрирован. В другом примере варианты осуществления могут добавлять дополнительные пакеты данных (например, которые предоставляют дополнительную информацию об упорядоченности и/или хэш-значения) к трассировке в любое время. В еще одном примере варианты осуществления могут производить регистрацию, когда сначала совершается запись в строку кэша после ее CCP-перехода в состояние записи (т.е. происходящее позже гипотетическое исполнение может привести к переходу строки кэша в состояние записи, но фактически не совершить какую-либо запись в нее). Регистрация этих записей может позже облегчить разнесение потоков трассировки по ядрам. В еще одном примере варианты осуществления могут регистрировать косвенные скачки или другую информацию, которая помогает быстро уменьшить область поиска, отделяя потоки данных трассировки; и
(6) Неполная регистрация (т.е. регистрация без всех зарегистрированных переходов) все еще может использоваться для воспроизведения трассировки. Это может привести к дополнительным вычислительным затратам во время воспроизведения для расчета недостающих фрагментов.
[00116]
В первом примере, показанном на Фиг. 8C, CCP отслеживает статус строки кэша для каждого блока обработки (т.е. каждое ядро имеет свой собственный статус считывания и записи). В этом примере кэш ведет себя во многом как инклюзивный кэш, за исключением того, что могут быть данные, которые осуществляют смещение с проходом через кэши или через гнезда, которые недоступны во время регистрации. Для краткости, в этих примерах блоки 802 обработки упоминаются как "ядра", а обрабатывающие устройства 801a и 801b упоминаются как обрабатывающие устройства A и B или гнезда A и B. Дополнительно, упрощенная система обозначений регистрации в виде "ID:Core:From:Transition(т.е. от->к)" используется для представления типов данных, которые могут быть зарегистрированы. Эта система обозначений объясняется более подробно в свою очередь. Для первого примера регистрация может включать в себя:
[00117]
По ID[0], "0:A0:R[DATA]->[1]", т.е., по ID[0], регистрируют, что ядро A0 считывает DATA[1], в соответствии с вышеупомянутым принципом 1.
[00118]
По ID[1], "1:B0:R[DATA]->[1]", т.е., по ID[1], регистрируют, что ядро B0 считывает DATA[1], также в соответствии с вышеупомянутым принципом 1. Если кэш в обрабатывающем устройстве B не знает, что A0 уже зарегистрировало данные, то обрабатывающее устройство B регистрирует их само. В качестве альтернативы, если кэш в обрабатывающем устройстве B знает, что A0 зарегистрировало DATA[1], то элемент регистрации может включать в себя "1:B0:R[A0]->R".
[00119]
По ID[2], "2:A1:R[A0]->R", т.е., по ID[2], регистрируют, что ядро A1 совершило переход считывание->считывание, и что A0 имело доступ. Поскольку состоянием строки кэша является разделяемая обрабатывающим устройством B, элемент может иметь вид "2:A1:R:[A0,B0]->R", т.е., по ID[2], регистрируют, что ядро A1 совершило переход считывание->считывание, и что A0 и B0 имели доступ. Поскольку пересечение гнезд обычно требует больше затрат, чем регистрация в пределах гнезда, первый элемент регистрации может быть предпочтительным для переходов считывание->считывание. Однако при регистрации записей в/из, которые проходят через гнезда, регистрация также проходит через гнезда.
[00120]
По ID[3] некоторые варианты осуществления ничего не регистрируют. В качестве альтернативы, поскольку ядро A2 еще ничего не регистрировало, и первое, что оно делает, это запись, это может быть зарегистрировано как считывание->считывание. В любом случае, поскольку запись произошла, свое состояние строки кэша других ядер является недействительная. Затраты (например, исходя из данных трассировки) на регистрацию считывание->запись по ID[3], как правило, будут меньше, чем регистрация фактических данных по ID[4], а значит может быть выгодно регистрировать на этой стадии. В этом случае элемент регистрации может включать в себя "3:A2:R[A0,B1,B0]->W", т.е. ядро A2 совершило переход считывание->запись, а ядра A0, B1, и B0 имели доступ.
[00121]
То, что происходит по ID[4], зависит от того, что было зарегистрировано по ID[3]. Если ничего не было зарегистрировано по ID[3], то данные регистрируются (т.е. "4:A2:R[DATA]->[2]"). С другой стороны, если пакет был зарегистрирован по ID[3], то регистрировать нечего.
[00122]
По ID[5] имеется считывание, которое проходит через ядра. Однако, если ядро A2 все еще имеет строку кэша в виде модифицированной (или эквивалентной), тогда строка кэша обслуживает запрос (он не может быть обслужен из памяти). В этом случае гнездо B будет знать, что он поступил из гнезда A, и повторной регистрации данных можно избежать; это может быть зарегистрировано как "5:B0:W[A2]->R". Если кэш получил данные из основной памяти (это может иметь место, если гнездо A смогло обновить основную память и поделиться своим состоянием когерентности кэша для строки), тогда элемент может представлять собой "5:B0:R[DATA]->2".
[00123]
По ID[6] операция является нормальным считыванием. Аналогично считыванию по ID[2], гнездо B может знать о данных гнезда A или нет. Если да, элемент регистрации может включать в себя "6:B1:R[B0,A2]->R"; в противном случае он может включать в себя "6:B1:R[B0]->R".
[00124]
По ID[7], если строка кэша для B0 не была вытеснена, регистрировать нечего. Если она была вытеснена, обрабатывающее устройство B регистрирует данные как поступающие от другого ядра, или регистрирует данные строки кэша. Это вытеснение одного ядра, но не других в гнезде, как правило, не происходит в полностью инклюзивных кэшах. В полностью инклюзивном кэше, если какое-либо ядро в гнезде имеет строку кэша в своем кэше L1, то и L3 имеет строку кэша, так что строка кэша не может быть вытеснена для одного ядра, но не для другого.
[00125]
По ID[8], поскольку ядро A0 ничего не регистрировало с того времени, и первой операцией для регистрации является запись, это аналогично операции по ID[3]. Обрабатывающее устройство A может зарегистрировать это как считывание->запись; в качестве альтернативы, но возможно менее предпочтительно, обрабатывающее устройство A может ничего не регистрировать. Если пакет зарегистрирован, его содержание будет варьироваться в зависимости от того, может ли гнездо A видеть гнездо B. Если нет, пакет может включать в себя "8:A0:R[A2]->W", а если это возможно, пакет может включать в себя "8:A0:R[B0,B1,A2]->W".
[00126]
По ID[9] регистрировать нечего, если пакет был зарегистрирован по ID[8] (так как это запись в уже зарегистрированный кэш), хотя состояние строки кэша для других ядер обычно становится недействительным, если оно еще не было таким.
[00127]
По ID[10] регистрация зависит от того, что было зарегистрировано по ID[8]. Если никакие данные не были зарегистрированы по ID[8], то это должно быть сделано на этой стадии, поэтому пакет может включать в себя "10:A1:R[DATA]->[4]". Если пакет был зарегистрирован по ID[8], это представляет собой нормальный пакет запись>считывание (например, "10:A1:W[A0]->R").
[00128]
По ID[11] регистрируется переход считывание->считывание. Если пакет был зарегистрирован по ID[8], то A0 находится в исходном списке ядер (например, "11:A2:R[A0,A1]->R"); в противном случае A0 отсутствует в списке (например, "11:A2:R[A1]->R").
[00129]
По ID[12], если гнездо B может видеть гнездо A, это представляет собой пакет считывание->считывание (например, "12:B0:R[A0,A1,A2]->R"). Если не может, то это представляет собой полную регистрацию данных (например, "12:B0:R[DATA]->[4]").
[00130]
По ID[13] данные поступают от B0, а также гнезда A, если оно видно (например, "13:B1:R[A0,A1,A2,B0]->R"). В списке может быть пропущено ядро A0, если запись не была зарегистрирована по ID[8].
[00131]
По ID[14] ничего не должно регистрироваться, если пакет, зарегистрированный по ID[8], действительно уже регистрировался. В противном случае A0 получит данные от A1 и A2, а также, возможно, гнезда B, если оно может быть увидено. Таким образом, пакет может включать в себя "14:A0:R[A1,A2,B0,B1]->R".
[00132]
Следует отметить, что хотя в этом примере гнезда регистрировались вместе, корректно будет регистрировать каждое гнездо по отдельности, подобно тому, как потоки выполнения могут регистрироваться по отдельности. Это может привести к трассировкам большего размера, но имеет то преимущество, что нет необходимости менять какой-либо механизм связи между гнездами в обрабатывающем устройстве.
[00133]
Кроме того, в любой момент времени строка кэша может быть вытеснена, что будет означать, что данные должны быть собраны из другого ядра или повторно зарегистрированы. Например, если до ID[11] у A0 была вытеснена строка кэша, то A2 получит значение от A1. Если и A1 и A0 были вытеснены, то обрабатывающему устройству A может потребоваться зарегистрировать значение строки кэша в трассировку для A2.
[00134]
Наконец, некоторые обрабатывающие устройства могут знать, что данные поступают от другого гнезда, но не знают от какого ядра в том гнезде. В этих случаях обрабатывающее устройство может регистрировать старшинство (источник) как ID гнезда, регистрировать сами данные, или регистрировать ID гнезда и хэш-значение данных (т.е., чтобы помочь упорядочить доступы между гнездами, но не должно регистрировать все данные в трассировку).
[00135]
Во втором примере, показанном на Фиг. 8D, CCP использует индексы вместо отслеживания когерентности кэша каждого ядра в отдельности. В этой среде индекс может отслеживаться между гнездами или внутри гнезда. С учетом сравнения производительности средств связи между гнездами и внутри гнезда, последний случай (внутри гнезда) может быть более рациональным. Когда индекс отслеживается внутри гнезда, для трассировки может потребоваться зарегистрировать что-то, когда данные смещаются между гнездами. Это может включать в себя регистрацию индекса из другого гнезда (но это не обязательно может быть однозначно достаточным для детерминированной трассировки), регистрацию хэш-значения одной или нескольких частей значения строки кэша, или регистрацию пакета в трассировке отправляющего гнезда для указания того, что данные были отправлены.
[00136]
Когда отслеживаются индексы ядра, при использовании неполностью инклюзивного кэша, возникает осложнение, когда кэш L1 может иметь данные, которых нет в кэше L3. Так, например, представим следующую последовательность событий: (i) A0 получает строку (а значит индексные биты относятся к A0) в свой кэш L1; (ii) A1 получает строку (а значит индексные биты относятся к A1) в свой кэш L1; (iii) кэш L3 вытесняет строку; (iv) A1 вытесняет строку из своего кэша L1; и (v) A2 получает строку кэша от A0 в свой кэш L1. Суть в том, что хотя A2 получает строку кэша от A0, индекс не относится к A0. Это осложняет регистрацию отображений в трассировку. Некоторые решения могут включать в себя добавление дополнительной информации (как описано выше), такой как хэш-значение одной или более частей данных строки кэша, периодическое добавление избыточной информации, подобной хэш-значению регистров общего назначения, и т.д. Регистрация вытеснений данных тоже может помочь, но это может значительно увеличить размер файла трассировки и усложнить регистрацию (например, регистрируя вытеснения данных из кэша L1, которых нет в кэшах L2 или L3, но не регистрируя вытеснения данных из кэша L1, которые находятся в кэшах L2 или L3).
[00137]
В некоторых вариантах осуществления, когда данные смещаются из кэша L3 в дочерние кэши L2 или L1, элемент регистрации вносится только при изменении индекса. Например, предположим, что A0 имел строку в своем кэше L1 (а значит индексные биты относятся к A0), затем A1 получает строку в свой кэш L1 (индекс в зоне A1), затем оба вытесняют строку кэша, но общий L2 (или L3) все еще имеет ее. Если кэш L2 обслуживает A1, то регистрировать нечего. Если кэш L2 обслуживает A0, то не требуется вносить элемент регистрации, если известно, что A0 уже имело данные; но если это неизвестно (или не может быть определено), имело ли уже A0 данные, то обрабатывающему устройству может потребоваться зарегистрировать считывание->считывание.
[00138]
Таблица 800d представляет регистрацию операций из таблицы 800b, при условии, что гнезда регистрируются независимо, что отслеживание выполняется посредством индекса, что нет дополнительных скрытых вытеснений данных, и что все записи, которые влияют на CCP и которые происходят при включенной регистрации, регистрируются (например, одна запись должна быть зарегистрирована, если последующие записи со стороны того же ядра и нет доступа между записями со стороны другого ядра или другого внешнего объекта). Для второго примера регистрация может включать в себя:
[00139]
Для ID[0], "0:A0:R[DATA]->[1]".
[00140]
Для ID[1], "1:B0:R[DATA]->[1]", т.е. напомним, что каждое гнездо регистрируется отдельно.
[00141]
Для ID[2], "2:A1:R [A0]->R".
[00142]
Для ID[3], "3:A2:R [A1]->W".
[00143]
Для ID[4], ничего.
[00144]
Для ID[5], "5:B0:R[DATA]->[2]". Это обусловлено тем, что запись по ID[3] делает недействительной строку по всем гнездам, а гнезда трассируются независимо (как указано выше).
[00145]
Для ID[6], "6:B1:R[B0]->R".
[00146]
Для ID[7], если строка кэша для B0 не была вытеснена, регистрировать нечего.
[00147]
Для ID[8]: "8:A0:R[A2]->W", так как регистрация бита идет (и несмотря на это, ядро не регистрировало данные раньше). Этот элемент демонстрирует, почему, при использовании индексов, есть сведения только о последнем владельце в гнезде.
[00148]
Для ID[9] регистрировать нечего.
[00149]
Для ID[10], "10:A1:W[A0]->R".
[00150]
Для ID[11], "11:A2:R[A1]->R".
[00151]
Для ID[12], "12:B0:R[data]->[4]". Это обусловлено тем, что строка кэша стала недействительной по всем гнездам по ID[8].
[00152]
Для ID[13], "13:B1:R[B0]->R".
[00153]
Для ID[14], "14:A0:R[A2]->R". Следует отметить, что по ID[11] индекс был обновлен до A2. Также отметим, что не было бы известно, что это ядро уже имело данные (т.е. ID[9]), так как индекс не несет эту информацию, тогда как ранее состояние по каждому обрабатывающему устройству (биты блоков) могло нести информацию.
[00154]
В третьем примере кэши в среде 800a неспособны прослеживать, какое ядро имеет последний разделяемый (считывание) доступ к строке кэша. Таким образом, в этом примере, индекс последнего считывателя не может быть отслежен, так как для этого нет битов. В этой ситуации CCP может использовать одно индексное значение (которое не отображается ни на одно ядро), чтобы сигнализировать о разделяемой строке, другое индексное значение, чтобы сигнализировать о недействительной строке, и индекс обрабатывающего устройства для "модифицированного" состояния (например, используя протокол MSI). В этом третьем примере регистрация может включать в себя регистрацию индекса кэша в пакете, вместо индекса ядра. Смещение от предка к потомку не должно регистрироваться, но может быть зарегистрировано как дополнительные данные. Если смещение от предка к потомку не регистрируется, то для интерпретации регистрации может потребоваться предоставление иерархии предок-потомок кэшей.
[00155]
Как упоминалось выше, в некоторых средах каждая строка кэша в кэше может включать в себя один флаговый бит, но CCP обрабатывающего устройства может отслеживать состояние когерентности для каждой строки кэша, со ссылкой на индекс для блока обработки, которому принадлежит состояние когерентности строки кэша. Как уже упоминалось, это создает полностью детерминированные трассировки, но может привести к трассировкам большего размера, чем в случаях, когда есть информация по каждому блоку обработки (например, CCP, который отслеживает каждый блок обработки, в сочетании с флаговым битом на каждую строку кэша). Фиг. 9A и 9B показывают, как может отличаться регистрация в этих двух ситуациях (т.е. информация о блоке CCP плюс флаговый бит строки кэша в сравнении с индексом CCP плюс флаговый бит строки кэша). Фиг. 9A показывает таблицу 900a, которая демонстрирует считывания и записи двумя блоками обработки (P0 и P1), а Фиг. 9B показывает таблицу 900b, в которой сравнивается, когда элементы регистрации могут быть внесены в этих двух средах. В этих примерах предположим, что флаговый бит начинается с очищенного состояния, и что биты блоков/индексные биты указывают, что никакой блок обработки не имеет доступа к строке кэша.
[00156]
Первоначально, если CCP отслеживает информацию о блоке, и строка кэша использует флаговый бит, регистрация может продолжаться следующим образом. Как показано в таблице 900b, по ID[0] ничего не нужно регистрировать, поскольку это запись в строку кэша, которая не была зарегистрирована (в качестве альтернативы, значение перед записью могло быть зарегистрировано, и флаговый бит мог быть установлен). В этот момент CCP может отметить, что ни P0, ни P1 не имеют доступа к строке кэша. По ID[1] данные строки кэша могут быть зарегистрированы для P1. Флаговый бит может быть включен, и CCP может отметить, что P1 имеет доступ к строке кэша. По ID[2] может быть зарегистрирован пакет считывание->считывание, причем P0 берет строку кэша из P1 (это регистрируется, так как флаговый бит был включен, и CCP используется для определения того, что P0 не имеет доступа). Флаговый бит уже был включен, и CCP отмечает, что теперь P0 тоже имеет доступ к состоянию строки кэша. По ID[3] ничего не нужно регистрировать (строка кэша уже есть в регистрации для этого ядра). Это определено, потому что флаговый бит включен, и CCP указывает, что P1 уже имел доступ к строке кэша. По ID[4] может быть зарегистрирован пакет считывание->запись для P0. Это обусловлено тем, что флаговый бит включен, и P0 уже имел доступ к строке кэша. Поскольку это была запись, CCP может сделать недействительной строку кэша для всех других обрабатывающих устройств (т.е. P0 имеет доступ, а P1 не имеет). По ID[5] может быть зарегистрирован пакет запись->считывание для P1. Это обусловлено тем, что флаговый бит включен, но P1 имеет данных в трассировке (как указано CCP). Следует отметить, что два опорных пакета по ID [4] и ID[5] меньше, чем пустая регистрация по ID[4] и необходимость после этого регистрировать данные по ID[5]. CCP отмечает, что P1 теперь имеет доступ к строке кэша, в дополнение к P0.
[00157]
Теперь, если CCP отслеживает только информацию об индексе, а строка кэша использует флаговый бит, регистрация может продолжаться следующим образом. Как показано в таблице 900b, по ID[0] ничего не нужно регистрировать, так как флаговый бит выключен, и это запись. Как и прежде, в качестве альтернативы это может быть зарегистрировано как считывание плюс запись, если память считывается со стороны P0. По ID[1] данные строки кэша могут быть зарегистрированы для P1. Флаговый бит может быть включен, а также CCP и обновление индекса должны указывать на P1. По ID[2] может быть зарегистрирован пакет считывание->считывание для P0. Это обусловлено тем, что флаговый бит уже включен, а индекс направлен на P1. CCP может обновить индекс до P0. Этот пакет по ID[3] считывание->считывание может быть зарегистрирован для P1. Следует отметить, что этот случай теперь неотличим от ID[2], поскольку в обоих случаях индекс направлен на другое обрабатывающее устройство, флаговый бит включен, и строка кэша находится в разделяемом состоянии. CCP может обновить индекс до P1. По ID[4] может быть зарегистрирован пакет считывание->запись для P0. Флаговый бит включен, а значит пакет может регистрироваться по ссылке. Это обновляет индекс CCP до P0. Пакет запись->считывание по ID[5] может быть зарегистрирован для P1. Флаговый бит включен, пакет регистрируется по ссылке. Строка кэша переходит в состояние разделяемой, поэтому CCP обновляет индекс до P1. Как показано в таблице 900b, вариант с индексом дает в результате файл трассировки большего размера, чем вариант с блоком, но все равно создает полностью детерминированную трассировку.
[00158]
Некоторые варианты осуществления в данном документе указывают на то, что с точки зрения размера файла трассировки может быть выгодно записывать пакеты данных, которые ссылаются на данные, которыми владеет другой блок обработки (когда это возможно), а не записывать данные строки кэша позже (например, ID[4] в каждом из предыдущих примеров). Другие преимущества могут быть также получены от записи по ссылке. Например, при воспроизведении, когда ряд элементов регистрации, которые являются ссылочными, можно сделать вывод, что в данные строки кэша не было никакого внешнего вмешательства. Это обусловлено тем, что, когда полные данные строки кэша повторно регистрируются, это означает, что строка кэша либо была вытеснена, либо признана недействительной. Таким образом, включение в состав элементов регистрации по ссылке, даже в ситуации, когда элемент регистрации может строго не требоваться, может предоставить неявную информацию об отсутствии внешних вмешательств, что может быть полезной информацией при воспроизведении или для отладки.
[00159]
В некоторых реализациях адреса, которые зарегистрированы в элементах трассировки (например, вышеупомянутых элементах "@"), содержат адреса физической памяти. В этих реализациях обрабатывающее устройство 102 может записывать один или несколько элементов TLB 102f в файл(ы) 104d трассировки. Это может быть как составная часть потоков данных трассировки для разных блоков обработки, или как составная часть дополнительных потоков данных трассировки. Это позволит позже программному обеспечению воспроизведения отобразить эти физические адреса на виртуальные адреса.
[00160]
Помимо этого, поскольку физические адреса иногда могут считаться "секретной" информацией (например, при записи на уровне пользовательского режима), некоторые варианты осуществления записывают некоторое представление фактических физических адресов, а не сами физические адреса. Это представление может быть любым представлением, которое однозначно отображает свои идентификаторы на физические адреса, не раскрывая физический адрес. Одним примером может быть хэш-значение каждого физического адреса. Когда используются эти представления, и элементы TLB 102f записываются в файл(ы) 104d трассировки, обрабатывающее устройство 102 записывает отображение между этими представлениями и виртуальными адресами, а не физических адресов на виртуальные адреса.
[00161]
Как уже упоминалось, обрабатывающее устройство 102 может включать в себя один или несколько буферов 102e. Эти буферы могут использоваться в качестве временной ячейки хранения для элементов файла трассировки, до фактической записи этих элементов в файл(ы) 102f трассировки. Таким образом, когда этап 305 приводит к регистрации данных в трассировку, этап 305 может содержать этап, на котором записывают данные в буфер(ы) 102e. В некоторых вариантах осуществления обрабатывающее устройство 102 применяет методы отложенной регистрации, чтобы уменьшить влияние записи данных трассировки на обрабатывающее устройство 102 и шину памяти. В этих вариантах осуществления обрабатывающее устройство 102 может сохранять данные трассировки в буфере(ах) 102e и откладывать запись в файл(ы) 102f трассировки до тех пор, пока не будет доступна полоса пропускания на шине памяти, или пока буфер(ы) 102e не заполнятся.
[00162]
Как также было упомянуто, некоторые варианты осуществления могут регистрировать вытеснения данных из кэша. Фиг. 10A и 10B показывают некоторые воплощения, в которых вытеснение кэша может быть эффективно зарегистрировано (т.е. если говорить о размере файла трассировки), максимально используя свойства ассоциативных кэшей. Первоначально, на Фиг. 10A показан пример 1000 разных частей адреса памяти, и их соотношение с ассоциативными кэшами. Как показано, адреса памяти включают в себя первое множество битов 1001, которые являются младшими битами адреса, и которые обычно равны нулю. Первое множество битов 1001 равно нулю, потому что адреса памяти обычно выравниваются по размеру адреса памяти (например, 32 бита, 64 бита, и т.д.). Таким образом, количество первого множества битов 1001 зависит от размера адреса памяти. Например, если адрес памяти составляет 32 бита (т.е. 2^5 битов), то первое множество битов 1001 содержит пять битов (так, чтобы адреса памяти были кратны 32), если адрес памяти составляет 64 бита (т.е. 2^6), то первое множество битов 1001 содержит шесть битов (так, чтобы адреса памяти были кратны 64), и т.д. Адреса памяти также включают в себя второе множество битов 1002, которые могут использоваться обрабатывающим устройством 102 для определения конкретной группы адресов в ассоциативном кэше, где должны храниться данные адреса памяти. В примере 1000 на Фиг. 10A, к примеру, второе множество битов 1002 содержит три бита, которые будут соответствовать ассоциативному кэшу, имеющему восемь групп адресов. Количество второго множества битов 1002, следовательно, зависит от конкретной геометрии ассоциативного кэша. Адреса памяти также включают в себя третье множество битов 1003, содержащих оставшиеся старшие биты адреса памяти.
[00163]
С учетом Фиг. 10A, Фиг. 10B показывает пример 1004 регистрации кэш-промахов и вытеснений данных из кэша в ассоциативном кэше. Первоначально, пример 1004 демонстрирует три адреса 1005 (т.е. адрес 1024), 1006 (т.е. адрес @2112) и 1007 (т.е. адрес @2048) памяти. Фиг. 10B также показывает ассоциативный кэш 1010, которого имеет восемь групп, каждая из которых содержит четыре входа. Двоичная идентичность этих групп и входов демонстрируется в столбцах 1008 (группы) и 1009 (входы), вместе с соответствующим десятичным представлением в скобках. Таким образом, например, строка (0,0) кэша, т.е. группа 0, вход 0, в кэше 1010 демонстрируется в двоичном виде как группа '000' (столбец 1008) и вход '00' (столбец 1009); строка (0,1) кэша, группа 0, вход 1, в кэше 1010 демонстрируется в двоичном виде как группа '000' (столбец 1008) и вход '01' (столбец 1009); и так далее до строки (8,3) кэша, т.е. группа 8, вход 3, в кэше 1010, которая демонстрируется в двоичном виде как группа '111' (столбец 1008) и вход '11' (столбец 1009).
[00164]
Теперь предположим, что есть первый кэш-промах по адресу 1005 (т.е., @1024). Здесь, поскольку его второе множество битов 1002 равно '000', обрабатывающее устройство 102 может определить, что оно должно сохранить данные, соответствующие адресу 1005, в группе 0 кэша 1010. Конкретный вход в группе 0 обычно выбирается посредством специфичной для обрабатывающего устройства логики. Применительно к примеру 1004, однако, предположим, что данные сохраняются во входе 0 (как показано стрелкой) 1011a. В связи с этим кэш-промахом, данные регистрации, записанные трассировщиком 104a, могут включать в себя адрес памяти (т.е., @1024) и вход (т.е., вход 0), в котором данные были сохранены. Следует отметить, что любое число методов сжатия может использоваться для уменьшения количества битов, необходимых для сохранения адреса памяти в трассировке. Группу (т.е., группу 0) не нужно регистрировать, потому что она может быть получена из второго множества битов 1002 адреса памяти.
[00165]
Далее предположим, что есть второй кэш-промах по адресу 1006 (т.е., @2112). На этот раз второе множество битов 1002 равно '010', поэтому обрабатывающее устройство 102 может определить, что оно должно сохранить данные, соответствующие адресу 1006, в группе 2 кэша 1010. Опять же, конкретный вход в группе 2 обычно выбирается посредством специфичной для обрабатывающего устройства логики. Применительно к примеру 1004, однако, предположим, что данные сохраняются во входе 0 (как показано стрелкой) 1011b. В связи с этим кэш-промахом, данные регистрации, записанные трассировщиком 104a, могут включать в себя адрес памяти (т.е., @2112) и вход (т.е., вход 0), в котором данные были сохранены. Опять же, группу (т.е., группу 2) не нужно регистрировать, потому что она может быть получена из второго множества битов 1002 адреса памяти.
[00166]
Теперь предположим, что есть третий кэш-промах по адресу 1007 (т.е., @2048). Второе множество битов 1002 снова равно '000', поэтому обрабатывающее устройство 102 может определить, что оно должно сохранить данные, соответствующие адресу 1007, в группе 0 кэша 1010. Конкретный вход снова выбирается посредством специфичной для обрабатывающего устройства логики, но предположим, что обрабатывающее устройство выбрало вход 0 (как показано стрелкой 1011c). В связи с этим кэш-промахом, данные регистрации, записанные трассировщиком 104a, могут включать в себя адрес памяти (т.е., @2048) и вход (т.е., путь 0), в котором данные были сохранены. Опять же, группу (т.е., группу 0) не нужно регистрировать, потому что она может быть получена из второго множества битов 1002 адреса памяти.
[00167]
Поскольку эта строка (0,0) кэша в данный момент соответствует адресу 1005, этот третий кэш-промах по адресу 1007 вызывает вытеснение адреса 1005 из кэша 1010. Тем не менее, варианты осуществления могут отказаться от записи любых данных трассировки, документирующих это вытеснение данных. Это обусловлено тем, что вытеснение данных может быть выведено из данных, уже находящихся в трассировке, т.е., первого кэш-промаха по адресу 1005 во вход 0 в сочетании со вторым кэш-промахом по адресу 1007 во вход 0. Даже при том, что группа (т.е., группа 0) может не регистрироваться явно в трассировке, она может быть выведена из этих адресов. Соответственно, воспроизведение этих данных трассировки может повторить вытеснение данных.
[00168]
Некоторые вытеснения данных являются результатом событий, отличных от кэш-промаха. Например, CCP может вызвать возникновение вытеснения данных для того, чтобы поддерживать согласованность между разными кэшами. Предположим, например, что адрес 1006 вытесняется из строки (2,0) кэша в кэше 1010 вследствие события CCP. На этой стадии вытеснение данных может быть явно зарегистрировано путем записи группы (т.е., '010') и входа (т.е., '00') вытеснения данных. Существенно, что адрес, который был вытеснен, не должен регистрироваться, так как он уже был зафиксирован при регистрации второго кэш-промаха, который занес адрес 1006 в строку (2,0) кэша. Соответственно, в этом примере вытеснение данных может быть полностью зафиксировано в файле(ах) 104d трассировки всего лишь пятью битами данных регистрации (до какой-либо формы сжатия).
[00169]
Некоторые варианты осуществления также способны безопасно трассировать действия блока обработки, даже когда исполнение потока выполнения в этом блоке обработки взаимодействует с защищенным анклавом. Как будет понятно специалистам в данной области техники, анклавы представляют собой аппаратные средства безопасности, которые могут защищать конфиденциальную информацию (например, криптографические ключи, учетные данные, биометрические данные, и т.д.), потенциально, даже от исполнения на обрабатывающем устройстве 102 программного обеспечения самого низкого уровня. Таким образом, в дополнение к защите конфиденциальной информации от процессов в пользовательском режиме, анклавы могут даже защищать конфиденциальную информацию от ядер и/или гипервизоров. Во многих реализациях анклавы представляются исполняемому процессу как зашифрованная часть(и) памяти, отображенная в адресное пространство процесса. Это может быть реализовано, например, путем использования разных таблиц страниц памяти для исполняемого процесса и анклава. Когда процесс взаимодействует с анклавом, процесс может считывать/записывать в своей собственной отображаемой памяти, а анклав может считывать/записывать в своей собственной отображаемой памяти и/или в отображаемой памяти процесса.
[00170]
Первые варианты осуществления учитывающей анклавы трассировки трассируют исполняемый процесс, при этом воздерживаясь от трассировки анклава, с которым взаимодействует процесс, в то же время все еще обеспечивая возможность полного воспроизведения трассируемого процесса. В этих вариантах осуществления считывания памяти исполняемым процессом в свое адресное пространство трассируются/регистрируются с использованием одного или нескольких механизмов, уже описанных в данном документе. Однако, когда имеет место переключение контекста на анклав, варианты осуществления могут отслеживать любые ячейки памяти, которые ранее считывались трассируемым процессом, и которые записывались анклавом в ходе его исполнения. Когда трассируемый процесс снова исполняется после переключения на анклав, эти ячейки памяти считаются не зарегистрированными трассируемым процессом. Таким образом, если трассируемый процесс снова считывает из этих ячеек памяти (потенциально считывая данные, которые были помещены в эти ячейки анклавом), эти считывания регистрируются в трассировку. В сущности, это означает, что любые побочные эффекты исполнения анклава, которые видны трассируемому процессу, фиксируются в трассировке без необходимости трассировки исполнения анклава. Таким образом, трассируемый процесс может быть воспроизведен позже с задействованием этих побочных эффектов, фактически без необходимости (или даже возможности) воспроизведения исполнения анклава. Существует несколько механизмов (описанных ранее), которые могут использоваться для отслеживания ячеек памяти, которые ранее считывались трассируемым процессом, и которые записывались анклавом в ходе его исполнения, к примеру, учетные биты (например, флаговые биты, биты блоков, индексные биты), блокировка входа, использование данных CCP, и т.д.
[00171]
Вторые варианты осуществления учитывающей анклавы трассировки трассируют исполняемый процесс (например, на основе доступа, такого как считывания, к его собственному адресному пространству), в то же время трассируя анклав (например, на основе доступа к его собственному адресному пространству и/или доступа к адресному пространству трассируемого процесса). Эти варианты осуществления могут быть реализованы, когда есть требуемый уровень доверия между ядром/гипервизором и анклавом. В этих вариантах осуществления данные трассировки, касающиеся исполнения анклава, могут регистрироваться в отдельный поток данных трассировки и/или шифроваться таким образом, что никакой объект, выполняющий воспроизведение, не сможет воспроизвести анклав без доступа к отдельному потоку данных трассировки анклава и/или криптографическому ключу(ам), который может использоваться для расшифровки данных трассировки, касающихся исполнения анклава.
[00172]
Третьи варианты осуществления учитывающей анклавы трассировки объединяют первые и вторые варианты осуществления. Таким образом, эти третьи варианты осуществления могут записывать трассировку исполняемого процесса, которая включает в себя побочные эффекты использования этим процессом анклава (т.е., первые варианты осуществления), наряду с трассировкой самого анклава (т.е., вторые варианты осуществления). Это позволяет воспроизводить трассируемый процесс пользователю, у которого нет требуемого уровня привилегий и/или криптографического ключа(ей), в то же время позволяя пользователю, имеющему требуемый уровень привилегий и/или криптографический ключ(и), также воспроизводить и исполнение самого анклава.
[00173]
Каждый из этих вариантов осуществления с трассировкой анклавов применим и без участия анклавов, и к любой ситуации, в которой трассируемый объект взаимодействует с другим объектом, исполнение которого должно быть защищено во время трассировки (упоминаемый в данных обстоятельствах как защищенный объект). Например, любой из этих вариантов осуществления может использоваться при трассировке процесса в пользовательском режиме, который взаимодействует с процессом в режиме ядра, в этом случае процесс в режиме ядра может рассматриваться почти так же, как анклав. В другом примере любой из этих вариантов осуществления может использоваться при трассировке процесса в режиме ядра, который взаимодействует с гипервизором, в этом случае гипервизор может рассматриваться почти так же, как анклав.
[00174]
Могут быть среды, в которых нецелесообразно (например, из соображений производительности или безопасности), невозможно (например, из-за отсутствия аппаратной поддержки) или нежелательно отслеживать, какие ячейки памяти, которые ранее считывались трассируемым процессом, записываются защищенным объектом в ходе его исполнения. Это может препятствовать использованию вариантов осуществления с трассировкой анклавов, описанных выше. Тем не менее, есть также методы для трассировки и в этих ситуациях.
[00175]
Первый метод состоит в том, чтобы рассматривать кэш обрабатывающего устройства как недействительный после переключения контекста от защищенного объекта. Рассмотрение кэша обрабатывающего устройства как недействительного приводит к тому, что считывания трассируемым объектом после возвращения из защищенного объекта приводят к кэш-промахам, которые могут быть зарегистрированы. Эти кэш-промахи будут включать в себя любые значения, которые были модифицированы защищенным объектом в адресном пространстве трассируемого объекта, и которые впоследствии были считаны трассируемым объектом. Хотя этот метод может генерировать больше данных трассировки, чем три варианта осуществления, описанные выше, он действительно фиксирует эффекты исполнения защищенного объекта, от которых зависел трассируемый объект. В некоторых вариантах осуществления этот первый метод также может записывать один или несколько ключевых кадров (например, в том числе снимок состояния регистров обрабатывающего устройства) после возврата к трассируемому объекту от защищенного объекта. Ключевой кадр(ы) позволяет начинать воспроизведение трассируемого объекта после возврата от защищенного объекта, даже несмотря на отсутствие непрерывности в данных трассировки (т.е., во время исполнения защищенного объекта).
[00176]
Второй метод состоит в том, чтобы регистрировать кэш-промахи, относящиеся к считываниям защищенным объектом из адресного пространства трассируемого объекта, а также к записям, выполненным защищенным объектом в адресное пространство трассируемого объекта. Это позволяет воспроизводить трассировку для повторений записей защищенного объекта без необходимости иметь доступ к инструкциям защищенного объекта, который их производил. Это также дает при воспроизведении доступ к данным (в адресном пространстве трассируемого объекта), которые считывал защищенный объект, и к которым позже получил доступ трассируемый объект. Возможны смешанные подходы (если имеется достаточная служебная информация, такая как данные CCP), при которых могут регистрироваться записи защищенного объекта (в адресном пространстве трассируемого объекта), но не его считывания, если эти считывания будут зарегистрированы позже вследствие рассмотрения кэша как недействительного.
[00177]
Настоящее изобретение может быть воплощено в других специфических формах без отступления от его сущности или существенных свойств. Описанные варианты осуществления должны рассматриваться во всех отношениях только как иллюстративные, а не ограничивающие. Следовательно, объем настоящего изобретения указывается прилагаемой формулой изобретения, а не предшествующим описанием. Все изменения, которые производятся в рамках смысла и диапазона эквивалентности формулы изобретения, должны восприниматься как входящие в ее объем.