Собираем ядро Linux. Создание ядра операционной системы

Семантическое ядро — довольно избитая тема, не так ли? Сегодня мы вместе это исправим, собрав семантику в этом уроке!

Не верите? - посмотрите сами - достаточно просто вбить в Яндекс или Гугл фразу семантическое ядро сайта. Думаю, что сегодня я исправлю эту досадную ошибку.

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

Семантическое ядро — основа основ — тот самый первый шажок, который стоит перед и запуском любой рекламной кампании в интернете. Наряду с этим — семантика сайта наиболее муторный процесс, который потребует немало времени, зато с лихвой окупится в любом случае.

Ну что же… Давайте создадим его вместе!

Небольшое предисловие

Для создания семантического поля сайта нам понадобится одна-единственная программа — Key Collector . На примере Коллектора я разберу пример сбора небольшой сем группы. Помимо платной программы, есть и бесплатные аналоги вроде СловоЕб и других.

Семантика собирается в несколько базовых этапов, среди которых следует выделить:

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

О наиболее важных этапах сбора и пойдет речь ниже!

ВИДЕО - составление семантического ядра по конкурентам

Мозговой штурм при создании семантического ядра — напрягаем мозги

На данном этапе надо в уме произвести подбор семантического ядра сайта и придумать как можно больше фраз под нашу тематику. Итак, запускаем кей коллектор и выбираем парсинг Wordstat , как это показано на скриншоте:

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

  • seo блог
  • сео блог
  • блог про сео
  • блог про seo
  • продвижение
  • продвижение проекта
  • раскрутка
  • раскрутка
  • продвижение блогов
  • продвижение блога
  • раскрутка блогов
  • раскрутка блога
  • продвижение статьями
  • статейное продвижение
  • miralinks
  • работа в sape
  • покупка ссылок
  • закупка ссылок
  • оптимизация
  • оптимизация страницы
  • внутренняя оптимизация
  • самостоятельная раскрутка
  • как раскрутить ресурс
  • как раскрутить свой сайт
  • как раскрутить сайт самому
  • как раскрутить сайт самостоятельно
  • самостоятельная раскрутка
  • бесплатная раскрутка
  • бесплатное продвижение
  • поисковая оптимизация
  • как продвинуть сайт в яндексе
  • как раскрутить сайт в яндексе
  • продвижение под яндекс
  • продвижение под гугл
  • раскрутка в гугл
  • индексация
  • ускорение индексации
  • выбор донора сайту
  • отсев доноров
  • раскрутка постовыми
  • использование постовых
  • раскрутка блогами
  • алгоритм яндекса
  • апдейт тиц
  • апдейт поисковой базы
  • апдейт яндекса
  • ссылки навсегда
  • вечные ссылки
  • аренда ссылок
  • арендованные ссылке
  • ссылки с помесячной оплатой
  • составление семантического ядра
  • секреты раскрутки
  • секреты раскрутки
  • тайны seo
  • тайны оптимизации

Думаю, достаточно, и так список с пол страницы;) В общем, идея в том, что на первом этапе вам необходимо проанализировать по максимуму свою отрасль и выбрать как можно больше фраз, отражающих тематику сайта. Хотя, если вы что-либо упустили на этом этапе — не отчаивайтесь — упущенные словосочетания обязательно всплывут на следующих этапах , просто придется делать много лишней работы, но ничего страшного. Берем наш список и копируем в key collector. Далее, нажимаем на кнопку — Парсить с Яндекс.Wordstat :

Парсинг может занять довольно продолжительное время, поэтому следует запастись терпением. Семантическое ядро обычно собирается 3-5 дней и первый день у вас уйдет на подготовку базового семантического ядра и парсинг.

О том, как работать с ресурсом , как подобрать ключевые слова я писал подробную инструкцию. А можно узнать о продвижении сайта по НЧ запросам.

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

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

Чистка семантики

Как только, парсинг вордстата полностью прекратится — пришло время отсеять семантическое ядро . Данный этап очень важен, поэтому отнеситесь к нему с должным вниманием.

Итак, у меня парсинг закончился, но словосочетаний получилось ОЧЕНЬ много , а следовательно, отсев слов может отнять у нас лишнее время. Поэтому, перед тем как перейти к определению частотности, следует произвести первичную чистку слов. Сделаем мы это в несколько этапов:

1. Отфильтруем запросы с очень низкими частотностями

Для этого наживаем на символ сортировки по частотности, и начинаем отчищать все запросы, у которых частотности ниже 30:

Думаю, что с данным пунктом вы сможете без труда справиться.

2. Уберем не подходящие по смыслу запросы

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

  • курсы поисковой оптимизации
  • продам раскрученный сайт

Анализ семантического ядра

На данном этапе, нам необходимо определить точные частотности наших ключей, для чего вам необходимо нажать на символ лупы, как это показано на изображении:

Процесс довольно долгий, поэтому можете пойти и приготовить себе чай)

Когда проверка прошла успешно — необходимо продолжить чистку нашего ядра.

Предлагаю вам удалить все ключи с частотностью меньше 10 запросов. Также, для своего блога я удалю все запросы, имеющие значения выше 1 000, так как продвигаться по таким запросам я пока что не планирую.

Экспорт и группировка семантического ядра

Не стоит думать, что данный этап окажется последним. Совсем нет! Сейчас нам необходимо перенести получившуюся группу в Exel для максимальной наглядности. Далее мы будем сортировать по страницам и тогда увидим многие недочеты, исправлением которых и займемся.

Экспортируется семантика сайта в Exel совсем нетрудно. Для этого просто необходимо нажать на соответствующий символ, как это показано на изображении:

После вставки в Exel, мы увидим следующую картину:

Столбцы, помеченные красным цветом необходимо удалить. Затем создаем еще одну таблицу в Exel, где будет содержаться финальное семантическое ядро.

В новой таблице будет 3 столбца: URL страницы , ключевое словосочетание и его частотность . В качестве URL выбираем или уже существующую страницу или страницу, которая будет создана в перспективе. Для начала, давайте выберем ключи для главной страницы моего блога:

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

  1. такие частотные запросы, как должны иметь намного больший хвост из менее частотных фраз, чем мы видим
  2. сео новости
  3. всплыл новый ключ, который мы не учли ранее — статьи сео . Необходимо проанализировать этот ключ

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

После всех проделанных операций, мы смогли получить новые ключи для главной страницы этого блога:

  • лучший seo блог
  • seo новости
  • статьи seo

И некоторые другие. Думаю, что методика вам понятна.

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

Финальный отсев

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

*На самом деле тут можно использовать любой из аналогичных сервисов, позволяющих узнать конкуренцию по ключевым словам, например, Мутаген!

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

Затем проверяем стоимость получения одного перехода по нашим ключевым словам:

Стоимость перехода по некоторым словосочетаниям превысила 5 рублей. Такие фразы необходимо исключить из нашего ядра.

Возможно, ваши предпочтения окажутся несколько иными, тогда вы можете исключать и менее дорогие фразы или наоборот. В своем случае, я удалил 7 фраз .

Полезная информация!

по составлению семантического ядра, с упором на отсев наиболее низкоконкурентных ключевых слов.

