Полностью с нуля? Вообще, можно "покопать" в сторону микроядра L4, там очень много документации (правда на английском языке), поддерживаются различные архитектуры (правда, ARM на сколько я знаю уже не поддерживается).
А так, Эндрю Таненбаум "Современные операционные системы", Эндрю Таненбаум "Операционные системы: Разработка и реализациая", Макаров, Насыров "Написание собственной операционной системы" (достаточно примитивно, но понятно).
А вообще, есть достаточно неплохая подборка.
Как пример, можно поинтересоваться проектом "Хамелеон" - русской микроядерной операционной системой, на базе L4.
На счет исходников - лучше всего посмотреть исходный код FreeBSD, он достаточно прост и лаконичен, в отличии от Linux (слишком много "наворотов").
Дело в том, что под этим понятием можно понимать ряд разных вещей. Они похожи между собой идеей.
1) Подключение заголовочного файла.
#include <stdio.h>
#include "myfile.h"
В заголовочных файлах чаще всего хранятся прототипы различных функций и некоторые константы. Это нужно, чтобы компилятор знал описание функций, которые вы используете, если они описаны не вами.
2) Подключение lib-файла.
Обычно делается в настройках проекта или коммандой #pragma comment(lib, "mylib.lib")
Таким образом мы можем использовать код, хранящийся, например в dll, без ручной загрузки.
3) Загрузка dll.
Делается через вызов функции LoadLibrary и последующими GetProcAddress - это ручная загрузка функций из библиотеки.
Все это предназначено для того, чтобы вы могли использовать сторонний код (будь то стандартные средства языка или код написанный просто другими программистами).
Хотя и управление автозагрузкой программ при входе в операционную систему Windows 10 немного изменилось (управляется через диспетчер задач), папка "Автозагрузка" для текущего пользователя вызывается достаточно легко.
Пуск -> Автозагрузка.
Это окно оставляем небольшого размера, а туда копируем ярлык искомой программы, которая должна стартовать при входе в Windows 10 с вашим профилем. Там доспустимы только ярлыки, но обычно этого достаточно.
Указатели в c\c++ - это специальный вид типов, содержащий не само значение переменной, а адрес данных в памяти.
Пусть переменная a имеет целочисленный тип и значение 5.
int a = 5;
Создадим переменную b типа указатель на целочисленную переменную a.
int* b = &a.
& - операция взятия адреса от переменной.
printf("%p", b) - выведет адрес в памяти, по которому лежит переменная a со значением 5.
printf("%d", (*b)) - выведет само значение переменной, по указателю (в данном примере - 5).
Можно рассматривать ссылку, как вариант указателя. Ссылки более безопасны, но менее мощные, из-за своих ограничений.
Например, ссылка не может быть не инициализированной или нулевой - значит нельзя получить ошибку разыменования нуля.
Пример
int a = 5;
int &b = a;
printf("%p %p", &a, &b);
a - переменная целочисленного типа со значением 5.
b - ссылка на переменную целочисленного типа.
Код выведет один и тот же адрес переменной.