Маршрутизаторы с разделяемой памятью

Для того, чтобы понять, как в действительности устроена система IOS, было бы полезным рассмотреть ее работу на реальном маршрутизаторе. Поскольку операционная система IOS тесно связана с аппаратных обеспечением, на котором она выполняется, каждая конкретная реализация операционной системы имеет свои особенности.

Ниже рассматривается наиболее общая реализация системы, предназначенной для так называемых маршрутизаторов с разделяемой памятью. Семейство маршрутизаторов с разделяемой памятью включает несколько моделей: Cisco 1600, 2500, 4000, 4500 и 4700 серий.

Несмотря на то, что все они имеют свои отличительные особенности, у таких устройств есть два общих принципа: использование разделяемых ресурсов (центральный процессор, основная память и интерфейсы) и использование системных буферов для хранения пакетов.

Аппаратное устройство маршрутизаторов с разделяемой памятью

На рис. 3.1, представлена общая схема маршрутизатора и общий взгляд на устройство маршрутизатора позволяет выделить три основных компонента: центральный процессор (Central Processing Unit — CPU), память (Dynamic Random Access Memory — DRAM) и контроллеры интерфейсов. Причем как процессор, так и контроллеры связаны с памятью посредством шин данных. На рис.3.1 отображено также разделение памяти на логические области, назначение которых рассматривается ниже.

Центральный процессор

Центральный процессор исполняет код системы IOS и коммутирует пакеты. Центральный процессор несет ответственность за реализацию всех механизмов коммутации, поддерживаемых данной платформой, при этом никакие дополнительные процессоры не привлекаются.

Тип используемого процессора зависит от конкретной платформы. Так, для маршрутизаторов Cisco серий 1600 и 2500 применяется процессор Motorola 68000, в то время как в маршрутизаторах серий 4500 и 4700 используется процессор MIPS RISC. Тип используемого процессора можно определить с помощью команды show version.

В примере 3.1 приведен результат выполнения команды show version на маршрутизаторе Cisco 1600.

В примере 3.2 показана аналогичная ситуация для маршрутизатора Cisco 4500.

Память

Маршрутизаторы с разделяемой памятью оснашены динамической памятью (Dynamic Random Access Memory — DRAM), которая используется для хранения большинства данных: таблиц маршрутизации, кэша, данных системы IOS, буферов пакетов и самого кода IOS (для большинства систем).

Динамическая память, доступная в системе, разделяется IOS на два логических класса: локальная память (Local) и Iomem (I/O memory — память ввода-вывода). В большинстве случаев локальная память расположена в области main (основная), а память ввода-вывода — в области iomem, что проиллюстрировано в примере 3.3, который содержит результат исполнения команды show region.


Число, стоящее перед косой чертой, обозначает объем локальной памяти (32768 Кбайт),а число стоящее за косой чертой,- объем памяти ввода-вывода (16384 Кбайт). Общий объем установленной динамической памяти можно вычислить, сложив два этих числа (49152 Кбайт). Для системы из примеров 3.3 и 3.4 32786 Кбайт локальной памяти соответствуют области main (основная), а 16384 Кбайт — памяти ввода-вывода и области iomem соответственно.

На платформах с разделяемой памятью область памяти main используется для хранения таблиц маршрутизации, кэша и структур данных системы IOS общего назначения. Зачастую в данной области памяти хранится исполняемый код операционной системы. Буферы пакетов, однако, содержатся в другой области памяти — iomem, которую зачастую называют разделяемой памятью (shared memory), поскольку доступ к ней имеют и процессор, и сетевые интерфейсы.

В большинстве систем динамическая память (DRAM), используемая для локальных нужд, и память, отведенная для операций ввода-вывода, разделены аппаратно на два разных банка. В таких системах весь банк памяти используется под конкретную область: один банк зарезервирован для области ввода-вывода iomem, другой — для области main. Тем не менее в моделях маршрутизаторов Cisco 1600 и 2500 Локальная память и память ввода-вывода размешены в одном банке динамической памяти. Объем памяти, отводимый для области ввода-вывода, зависит при этом от общего объема установленной памяти, согласно числам, приведенным ниже.

    • 1 Мбайт — из них 512 Кбайт выделяется для области ввода-вывода.

    • 2 Мбайт — из них 1 Мбайт выделяется для области ввода-вывода.

    • 4 Мбайт и больше — из них 2 Мбайта отводится под область ввода-вывода.