Если у вас свой интернет-магазин — прочитайте , где описано, как может быть использовано семантическое ядро.

Кластеризация семантического ядра

Уверен, что ранее тебе уже доводилось слышать это слово применительно к поисковому продвижению. Давай разберемся, что же это за зверь такой и зачем он нужен при продвижении сайта.
Классическая модель поискового продвижения выглядит следующим образом:

  • Подбор и анализ поисковых запросов
  • Группировка запросов по страницам сайта (создание посадочных страниц)
  • Подготовка seo текстов для посадочных страниц на основе группы запросов для этих страниц

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

Для лучшего понимания теории кластеризации следует сделать небольшой экскурс в историю SEO:

Еще буквально несколько лет назад, когда термин кластеризация не выглядывал из-за каждого угла - сеошники, в подавляющем большинстве случаев, группировали семантику руками. Но при группировке огромных семантик в 1000, 10 000 и даже 100 000 запросов данная процедура превращалась в настоящую каторгу для обычного человека. И тогда повсеместно начали использовать методику группировки по семантике (и сегодня очень многие используют этот подход). Методика группировки по семантике подразумевает объединение в одну группу запросов, имеющих семантическое родство. Как пример - запросы “купить стиральную машинку” и “купить стиральную машинку до 10 000” объединялись в одну группу. И все бы хорошо, но данный метод содержит в себе целый ряд критических проблем и для их понимания необходимо ввести новый термин в наше повествование, а именно – “интент запроса ”.

Проще всего описать данный термин можно как потребность пользователя, его желание. Интент является ни чем иным, как желанием пользователя, вводящего поисковый запрос.
Основа группировки семантики - собрать в одну группу запросы, имеющие один и тот же интент, либо максимально близкие интенты, причем тут всплывает сразу 2 интересных особенности, а именно:

  • Один и тот же интент могут иметь несколько запросов не имеющих какой-либо семантической близости, например – “обслуживание автомобиля” и “записаться на ТО”
  • Запросы, имеющие абсолютную семантическую близость могут содержать в себе кардинально разные интенты, например, хрестоматийная ситуация – “мобильник” и “мобильники”. В одном случае пользователь хочет купить телефон, а в другом посмотреть фильм

Так вот, группировка семантики по семантическому соответствию никак не учитывает интенты запросов. И группы, составленные таким образом не позволят написать текст, который попадет в ТОП. Во временя ручной группировки для устранения этого недоразумения ребята с профессией «подручный SEO специалиста» анализировали выдачу руками.

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

Механика кластеризации проста и выглядит следующим образом:

  • Система поочередно вводит все поданные ей запросы в поисковую выдачу и запоминает результаты из ТОП
  • После поочередного ввода запросов и сохранения результатов, система ищет пересечения в выдаче. Если один и тот же сайт одним и тем же документом (страница сайта) находится в ТОП сразу по нескольким запросам, то эти запросы теоретически можно объединить в одну группу
  • Становится актуальным такой параметр, как сила группировки, который говорит системе, сколько именно должно быть пересечений, чтобы запросы можно было добавить в одну группу. К примеру, сила группировки 2 означает, что в выдаче по 2-м разным запросам должно присутствовать не менее двух пересечений. Говоря еще проще – минимум две страницы двух разных сайтов должны присутствовать одновременно в ТОП по одному и другому запросу. Пример ниже.
  • При группировках больших семантики становится актуальна логика связей между запросами, на основе которой выделяют 3 базовых вида кластеризации: soft, middle и hard. О видах кластеризации мы еще поговорим в следующих записях этого дневника

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

В этой статье мы расскажем о том, как правильно создавать семантическое ядро сайта. А также вы узнаете о том, что это такое и для чего его делают. На самом деле в понятии семантического ядра нет ничего сложного и трудного. Давайте разбираться.

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

Если капнуть в термин глубже, то семантика - это наука, которая занимается смысловым наполнением лексических единиц. Говоря простыми словами, семантика изучает смысл чего-либо. В SEO семантическое ядро даёт понять смысл всего сайта, его какого-либо раздела или отдельной взятой статьи. Это становится понятно поисковику, посетителю, всем разработчикам, которые будут работать с сайтом.

Семантическое ядро без преувеличения - это фундамент всего продвижения.

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

Функциями семантического ядра можно назвать следующие аспекты продвижения сайта:

  • Самая главная задача семантического ядра - это понимание структуры сайта и его наполненности. Глядя на него, можно представить себе, какие разделы у сайта будут, и какие статьи будут в каждом разделе. И, таким образом, все недостатки и неудобства структуры сразу видны, и их можно устранить ещё на раннем этапе.
  • Семантика задаёт вектор контента. Благодаря лучшему понимаю структуры сайта, можно подобрать наиболее релевантные и эффективные ключевые фразы.
  • Семантическое ядро - это контент-план сайта на долгие годы вперёд. Каждый раз, когда нужно написать статьи, можно заглянуть туда и увидеть, какой контент планировался и в каком разделе сайта он должен быть.
  • Если планируется платное продвижение сайта, например, за счёт контекстной рекламы, то благодаря семантическому ядру можно рассчитать стоимость продвижения.

Как сделать семантическое ядро

Для начала надо определиться, откуда вы будете брать ключевые фразы для ядра. Наиболее лучший для новичков источник - это сервис Яндекс WordPStat, который показывает то, сколько раз в месяц вводился тот или иной запрос в поиск Яндекс. У WordStat есть разнообразные полезные функции, например можно фильтровать запросы по регионам или устройствам, смотреть похожие запросы и многое другое. А самое главное, что он абсолютно бесплатный. Подробнее об этом .

Можно использовать и разнообразные платные программы, но новичкам лучше подойдёт именно WordStat, в виду его простоты. Кроме этого, он подойдёт не только для Рунета, где Яндекс преобладает. Если вы продвигаете сайт в пределах СНГ, то его можно смело использовать, и статистка по Google будет примерно такая же.

Основная суть создания семантического ядра - это сбор ключевых фраз, которые так или иначе подходят под тематику сайта. Их надо их как-то оформить, систематизировать. Для этого лучше всего подходят таблицы, например Excel, таблицы в Google Doc или аналогичные.

И для большей эффективности, в таблице семантического ядра можно добавить дополнительные графы:

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

Частые ошибки при создании семантического ядра

Теперь вы знаете, как правильно создать семантическое ядро сайта. Давайте рассмотрим напоследок, какие частые ошибки бывают у начинающих оптимизаторов.

  • Если ядро предусматривает разделение сайта на рубрики, то частой ошибки является создание глубоких уровней вложенности. Рекомендуется второй уровень и не далее. То есть, можно сделать рубрику, подрубрику и всё, дальше делить на более мелкие рубрики уже нельзя.
  • Новички могут игнорировать низкочастотные запросы, так как считают, что использовать их нецелесообразно, всё равно они не принесут много трафика. Но на самом деле всё наоборот. Для нового сайта нужны именно низкочастотные, никзоконкурентные запросы.
  • Нельзя полностью доверять сервису, с помощью которого будут добываться ключевые фразы. А новички поступают именно так. Машины могут ошибаться и выбрать вам не то, что нужно.
  • Не нужно создавать статью ради ключевой фразы. Если вы нашли фразы “срочно продать дом” и “продать дом быстро”, то нет смысла делать для них две разные статьи.