Местоположение исполняемого кода системы IOS в маршрутизаторах с разделяемой памятью

Некоторые платформы маршрутизаторов с разделяемой памятью, в частности серии 1600 и 2500, имеют возможность запускать систему IOS из флэш-памяти. В том случае, если система запушена из флэш-памяти, область памяти main не используется для хранения исполняемого кода IOS. При этом исполняемый код системы содержится в области памяти, названной flash (пример 3.5).


Размеры рассматриваемых нами областей памяти также отображены в выводе команды show version, как показано в примере 3.4.


В главе, “Введение в структуру операционной системы IOS” было сказано, что класс памяти IText обозначает место, где размещается исполняемый код системы IOS. В рассмотренном выше примере 3.5 класс IText назначен подобласти flash:text из области памяти flash и обозначает тот факт, что система выполняет код операционной системы IOS из флэш-памяти.

Информацию о местонахождении кода системы во время исполнения можно получить из формата имени файла-образа. Последний символ имени файла (или два символа) обозначает образ как перемещаемый (relocatable) или выполняемый из динамической памяти (run-from-DRAM). Последний выполняется из локальной памяти, а перемещаемый — из флэш-памяти.

В примере 3.6 показан вывод команды show version для маршрутизатора Cisco 2500 с операционной системой 10S, запущенной из флэш-памяти.

Последний символ в названии файла-образа (символ L) означает, что образ является перемещаемым (relocatable), т.е. выполняется из флэш-памяти, Напротив, если имя образа оканчивается символами М или MZ, это означает, что образ выполняется из локальной памяти. В примере 3.7 приведен результат выполнения команды show version для рассмотренного выше случая.



Пулы памяти

Для управления выделением и освобождением памяти в пределах областей динамической памяти операционная система IOS создает два пула. Как видно из примера 3.8, эти два пула называются Processor (процессорный) и I/O (ввода-вывода) соответственно.

Пул памяти процессора (processor) создается в подобласти maimheap, размешенной в локальной (local) памяти, а пул памяти ввода-вывода (I/O) — в области iomem памяти ввода-вывода. Объем памяти, отводимый для пула ввода-вывода, в точности соответствует объему области iomem. Однако размер процессорного пула всегда меньше размера области памяти main. Пул процессора может занимать только часть области main, поскольку оставшаяся часть области используется для внутренних данных системы IOS, для сегментов BSS и на большинстве платформ для размещения самого исполняемого образа IOS.


Внимание!

Все рассматриваемые в данной книге маршрутизаторы имеют разделяемую память, так почему же следует выделять отдельную группу аппаратных платформ? Ответ заключается в том, что уникальность данных устройств заключается не в том, что они имеют общую память, а в том, что у них есть лишь одна область разделяемой памяти ввода-вывода. А разделяется она между центральным процессором и контроллерами сетевых интерфейсов. В добавок ко всему, одна и та же память используется для маршрутизации всех пакетов, т.е. данные не копируются из одной области в другую для принятия и последующей обработки, как это происходит на других платформах.

Контроллеры интерфейсов

Контроллеры интерфейсов отвечают за передачу данных по каналам связи и за прием данных из этих же каналов. Контроллеры интерфейсов оснащены собственными процессорами, называемыми контроллерами устройства, однако они не выполняют никаких операций по коммутации пакетов или их обработке. Контроллеры интерфейсов управляют передачей пакетов между каналом связи и памятью ввода-вывода. В зависимости от аппаратной реализации, контроллеры интерфейсов могут представлять собой отдельные подключаемые внешние модули либо быть встроены в основную системную плату маршрутизатора.

Буферы пакетов маршрутизаторов с разделяемой памятью

В операционной системе IOS предусмотрен набор буферов, называемых системными буферами (system buffers), которые используются для коммутации пакетов. Система IOS на платформах с разделяемой памятью также использует системные буферы. Отличие состоит лишь в том, что системные буферы используются во время всего процесса коммутации, а не только во время обработки.

Вдобавок к стандартному набору системных буферов IOS на платформах с разделяемой памятью создает несколько персональных буферных пулов и специальные буферные структуры для контроллеров интерфейсов, называемых кольцами (rings).

Локальные буферные пулы

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

В отличие от динамических общих буферных пулов, локальные пулы являются статическими и выделяются под определенное число буферов при инициализации системы IOS. В дальнейшем дополнительные буферы в пуле не могут создаваться. Если в локальном пуле все буферы оказываются занятыми, операционная система IOS обращается к общему буферному пулу для выделения буфера, размер которого указан в виде параметра MTU конкретного интерфейса.

В примере 3.9 приведен результат вывода команды show buffers, отображающий информацию об общих и о персональных буферных пулах.

Параметры соответствующие персональным буферным пулам интерфейсов:

    • fallbacks (аварийные обращения) - число обращений центрального процессора к общему буферному пулу для размещения пакета.

    • max cache size. Несколько буферов локального пула кэшируются для более быстрого обращения. Данный параметр определяет максимально возможное число кэшированных буферов.

    • In cache - число кэшированных локальных буферов.

Для локальных пулов не указываются параметры creates (число расширений буферных пулов) и trims (число усечений пулов), поскольку локальные пулы являются статическими.



Кольца приема и передачи

Помимо общих и локальных буферных пулов, операционная система IOS также создает специальные управляющие буферные структуры, называемые кольцами, и размешает их в памяти ввода-вывода. Сама система IOS и контроллеры интерфейсов используют кольца для того, чтобы отследить, какой буфер используется для передачи пакетов, а какой — для приема. В действительности кольца представляют собой некую управляющую структуру, используемую многими контроллерами устройств для управления принятыми пакетами и пакетами, ожидающими передачи. Сами кольца состоят из элементов, специфичных для контроллера каждого устройства, а элементы указывают на конкретные буферы, размешенные где-то в области памяти ввода-вывода. Кольца создаются системой IOS для конкретных контроллеров устройств и затем совместно используются как самой IOS, так и контроллером. Каждому интерфейсу соответствует пара колец:

одно — для приема пакетов (кольцо приема),

другое — для передачи пакетов (кольцо передачи).

Размеры таких колец фиксированы. Размер кольца приема зависит от конкретного интерфейса и указывается в спецификации контроллера устройства. Размер кольца передачи, помимо спецификации контроллера зависит также от типа очереди пакетов, установленной для данного интерфейса.

Кольца приема наделены постоянным числом пакетных буферов, выделяемых в точности под размер кольца. Изначально пакетные буферы кольца приема выделяются в персональном буферном пуле интерфейса. По ходу работы они могут замещаться либо буферами из локального пула, либо буферами общего пула.

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

Команда show controller (пример 3.10) используется для определения размеров и местоположения в памяти колец приема и передачи. Информация, в примере 3.10, характерна для большинства типов интерфейсов, однако может иметь несколько иной вид в разных системах.


Ниже описаны наиболее интересные параметры, выводимые командой show controller.

    • RX ring with 32 entries at Ox400303D0. Размер кольца приема равен 32, а начало блока находится по адресу 0x400303D0 в памяти ввода-вывода.

    • 00 pak-=0x60AF2468 ds=0xA80C745E status=0x80 max_size=1524 pak_size=0. Данная строка повторяется для каждого элемента кольца приема. Каждый элемент кольца, называемый дескриптором, несет информацию о соответствующем пакетном буфере, выделенном для кольца приема. Все значения, выводимые в строке (кроме значения рак), специфичны для конкретного устройства и изменяются от одного контроллера устройства к другому. Значение параметра рак обозначает адрес в памяти, где размещается связанный с данным дескриптором заголовок пакета. Все пакетные буферы в системе IOS имеют соответствующий заголовок, содержащий информацию о содержимом буфера и указатель на собственно буфер, размешенный в памяти. Хотя буферы пакетов на платформах с разделяемой памятью и находятся в памяти ввода-вывода, их заголовки могут размещаться в локальной памяти, как в рассматриваемом нами случае.

    • TX ring with 32 entries at 0x40059BD0, tx_count=0. Данные параметры означают размер кольца передачи и число пакетов, ожидающих передачи. В приведенном случае размер кольца равен 32, и нет ожидающих передачи пакетов.

    • 00 pak-0x000000 ds=0xA8000000 status=0x03 status2=0x0000 pak_size=0. Данная строка повторяется для каждого элемента в кольце передачи. Так же как и для кольца приема, каждый элемент в кольце передачи — это дескриптор, содержащий информацию о соответствующем пакетном буфере в кольце. Значение параметра рак указывает на заголовок соответствующего пакетного буфера, ожидающего передачи. Остальные параметры специфичны для конкретного контроллера устройства. В отличии от дескрипторов кольца приема, дескрипторы кольца передачи связаны только с пакетным буфером, когда существует пакет, ожидающий передачи. После передачи пакета связь между буфером и дескриптором теряется, буфер возвращается в соответствующий пул, а значение дескриптора рак сбрасывается в 0x000000.

Коммутация пакетов в маршрутизаторах с разделяемой памятью

Теперь когда мы знакомы с аппаратной реализацией маршрутизаторов с разделяемой памятью и с тем, как операционная система IOS управляется с этой памятью, рассмотрим, как происходит собственно процесс коммутации пакетов. Система IOS на маршрутизаторах с разделяемой памятью поддерживает следующие функции:

    • Процесс коммутации.

    • Коммутация с помощью метода CEF.

    • Быстрая коммутация.

Процесс коммутации состоит из нескольких этапов:

    • получение пакета;

    • коммутация пакета;

    • передача пакета.

Получение пакета

На рис. 3.2 проиллюстрирован этап получения пакета.

Этап 1. Контроллер интерфейса определяет наличие пакета в сети и копирует его в буфер, указанный первым свободным элементом кольца приема (очередной доступный буфер контроллера интерфейса). Контроллер использует механизм прямого доступа к памяти (Direct Memory Access — DMA) для копирования пакета.

Этап 2. Контроллер интерфейса передает процессору права владения пакетным буфером и генерирует прерывание, сигнализирующее о получении пакета. Далее контроллер интерфейса продолжает прием пакетов, размещая их в других буферах, не ожидая ответа от процессора.

Этап 3. Процессор обрабатывает прерывание и пытается удалить только что заполненный буфер из кольца приема и восполнить изъятый буфер пустым, взятым из персонального пула интерфейса. При этом возможны следующие ситуации.

    • 3.1.В персональном пуле интерфейса имеются свободные буферы для пополнение кольца приема. Свободный буфер подключается к кольцу, и процесс коммутации пакета продолжается на 4-м этапе.

    • 3.2.В персональном пуле интерфейса нет доступных буферов. Таким образом, кольцо приема восполняется путем обращения к глобальному пулу, соответствующему структуре MPU данного интерфейса. При этом счетчик аварийных обращений увеличивается.

    • 3.3. В общем буферном пуле нет свободных буферов. В данном случае пришедший пакет игнорируется, а счетчик числа игнорирования пакетов увеличивается. Далее интерфейс подавляется, и входящие пакеты в течение небольшого промежутка времени игнорируются.

Коммутация пакета

Этап 4. После заполнения кольца приема процессор переходит к коммутации пакета и начинает сбор информации о том, куда должен быть послан данный пакет (следующий транзитный узел), и о МАС-адресе, который должен быть прописан в заголовке пакета.

Операционная система IOS пытается коммутировать пакеты наиболее быстрым способом из тех, которые сконфигурированы для данного интерфейса. На платформах с разделяемой памятью система IOS сначала пробует осуществить CEF-коммутацию (если она сконфигурирована для данного интерфейса), затем — быструю коммутацию, потом она обращается к процессу коммутации, если предыдущие методы не дали результата. На рис. 3.3 показаны стадии коммутации пакета.


Внимание!

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

Этап 5. На стадии обработки прерывания от полученного пакета система IOS пытается использовать таблицу CEF и кэш быстрой коммутации для определения пути следования пакета.

    • 5.1. CEF-коммутация. Если для интерфейса включена CEF-коммутация, система IOS пытается использовать ее. При этом возможны следующие ситуации.

    • 5.1.1. Если в CEF-таблице есть соответствующие смежные записи, операционная система IOS просто переписывает МАС-адрес в заголовке пакета и передает его дальше (этап 8).

    • 5.1.2. Если соответствующей записи в CEF-таблице не найдено, система IOS переходит к этапу быстрой коммутации пакета (п. 5.2).

    • 5.1.3. Если запись в CEF-таблице для данного· пакета указывает на известный адрес, пакет добавляется в очередь процесса коммутации.

    • 5.1.4. Если в CEF-таблице нет записи для пункта назначения пакета,пакет игнорируется.

    • 5.2. Быстрая коммутация. Если механизм CEF-коммутации не включен или CEF-коммутация не позволила переправить пакет, операционная система IOS предпринимает попытку быстрой коммутации.

    • 5.2.1. Если в кэш-таблице есть запись для места назначения, система IOS переписывает МАС-заголовок в заголовке пакета и передает пакет дальше (этап 8).

    • 5.2.2. Если необходимая запись не найдена, пакет добавляется в очередь процесса коммутации.