Семантическое ядро — это страшное название, которое придумали SEOшники для обозначения довольно простой вещи. Нам надо просто подобрать ключевые запросы, по которым мы будем продвигать наш сайт.

И в этой статье я покажу вам, как правильно составить семантическое ядро, чтобы ваш сайт побыстрее вышел в ТОП, а не топтался месяцами на месте. Тут тоже есть свои «секретики».

И прежде чем мы перейдем к составлению СЯ, давайте разберем, что это такое, и к чему мы в итоге должны прийти.

Что такое семантическое ядро простыми словами

Как это ни странно, но семантическое ядро — это обычный excel файл, в котором списком представлены ключевые запросы, по которым вы (или ваш копирайтер) будете писать статьи для сайта.

Вот как, например, выглядит мое семантическое ядро:

Зеленым цветом у меня помечены те ключевые запросы, по которым я уже написал статьи. Желтым — те, которым статьи собираюсь написать в ближайшее время. А бесцветные ячейки — это значит, что до этих запросов дело дойдет немного позже.

Для каждого ключевого запроса у меня определена частотность, конкурентность, и придуман «цепляющий» заголовок. Вот примерно такой же файл должен получиться и у вас. Сейчас у меня СЯ состоит из 150 ключевиков. Это значит, что я обеспечен «материалом» минимум на 5 месяцев вперед (если даже буду писать по одной статье в день).

Чуть ниже мы поговорим о том, к чему вам готовиться, если вы вдруг решите заказать сбор семантического ядра у специалистов. Здесь скажу кратко — вам дадут такой же список, но только на тысячи «ключей». Однако, в СЯ важно не количество, а качество. И мы с вами будем ориентироваться именно на это.

Зачем вообще нужно семантическое ядро?

А в самом деле, зачем нам эти мучения? Можно же, в конце концов, просто так писать качественные статьи, и привлекать этим аудиторию, правильно? Да, писать можно, а вот привлекать не получится.

Главная ошибка 90% блогеров — это как раз написание просто качественных статей. Я не шучу, у них реально интересные и полезные материалы. Вот только поисковые системы об этом не знают. Они же не экстрасенсы, а всего лишь роботы. Соответственно они и не ставят вашу статью в ТОП.

Здесь есть еще один тонкий момент с заголовком. Например, у вас есть очень качественная статья на тему «Как правильно вести бизнес в «мордокниге». Там вы очень подробно и профессионально расписываете все про фейсбук. В том числе и то, как там продвигать сообщества. Ваша статья — самая качественная, полезная и интересная в интернете на эту тему. Никто и рядом с вами не валялся. Но вам это все равно не поможет.

Почему качественные статьи вылетают из ТОПа

Представьте, что на ваш сайт зашел не робот, а живой проверяльщик (асессор) с Яндекса. Он понял, что у вас самая классная статья. И рукам поставил вас на первое место в выдаче по запросу «Продвижение сообщества в фейсбук».

Знаете, что произойдет дальше? Вы оттуда все равно очень скоро вылетите. Потому что по вашей статье, даже на первом месте, никто не будет кликать. Люди вводят запрос «Продвижение сообщества в фейсбук», а у вас заголовок — «Как правильно вести бизнес в «мордокниге». Оригинально, свежо, забавно, но… не под запрос. Люди хотят видеть именно то, что они искали, а не ваш креатив.

Соответственно, ваша статья будет вхолостую занимать место в ТОП выдачи. И живой асессор, горячий поклонник вашего творчества, может сколько угодно умолять начальство оставить вас хотя бы в ТОП-10. Но не поможет. Все первые места займут пустые, как шелуха от семечек, статейки, которые друг у друга переписали вчерашние школьники.

Зато у этих статей будет правильный «релевантный» заголовок — «Продвижение сообщества в фейсбук с нуля» (по шагам, за 5 шагов, от А до Я, бесплатно и пр.) Обидно? Еще бы. Ну так боритесь против несправедливости. Давайте составим грамотное семантическое ядро, чтобы ваши статьи занимали заслуженные первые места.

Еще одна причина начать составлять СЯ прямо сейчас

Есть еще одна вещь, о которой почему-то люди мало задумываются. Вам надо писать статьи часто — как минимум каждую неделю, а лучше 2-3 раза в неделю, чтобы набрать побольше трафика и побыстрее.

Все это знают, но почти никто этого не делает. А все потому, что у них «творческий застой», «никак не могут себя заставить», «просто лень». А на самом деле вся проблема именно в отсутствие конкретного семантического ядра.

Я ввел в поле поиска один из своих базовых ключей — «smm», и Яндекс тут же выдал мне с десяток подсказок, что еще может быть интересно людям, которым интересно «smm». Мне остается только скопировать эти ключи в блокнотик. Потом я точно так же проверю каждый из них, и соберу подсказки еще и по ним.

После первого этапа сбора СЯ у вас должен получиться текстовый документ, в котором будет 10-30 широких базовых ключей, с которыми мы и будем работать дальше.

Шаг #2 — Парсинг базовых ключей в SlovoEB

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

Я использую KeyCollector, но он платный. Вы можете воспользоваться бесплатным аналогом — программой SlovoEB. Скачать её вы можете с официального сайта.

Самое сложное в работе с этой программой — это её правильно настроить. Как правильно настроить и использовать Словоеб я показываю . Но в той статье я упор делаю на подбор ключей для Яндекс-Директа.

А тут давайте по шагам посмотрим особенности использования это программы для составления семантического ядра под SEO.

Сначала создаем новый проект, и называем его по тому широкому ключу, который хотите парсить.

Я обычно даю такое же название проекту, как и мой базовый ключ, чтобы потом не запутаться. И да, предупрежу вас еще от одной ошибки. Не пытайтесь парсить все базовые ключи одновременно. Вам потом будет очень сложно отфильтровать «пустые» ключевые запросы от золотых крупиц. Давайте парсить по одному ключу.

После создания проекта — проводим базовую операцию. То есть мы собственно парсим ключ через Яндекс Вордстат. Для этого нажмите на кнопку «Ворстат» в интерфейсе программы, впишите ваш базовый ключ, и нажмите «Начать сбор».

Для примера, давайте распарсим базовый ключ для моего блога «контекстная реклама».

После этого запустится процесс, и через некоторое время программа нам выдаст результат — до 2000 ключевых запросов, в которых содержится «контекстная реклама».

Так же рядом с каждым запросом будет стоять «грязная» частотность — сколько раз этот ключ (+ его словоформы и хвосты) искали в месяц через яндекс. Но не советую делать никаких выводов из этих цифр.

Шаг #3 — Сбор точной частотности для ключей

Грязная частотность нам ничего не покажет. Если вы будете на неё ориентироваться, то не удивляйтесь потом, когда ваш ключ на 1000 запросов не приносит ни одного клика в месяц.

Нам надо выявить чистую частотность. И для этого мы сначала выделяем все найденные ключи галочками, а потом нажимаем на кнопочку «Яндекс Директ» и снова запускаем процесс. Теперь Словоеб будет нам искать точную частоту запроса в месяц для каждого ключа.

Теперь у нас есть объективная картина — сколько раз какой запрос вводили пользователи интернета за последний месяц. Предлагаю теперь сгруппировать все ключевые запросы по частотности, чтобы с ними было удобнее работать.

Для этого нажимаем на значок «фильтр» в столбце «Частота «!» », и указываем — отфильтровать ключи со значением «меньше или равно 10».

Теперь программа покажет вам только те запросы, частотность которых меньше или равна значению «10». Эти запросы вы можете удалить или скопировать на будущее в другую группу ключевых запросов. Меньше 10 — это очень мало. Писать статьи под эти запросы — пустая трата времени.

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

Шаг #4 — Проверка конкурентности запросов

Все «ключи» в этом мире делятся на 3 типа: высокочастотные (ВЧ), среднечастотные (СЧ), низкочастотные (НЧ). А еще они могут быть выосококонкурнетными (ВК), среднеконкурентными (СК) и низкоконкурентными (НК).

Как правило, ВЧ запросы являются одновременно и ВК. То есть если запрос часто ищут в интернете, то и сайтов, которые хотят по нему продвигаться — очень много. Но это не всегда так, бывают счастливые исключения.

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

Можно ориентироваться на такие показатели, как количество главных страниц в ТОП-10, длина и качество текстов. уровень траста и тиц сайтов в ТОП выдачи по запросу. Все это даст вам некоторое представление о том, насколько жесткая борьба за позиции для этого конкретного запроса.

Но я рекомендую вам воспользоваться сервисом Мутаген . Он учитывает все парметры, о которых я сказал выше, плюс еще с десяток, о которых ни вы, ни я наверное даже не слышали. После анализа сервис выдает точное значение — какой уровень конкуренции у данного запроса.

Здесь я проверил запрос «настройка контекстной рекламы в google adwords». Мутаген показал нам, что у этого ключа конкурентность «более 25» — это максимальное значение, которое он показывает. А просмотров у этого запроса всего 11 в месяц. Значит нам он точно не подходит.

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

Мутаген — это платный сервис. Но 10 проверок в сутки вы можете сделать бесплатно. Кроме того, стоимость проверки очень низкая. За все время работы с ним я еще не истратил и 300 рублей.

Кстати, на счет уровня конкуренции. Если у вас молодой сайт, то лучше выбирать запросы с уровнем конкуренции 3-5. А если вы раскручиваетесь уже более года, то можно брать и 10-15.

Кстати, на счет частотности запросов. Нам сейчас надо сделать заключительный шаг, который позволит вам привлекать достаточно много трафика даже по низкочастотным запросам.

Шаг #5 — Сбор «хвостов» для выбранных ключей

Как уже много раз было доказано и проверено, основной объем трафика ваш сайт будет получать не от основных ключей, а от так называемых «хвостов». Это когда человек вводит в поисковую строку странные ключевые запросы, с частотностью 1-2 в месяц, но таких запросов очень много.

Чтобы увидеть «хвост» — просто зайдите в Яндекс и введите выбранный вами ключевой запрос в строку поиска. Вот что вы примерно увидите.

Теперь вам надо просто выписать эти дополнительные слова в отдельный документ, и использовать их в своей статье. При чем не надо ставить их всегда рядом с основным ключом. Иначе поисковые системы увидят «переоптимизацию» и ваши статьи упадут в выдаче.

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

Например, у нас есть запрос — «Настройка контекстной рекламы». Вот как можно его переформулировать:

  • Настройка = настроить, сделать, создать, запустить, запуск, включить, разместить…
  • Контекстная реклама = контекст, директ, тизер, РСЯ, адвордс, кмс. direct, adwords…

Никогда не знаешь, как именно люди будут искать информацию. Добавьте все эти дополнительные слова к себе в семантическое ядро, и используйте при написании текстов.

Вот так, мы собираем список из 100 — 150 ключевых запросов. Если вы составляете семантическое ядро впервые, то у вас может уйти на это несколько недель.

А может ну его, глаза ломать? Может есть возможность делегировать составления СЯ специалистам, которые сделают это лучше и быстрее? Да, такие специалисты есть, но пользоваться их услугами нужно не всегда.

Стоит ли заказывать СЯ у специалистов?

По большому счету специалисты по составлению семантического ядра сделают вам только шаги 1 — 3 из нашей схемы. Иногда, за большую дополнительную плату, сделают и шаги 4-5 — (сбор хвостов и проверку конкурентности запросов).

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

И вопрос тут в том, собираетесь ли вы писать статьи самостоятельно, или наймете для этого копирайтеров. Если вы хотите делать упор на качество, а не на количество — то надо писать самим. Но тогда вам будет недостаточно просто получить список ключей. Вам надо будет выбрать те темы, в которых вы разбираетесь достаточно хорошо, чтобы написать качественную статью.