Этап 6. Процесс коммутации. Если перечисленные выше механизмы коммутации не смогли определить пункт назначения пакета, операционная система IOS обращается к процессу коммутации. Пакет помещается в очередь входящих пакетов соответствующего процесса (например, IP-пакеты выстраиваются в очередь процесса коммутации). После этого обработка прерывания завершается.

Этап 7. В конечном итоге процесс коммутации выполняет свои функции, определяет маршрут пакета и переписывает в его заголовке МАС-адрес. Важно отметить, что пакет при этом все еще находится в буфере, куда он изначально был скопирован. После того, как выполнился процесс коммутации, система IOS переходит к этапу передачи пакета (этап 9).

Передача пакета

На рис. 3.4 представлены стадии передачи пакета.

Этап 8. Если коммутация пакета была осуществлена с помощью метода CEF или быстрой коммутации, система IOS проверяет наличие пакетов в выходной очереди передающего интерфейса (находясь при этом все еще в стадии обработки прерывания).

    • 8.1. Если в исходящей очереди уже присутствуют какие-либо пакеты, система IOS добавляет новый пакет в очередь, вместо того, чтобы передать его напрямую передающему кольцу. Это снижает вероятность беспорядка в очередности следования пакетов. Затем операционная система переходит к п. 8.3.

    • 8.2. Если исходящая очередь пуста, система IOS размещает пакет в кольцо передачи исходящего интерфейса, связывая пакетный буфер с дескриптором передающего кольца. Обработка прерывания заканчивается, и дальнейшие действия продолжаются с этапа 11. Если же в кольце передачи нет свободного места, пакет помещается в очередь исходящих пакетов, а обработка прерывания на этом заканчивается.

    • 8.3. Если очередь исходящих пакетов полностью заполнена, пакет игнорируется. Счетчик игнорированных пакетов увеличивается, и обработка прерывания заканчивается.


Внимание!

На этапе 8 передачи пакета система IOS, прежде чем поместить коммутированный пакет в кольцо передачи, проверяет очередь исходящих пакетов. Это уменьшает вероятность разупорядочивания пакетов. Как может пакет изменить порядок передачи, если его коммутация осуществляется сразу же при его получении? Рассмотрим следующий пример:

Предположим, что первый пакет, о котором мы будем говорить, переправляемый между двумя узлами, попадает в маршрутизатор. Система IOS пытается коммутировать пакет методом быстрой коммутации, однако не находит соответствующей информации в кэше. Таким образом, пакет отправляется в очередь процесса коммутации IP-пакетов.

Пока что все "хорошо". Процесс-коммутатор определяет путь следования пакета и добавляет соответствующую запись в кэш для данного потока. После этого первый пакет отправляется в очередь исходящих пакетов передающего интерфейса.

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

Этап 9. Если коммутация пакета была осуществлена процессом, пакет помещается в выходную очередь. Если свободного места в очереди не находится, пакет игнорируется. При этом увеличивается счетчик игнорированных выходных пакетов.

Этап 10. Система IOS пытается найти свободный дескриптор. Если таковой существует, операционная система извлекает пакет из очереди и связывает буфер пакета с кольцом передачи. Если же свободных дескрипторов нет (кольцо полностью заполнено), система IOS оставляет пакет в очереди до тех пор, пока контроллер интерфейса не передаст пакет из кольца и не освободит дескриптор.

Этап 11. Передающий интерфейс периодически опрашивает кольцо передачи на предмет нахождения в нем пакетов. Как только контроллер обнаруживает пакет, он передает его на линию передачи и генерирует процессору прерывание передачи.

Этап 12. Операционная система IOS обрабатывает прерывание передачи, высвобождает буфер из кольца передачи И возвращает его в соответствующий пул. Затей система IOS проверяет очередь исходящих пакетов интерфейса. Если в ней есть пакеты, система извлекает очередной пакет из очереди и связывает его с кольцом передачи. На этом обработка прерывания передачи завершается.


Резюме

В данной главе была рассмотрена работа операционной системы IOS на маршрутизаторах Cisco с разделяемой памятью. Под данную категорию попадают маршрутизаторы серии 2500, которых на сегодняшний день насчитывается более миллиона.