И вот тут встает вопрос — а зачем тогда собственно нужны специалисты по СЯ? Согласитесь, распарсить базовый ключ и собрать точные частотности (шаги #1-3) — это совсем не сложно. У вас уйдет на это буквально полчаса времени.

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

Когда услуги специалистов по СЯ полезны

Другое дело, если вы изначально планируете привлекать копирайтеров. Тогда вам необязательно разбираться в теме запроса. Копирайтеры ваши тоже не будут в ней разбираться. Они просто возьмут несколько статей по этой теме, и скомпилируют из них «свой» текст.

Такие статьи будут пустыми, убогими, почти бесполезными. Но их будет много. Самостоятельно вы сможете писать максимум 2-3 качественные статьи в неделю. А армия копирайтеров обеспечит вам 2-3 говнотекста в день. При этом они будут оптимизированы под запросы, а значит будут привлекать какой-то трафик.

В этом случае — да, спокойно нанимайте специалистов по СЯ. Пусть они вам еще и ТЗ для копирайтеров составят заодно. Но сами понимаете, это тоже будет стоить отдельных денег.

Резюме

Давайте еще раз пробежимся по основным мыслям в статье для закрепления информации.

  • Семантическое ядро — это просто список ключевых запросов, под которые вы будете писать статьи на сайт для продвижения.
  • Необходимо оптимизировать тексты под точные ключевые запросы, иначе ваши даже самые качественные статьи никогда не выйдут в ТОП.
  • СЯ — это как контент-план для социальных сетей. Он помогает вам не впадать в «творческий кризис», и всегда точно знать, о чем вы будете писать завтра, послезавтра и через месяц.
  • Для составления семантического ядра удобно использовать бесплатную программу Словоеб, надо только её .
  • Вот пять шагов составления СЯ: 1 — Подбор базовых ключей; 2 — Парсинг базовых ключей; 3 — Сбор точной частотности для запросов; 4 — Проверка конкурентости ключей; 5 — Сбор «хвостов».
  • Если вы хотите сами писать статьи, то лучше сделайте семантическое ядро самостоятельно, под себя. Специалисты по составлению СЯ не смогут здесь вам помочь.
  • Если вы хотите работать на количество и использовать копирайтеров для написания статей, то вполне можно привлечь делегировать и составления семантического ядра. Лишь бы на все хватило денег.

Надеюсь, эта инструкция была вам полезна. Сохраняйте её в избранное, чтобы не потерять, и поделитесь с друзьями. Не забудьте скачать мою книгу . Там я показываю вам самый быстрый путь с нуля до первого миллиона в интернете (выжимка из личного опыта за 10 лет =)

До скорого!

Ваш Дмитрий Новосёлов

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


Привет, мир!

Давай напишем ядро, которое будет загружаться через GRUB на системах, совместимых с x86. Наше первое ядро будет показывать сообщение на экране и на этом останавливаться.

Как загружаются x86-машины

Прежде чем думать о том, как писать ядро, давай посмотрим, как компьютер загружается и передает управление ядру. Большинство регистров процессора x86 имеют определенные значения после загрузки. Регистр - указатель на инструкцию (EIP) содержит адрес инструкции, которая будет исполнена процессором. Его захардкоженное значение - это 0xFFFFFFF0. То есть x86-й процессор всегда будет начинать исполнение с физического адреса 0xFFFFFFF0. Это последние 16 байт 32-разрядного адресного пространства. Этот адрес называется «вектор сброса» (reset vector).

В карте памяти, которая содержится в чипсете, прописано, что адрес 0xFFFFFFF0 ссылается на определенную часть BIOS, а не на оперативную память. Однако BIOS копирует себя в оперативку для более быстрого доступа - этот процесс называется «шедоуинг» (shadowing), создание теневой копии. Так что адрес 0xFFFFFFF0 будет содержать только инструкцию перехода к тому месту в памяти, куда BIOS скопировала себя.

Итак, BIOS начинает исполняться. Сначала она ищет устройства, с которых можно загружаться в том порядке, который задан в настройках. Она проверяет носители на наличие «волшебного числа», которое отличает загрузочные диски от обычных: если байты 511 и 512 в первом секторе равны 0xAA55, значит, диск загрузочный.

Как только BIOS найдет загрузочное устройство, она скопирует содержимое первого сектора в оперативную память, начиная с адреса 0x7C00, а затем переведет исполнение на этот адрес и начнет исполнение того кода, который только что загрузила. Вот этот код и называется загрузчиком (bootloader).

Загрузчик загружает ядро по физическому адресу 0x100000. Именно он и используется большинством популярных ядер для x86.

Все процессоры, совместимые с x86, начинают свою работу в примитивном 16-разрядном режиме, которые называют «реальным режимом» (real mode). Загрузчик GRUB переключает процессор в 32-разрядный защищенный режим (protected mode), переводя нижний бит регистра CR0 в единицу. Поэтому ядро начинает загружаться уже в 32-битном защищенном режиме.

Заметь, что GRUB в случае с ядрами Linux выбирает соответствующий протокол загрузки и загружает ядро в реальном режиме. Ядра Linux сами переключаются в защищенный режим.

Что нам понадобится

  • Компьютер, совместимый с x86 (очевидно),
  • Linux,
  • ассемблер NASM,
  • ld (GNU Linker),
  • GRUB.

Входная точка на ассемблере

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

Как сделать так, чтобы ассемблерный код стал стартовой точкой для нашего ядра? Мы используем скрипт для компоновщика (linker), который линкует объектные файлы и создает финальный исполняемый файл ядра (подробнее объясню чуть ниже). В этом скрипте мы напрямую укажем, что хотим, чтобы наш бинарный файл загружался по адресу 0x100000. Это адрес, как я уже писал, по которому загрузчик ожидает увидеть входную точку в ядро.

Вот код на ассемблере.

kernel.asm
bits 32 section .text global start extern kmain start: cli mov esp, stack_space call kmain hlt section .bss resb 8192 stack_space:

Первая инструкция bits 32 - это не ассемблер x86, а директива NASM, сообщающая, что нужно генерировать код для процессора, который будет работать в 32-разрядном режиме. Для нашего примера это не обязательно, но указывать это явно - хорошая практика.

Вторая строка начинает текстовую секцию, также известную как секция кода. Сюда пойдет весь наш код.

global - это еще одна директива NASM, она объявляет символы из нашего кода глобальными. Это позволит компоновщику найти символ start , который и служит нашей точкой входа.

kmain - это функция, которая будет определена в нашем файле kernel.c . extern объявляет, что функция декларирована где-то еще.

Далее идет функция start , которая вызывает kmain и останавливает процессор инструкцией hlt . Прерывания могут будить процессор после hlt , так что сначала мы отключаем прерывания инструкцией cli (clear interrupts).

В идеале мы должны выделить какое-то количество памяти под стек и направить на нее указатель стека (esp). GRUB, кажется, это и так делает за нас, и на этот момент указатель стека уже задан. Однако на всякий случай выделим немного памяти в секции BSS и направим указатель стека на ее начало. Мы используем инструкцию resb - она резервирует память, заданную в байтах. Затем оставляется метка, указывающая на край зарезервированного куска памяти. Прямо перед вызовом kmain указатель стека (esp) направляется на эту область инструкцией mov .

Ядро на C

В файле kernel.asm мы вызвали функцию kmain() . Так что в коде на C исполнение начнется с нее.

kernel.c
void kmain(void) { const char *str = "my first kernel"; char *vidptr = (char*)0xb8000; unsigned int i = 0; unsigned int j = 0; while(j < 80 * 25 * 2) { vidptr[j] = " "; vidptr = 0x07; j = j + 2; } j = 0; while(str[j] != "\0") { vidptr[i] = str[j]; vidptr = 0x07; ++j; i = i + 2; } return; }

Все, что будет делать наше ядро, - очищать экран и выводить строку my first kernel.

Первым делом мы создаем указатель vidptr, который указывает на адрес 0xb8000. В защищенном режиме это начало видеопамяти. Текстовая экранная память - это просто часть адресного пространства. Под экранный ввод-вывод выделен участок памяти, который начинается с адреса 0xb8000, - в него помещается 25 строк по 80 символов ASCII.

Каждый символ в текстовой памяти представлен 16 битами (2 байта), а не 8 битами (1 байтом), к которым мы привыкли. Первый байт - это код символа в ASCII, а второй байт - это attribute-byte . Это определение формата символа, в том числе - его цвет.

Чтобы вывести символ s зеленым по черному, нам нужно поместить s в первый байт видеопамяти, а значение 0x02 - во второй байт. 0 здесь означает черный фон, а 2 - зеленый цвет. Мы будем использовать светло-серый цвет, его код - 0x07.

В первом цикле while программа заполняет пустыми символами с атрибутом 0x07 все 25 строк по 80 символов. Это очистит экран.

Во втором цикле while символы строки my first kernel, оканчивающейся нулевым символом, записываются в видеопамять и каждый символ получает attribute-byte, равный 0x07. Это должно привести к выводу строки.

Компоновка

Теперь мы должны собрать kernel.asm в объектный файл с помощью NASM, а затем при помощи GCC скомпилировать kernel.c в другой объектный файл. Наша задача - слинковать эти объекты в исполняемое ядро, пригодное к загрузке. Для этого потребуется написать для компоновщика (ld) скрипт, который мы будем передавать в качестве аргумента.

link.ld
OUTPUT_FORMAT(elf32-i386) ENTRY(start) SECTIONS { . = 0x100000; .text: { *(.text) } .data: { *(.data) } .bss: { *(.bss) } }

Здесь мы сначала задаем формат (OUTPUT_FORMAT) нашего исполняемого файла как 32-битный ELF (Executable and Linkable Format), стандартный бинарный формат для Unix-образных систем для архитектуры x86.

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

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

В фигурных скобках, которые идут за выражением SECTIONS , точка означает счетчик позиции (location counter). Он автоматически инициализируется значением 0x0 в начале блока SECTIONS , но его можно менять, назначая новое значение.

Ранее я уже писал, что код ядра должен начинаться по адресу 0x100000. Именно поэтому мы и присваиваем счетчику позиции значение 0x100000.

Взгляни на строку.text: { *(.text) } . Звездочкой здесь задается маска, под которую подходит любое название файла. Соответственно, выражение *(.text) означает все входные секции.text во всех входных файлах.

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

После того как компоновщик выдаст текстовую секцию, значение счетчика позиции будет 0x100000 плюс размер текстовой секции. Точно так же секции data и bss будут слиты и помещены по адресу, который задан счетчиком позиции.

GRUB и мультизагрузка

Теперь все наши файлы готовы к сборке ядра. Но поскольку мы будем загружать ядро при помощи GRUB , остается еще один шаг.

Существует стандарт для загрузки разных ядер x86 с помощью бутлоадера. Это называется «спецификация мультибута ». GRUB будет загружать только те ядра, которые ей соответствуют.

В соответствии с этой спецификацией ядро может содержать заголовок (Multiboot header) в первых 8 килобайтах. В этом заголовке должно быть прописано три поля:

  • magic - содержит «волшебное» число 0x1BADB002, по которому идентифицируется заголовок;
  • flags - это поле для нас не важно, можно оставить ноль;
  • checksum - контрольная сумма, должна дать ноль, если прибавить ее к полям magic и flags .

Наш файл kernel.asm теперь будет выглядеть следующим образом.

kernel.asm
bits 32 section .text ;multiboot spec align 4 dd 0x1BADB002 ;magic dd 0x00 ;flags dd - (0x1BADB002 + 0x00) ;checksum global start extern kmain start: cli mov esp, stack_space call kmain hlt section .bss resb 8192 stack_space:

Инструкция dd задает двойное слово размером 4 байта.

Собираем ядро

Итак, все готово для того, чтобы создать объектный файл из kernel.asm и kernel.c и слинковать их с применением нашего скрипта. Пишем в консоли:

$ nasm -f elf32 kernel.asm -o kasm.o

По этой команде ассемблер создаст файл kasm.o в формате ELF-32 bit. Теперь настал черед GCC:

$ gcc -m32 -c kernel.c -o kc.o

Параметр -c указывает на то, что файл после компиляции не нужно линковать. Мы это сделаем сами:

$ ld -m elf_i386 -T link.ld -o kernel kasm.o kc.o

Эта команда запустит компоновщик с нашим скриптом и сгенерирует исполняемый файл под названием kernel .

WARNING

Хакингом ядра лучше всего заниматься в виртуалке. Чтобы запустить ядро в QEMU вместо GRUB, используй команду qemu-system-i386 -kernel kernel .

Настраиваем GRUB и запускаем ядро

GRUB требует, чтобы название файла с ядром следовало конвенции kernel-<версия> . Так что переименовываем файл - я назову свой kernel-701 .

Теперь кладем ядро в каталог /boot . На это понадобятся привилегии суперпользователя.

В конфигурационный файл GRUB grub.cfg нужно будет добавить что-то в таком роде:

Title myKernel root (hd0,0) kernel /boot/kernel-701 ro

Не забудь убрать директиву hiddenmenu, если она прописана.

GRUB 2

Чтобы запустить созданное нами ядро в GRUB 2, который по умолчанию поставляется в новых дистрибутивах, твой конфиг должен выглядеть следующим образом:

Menuentry "kernel 701" { set root="hd0,msdos1" multiboot /boot/kernel-701 ro }

Благодарю Рубена Лагуану за это дополнение.

Перезагружай компьютер, и ты должен будешь увидеть свое ядро в списке! А выбрав его, ты увидишь ту самую строку.



Это и есть твое ядро!

Пишем ядро с поддержкой клавиатуры и экрана

Мы закончили работу над минимальным ядром, которое загружается через GRUB, работает в защищенном режиме и выводит на экран одну строку. Настала пора расширить его и добавить драйвер клавиатуры, который будет читать символы с клавиатуры и выводить их на экран.

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

Работа с портами: чтение и вывод

read_port: mov edx, in al, dx ret write_port: mov edx, mov al, out dx, al ret

Доступ к портам ввода-вывода осуществляется при помощи инструкций in и out , входящих в набор x86.

В read_port номер порта передается в качестве аргумента. Когда компилятор вызывает функцию, он кладет все аргументы в стек. Аргумент копируется в регистр edx при помощи указателя на стек. Регистр dx - это нижние 16 бит регистра edx . Инструкция in здесь читает порт, номер которого задан в dx , и кладет результат в al . Регистр al - это нижние 8 бит регистра eax . Возможно, ты помнишь из институтского курса, что значения, возвращаемые функциями, передаются через регистр eax . Таким образом, read_port позволяет нам читать из портов ввода-вывода.

Функция write_port работает схожим образом. Мы принимаем два аргумента: номер порта и данные, которые будут записаны. Инструкция out пишет данные в порт.

Прерывания

Теперь, прежде чем мы вернемся к написанию драйвера, нам нужно понять, как процессор узнает, что какое-то из устройств выполнило операцию.

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

За прерывания в архитектуре x86 отвечает чип под названием Programmable Interrupt Controller (PIC). Он обрабатывает хардверные прерывания и направляет и превращает их в соответствующие системные прерывания.

Когда пользователь что-то делает с устройством, чипу PIC отправляется импульс, называемый запросом на прерывание (Interrupt Request, IRQ). PIC переводит полученное прерывание в системное прерывание и отправляет процессору сообщение о том, что пора остановить то, что он делает. Дальнейшая обработка прерываний - это задача ядра.

Без PIC нам бы пришлось опрашивать все устройства, присутствующие в системе, чтобы посмотреть, не произошло ли событие с участием какого-то из них.

Давай разберем, как это работает в случае с клавиатурой. Клавиатура висит на портах 0x60 и 0x64. Порт 0x60 отдает данные (когда нажата какая-то кнопка), а порт 0x64 передает статус. Однако нам нужно знать, когда конкретно читать эти порты.

Прерывания здесь приходятся как нельзя более кстати. Когда кнопка нажата, клавиатура отправляет PIC сигнал по линии прерываний IRQ1. PIС хранит значение offset , сохраненное во время его инициализации. Он добавляет номер входной линии к этому отступу, чтобы сформировать вектор прерывания. Затем процессор ищет структуру данных, называемую «таблица векторов прерываний» (Interrupt Descriptor Table, IDT), чтобы дать функции - обработчику прерывания адрес, соответствующий его номеру.

Затем код по этому адресу исполняется и обрабатывает прерывание.

Задаем IDT

struct IDT_entry{ unsigned short int offset_lowerbits; unsigned short int selector; unsigned char zero; unsigned char type_attr; unsigned short int offset_higherbits; }; struct IDT_entry IDT; void idt_init(void) { unsigned long keyboard_address; unsigned long idt_address; unsigned long idt_ptr; keyboard_address = (unsigned long)keyboard_handler; IDT.offset_lowerbits = keyboard_address & 0xffff; IDT.selector = 0x08; /* KERNEL_CODE_SEGMENT_OFFSET */ IDT.zero = 0; IDT.type_attr = 0x8e; /* INTERRUPT_GATE */ IDT.offset_higherbits = (keyboard_address & 0xffff0000) >> 16; write_port(0x20 , 0x11); write_port(0xA0 , 0x11); write_port(0x21 , 0x20); write_port(0xA1 , 0x28); write_port(0x21 , 0x00); write_port(0xA1 , 0x00); write_port(0x21 , 0x01); write_port(0xA1 , 0x01); write_port(0x21 , 0xff); write_port(0xA1 , 0xff); idt_address = (unsigned long)IDT ; idt_ptr = (sizeof (struct IDT_entry) * IDT_SIZE) + ((idt_address & 0xffff) << 16); idt_ptr = idt_address >> 16 ; load_idt(idt_ptr); }

IDT - это массив, объединяющий структуры IDT_entry. Мы еще обсудим привязку клавиатурного прерывания к обработчику, а сейчас посмотрим, как работает PIC.

Современные системы x86 имеют два чипа PIC, у каждого восемь входных линий. Будем называть их PIC1 и PIC2. PIC1 получает от IRQ0 до IRQ7, а PIC2 - от IRQ8 до IRQ15. PIC1 использует порт 0x20 для команд и 0x21 для данных, а PIC2 - порт 0xA0 для команд и 0xA1 для данных.

Оба PIC инициализируются восьмибитными словами, которые называются «командные слова инициализации» (Initialization command words, ICW).

В защищенном режиме обоим PIC первым делом нужно отдать команду инициализации ICW1 (0x11). Она сообщает PIC, что нужно ждать еще трех инициализационных слов, которые придут на порт данных.

Эти команды передадут PIC:

  • вектор отступа (ICW2),
  • какие между PIC отношения master/slave (ICW3),
  • дополнительную информацию об окружении (ICW4).

Вторая команда инициализации (ICW2) тоже шлется на вход каждого PIC. Она назначает offset , то есть значение, к которому мы добавляем номер линии, чтобы получить номер прерывания.

PIC разрешают каскадное перенаправление их выводов на вводы друг друга. Это делается при помощи ICW3, и каждый бит представляет каскадный статус для соответствующего IRQ. Сейчас мы не будем использовать каскадное перенаправление и выставим нули.

ICW4 задает дополнительные параметры окружения. Нам нужно определить только нижний бит, чтобы PIC знали, что мы работаем в режиме 80×86.

Та-дам! Теперь PIC проинициализированы.

У каждого PIC есть внутренний восьмибитный регистр, который называется «регистр масок прерываний» (Interrupt Mask Register, IMR). В нем хранится битовая карта линий IRQ, которые идут в PIC. Если бит задан, PIC игнорирует запрос. Это значит, что мы можем включить или выключить определенную линию IRQ, выставив соответствующее значение в 0 или 1.

Чтение из порта данных возвращает значение в регистре IMR, а запись - меняет регистр. В нашем коде после инициализации PIC мы выставляем все биты в единицу, чем деактивируем все линии IRQ. Позднее мы активируем линии, которые соответствуют клавиатурным прерываниям. Но для начала все же выключим!

Если линии IRQ работают, наши PIC могут получать сигналы по IRQ и преобразовывать их в номер прерывания, добавляя офсет. Нам же нужно заполнить IDT таким образом, чтобы номер прерывания, пришедшего с клавиатуры, соответствовал адресу функции-обработчика, которую мы напишем.

На какой номер прерывания нам нужно завязать в IDT обработчик клавиатуры?

Клавиатура использует IRQ1. Это входная линия 1, ее обрабатывает PIC1. Мы проинициализировали PIC1 с офсетом 0x20 (см. ICW2). Чтобы получить номер прерывания, нужно сложить 1 и 0x20, получится 0x21. Значит, адрес обработчика клавиатуры будет завязан в IDT на прерывание 0x21.

Задача сводится к тому, чтобы заполнить IDT для прерывания 0x21. Мы замапим это прерывание на функцию keyboard_handler , которую напишем в ассемблерном файле.

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

В записи IDT нам осталось прописать тип, обозначив таким образом, что все это делается, чтобы отловить прерывание. Еще нам нужно задать офсет сегмента кода ядра. GRUB задает GDT за нас. Каждая запись GDT имеет длину 8 байт, где дескриптор кода ядра - это второй сегмент, так что его офсет составит 0x08 (подробности не влезут в эту статью). Гейт прерывания представлен как 0x8e. Оставшиеся в середине 8 бит заполняем нулями. Таким образом, мы заполним запись IDT, которая соответствует клавиатурному прерыванию.

Когда с маппингом IDT будет покончено, нам надо будет сообщить процессору, где находится IDT. Для этого существует ассемблерная инструкция lidt, она принимает один операнд. Им служит указатель на дескриптор структуры, которая описывает IDT.

С дескриптором никаких сложностей. Он содержит размер IDT в байтах и его адрес. Я использовал массив, чтобы вышло компактнее. Точно так же можно заполнить дескриптор при помощи структуры.

В переменной idr_ptr у нас есть указатель, который мы передаем инструкции lidt в функции load_idt() .

Load_idt: mov edx, lidt sti ret

Дополнительно функция load_idt() возвращает прерывание при использовании инструкции sti .

Заполнив и загрузив IDT, мы можем обратиться к IRQ клавиатуры, используя маску прерывания, о которой мы говорили ранее.

Void kb_init(void) { write_port(0x21 , 0xFD); }

0xFD - это 11111101 - включаем только IRQ1 (клавиатуру).

Функция - обработчик прерывания клавиатуры

Итак, мы успешно привязали прерывания клавиатуры к функции keyboard_handler , создав запись IDT для прерывания 0x21. Эта функция будет вызываться каждый раз, когда ты нажимаешь на какую-нибудь кнопку.

Keyboard_handler: call keyboard_handler_main iretd

Эта функция вызывает другую функцию, написанную на C, и возвращает управление при помощи инструкций класса iret. Мы могли бы тут написать весь наш обработчик, но на C кодить значительно легче, так что перекатываемся туда. Инструкции iret/iretd нужно использовать вместо ret , когда управление возвращается из функции, обрабатывающей прерывание, в программу, выполнение которой было им прервано. Этот класс инструкций поднимает флаговый регистр, который попадает в стек при вызове прерывания.

Void keyboard_handler_main(void) { unsigned char status; char keycode; /* Пишем EOI */ write_port(0x20, 0x20); status = read_port(KEYBOARD_STATUS_PORT); /* Нижний бит статуса будет выставлен, если буфер не пуст */ if (status & 0x01) { keycode = read_port(KEYBOARD_DATA_PORT); if(keycode < 0) return; vidptr = keyboard_map; vidptr = 0x07; } }

Здесь мы сначала даем сигнал EOI (End Of Interrupt, окончание обработки прерывания), записав его в командный порт PIC. Только после этого PIC разрешит дальнейшие запросы на прерывание. Нам нужно читать два порта: порт данных 0x60 и порт команд (он же status port) 0x64.

Первым делом читаем порт 0x64, чтобы получить статус. Если нижний бит статуса - это ноль, значит, буфер пуст и данных для чтения нет. В других случаях мы можем читать порт данных 0x60. Он будет выдавать нам код нажатой клавиши. Каждый код соответствует одной кнопке. Мы используем простой массив символов, заданный в файле keyboard_map.h , чтобы привязать коды к соответствующим символам. Затем символ выводится на экран при помощи той же техники, что мы применяли в первой версии ядра.

Чтобы не усложнять код, я здесь обрабатываю только строчные буквы от a до z и цифры от 0 до 9. Ты с легкостью можешь добавить спецсимволы, Alt, Shift и Caps Lock. Узнать, что клавиша была нажата или отпущена, можно из вывода командного порта и выполнять соответствующее действие. Точно так же можешь привязать любые сочетания клавиш к специальным функциям вроде выключения.

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

Самым основным компонентом операционной системы Linux есть ядро. Именно ядро выступает промежуточным звеном между пользовательскими программами и оборудованием компьютера. Во всех бинарных дистрибутивах нам не нужно заботиться о сборке и настройке ядра, все уже сделали за нас разработчики дистрибутива. Но если мы хотим собрать свой дистрибутив сами или установить самую свежую версию ядра, нам придется собирать ядро вручную.

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

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

Самое первое что нужно сделать - это скачать исходники ядра. Исходники лучшие брать с сайта вашего дистрибутива, если они там есть или официального сайта ядра: kernel.org. Мы рассмотрим загрузку исходников с kernel.org.

Перед тем как скачивать исходники нам нужно определиться с версией ядра которую будем собирать. Есть две основных версии релизов - стабильные (stable) и кандидаты в релизы (rc), есть, конечно, еще стабильные с длительным периодом поддержки (longterm) но важно сейчас разобраться с первыми двумя. Стабильные это, как правило, не самые новые, но зато уже хорошо протестированные ядра с минимальным количеством багов. Тестовые - наоборот, самые новые, но могут содержать различные ошибки.

Итак когда определились с версией заходим на kernel.org и скачиваем нужные исходники в формате tar.xz:

В этой статье будет использована самая новая на данный момент нестабильная версия 4.4.rc7.

Получить исходники ядра Linux можно также с помощью утилиты git. Сначала создадим папку для исходников:

mkdir kernel_sources

Для загрузки самой последней версии наберите:

git clone https://github.com/torvalds/linux

Распаковка исходников ядра

Теперь у нас есть сохраненные исходники. Переходим в папку с исходниками:

cd linux_sources

Или если загружали ядро linux с помощью браузера, то сначала создадим эту папку и скопируем в нее архив:

mkdir linux_sources

cp ~/Downloads/linux* ~/linux_sources

Распаковываем архив с помощью утилиты tar:

И переходим в папку с распакованным ядром, у меня это:

cd linux-4.4-rc7/

Автоматическая настройка сборки ядра Linux

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

Параметры используемого ядра хранятся в архиве по адресу /proc/config.gz. Распакуем конфиг и поместим его в нашу папку утилитой zcat:

В процессе его работы нужно будет ответить на несколько вопросов. Это новые параметры, которые изменились или были добавлены в новое ядро и поддержка нового оборудования, в большинстве случаев можно выбирать вариант по умолчанию. Обычно есть три варианта y - включить, n - не включать, m - включить в качестве модуля. Рекомендованный вариант написан с большой буквы, для его выбора просто нажмите Enter.

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

Ручная настройка ядра Linux

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

Начнем. Для запуска меню настроек ядра linux наберите:

Откроется вот утилита с интерфейсом ncurses:

Как видите, некоторые обязательные опции уже включены, чтобы облегчить вам процесс настройки. Начнем с самых основных настроек. Чтобы включить параметр нажмите y, чтобы включить модулем - m, для перемещения используйте клавиши стрелок и Enter, возвратиться на уровень вверх можно кнопкой Exit Откройте пункт General Setup .

Здесь устанавливаем такие параметры:

Local Version - локальная версия ядра, будет увеличиваться при каждой сборке на единицу, чтобы новые ядра при установке не заменяли собой старые, устанавливаем значение 1.

Automatically append version information to the version string - добавлять версию в название файла ядра.

Kernel Compression Mode - режим сжатия образа ядра, самый эффективный lzma.

Default Hostname - имя компьютера, отображаемое в приглашении ввода

POSIX Message Queues - поддержка очередей POSTIX

Support for paging of anonymous memory - включаем поддержку swap

Control Group support - поддержка механизма распределения ресурсов между группами процессов

Kernel .config support и Enable access to .config through /proc/config.gz - включаем возможность извлечь конфигурацию ядра через /proc/config.gz

Здесь все, возвращаемся на уровень вверх и включаем Enable loadable module support, эта функция разрешает загрузку внешних модулей,дальше открываем его меню и включаем:

поддержка отключения модулей

принудительное отключение модулей

Опять возвращаемся назад и открываем Processor type and features:

Processor family (Opteron/Athlon64/Hammer/K8) - выбираем свой тип процессора.

Опять возвращаемся и переходим в раздел File systems , тут установите все нужные галочки.

Обязательно включите The Extended 3 (ext3) filesystem и The Extended 4 (ext4) filesystem - для поддержки стандартных ext3 и ext4 файловых систем

Возвращаемся и идем в Kernel hacking.

Здесь включаем Magic SysRq key - поддержка магических функций SysRq, вещь не первой необходимости, но временами полезная.

Остался еще один пункт, самый сложный, потому что вам его придется пройти самому. Device Drivers - нужно пройтись по разделам и повключать драйвера для своего оборудования. Под оборудованием я подразумеваю нестандартные жесткие диски, мышки, USB устройства, веб-камеры, Bluetooth, WIFI адаптеры, принтеры и т д.

Посмотреть какое оборудование подключено к вашей системе можно командой:

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

Чтобы выйти нажмите пару раз кнопку Exit .

Сборка ядра Linux

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

make && make modules

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

Установка нового ядра

Когда ядро и модули будут собраны новое ядро можно устанавливать. Можно вручную скопировать файл ядра в папку загрузчика:

cp arch/x86_64/boot/bzImage /boot/vmlinuz

А можно просто выполнить установочный скрипт, сразу установив заодно и модули:

sudo make install && sudo make modules_install

После установки не забудьте обновить конфигурацию загрузчика Grub:

grub-mkconfig -o /boot/grub/grub.cfg

И перезагружаем компьютер чтобы увидеть новое ядро в работе:

Выводы

Вот и все. В этой статье мы подробно рассмотрели как собрать ядро Linux из исходников. Это будет полезно всем желающим лучшие понять свою систему, и тем, кто хочет получить самую новую версию ядра в своей системе. Если остались вопросы, задавайте комментарии!



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: