Kernel Programming Guide
BSD Overview
The BSD portion of the OS X kernel is derived primarily from FreeBSD, a version of 4.4BSD that offers advanced networking, performance, security, and compatibility features. BSD variants in general are derived (sometimes indirectly) from 4.4BSD-Lite Release 2 from the Computer Systems Research Group (CSRG) at the University of California at Berkeley. BSD provides many advanced features, including the following:
Preemptive multitasking with dynamic priority adjustment. Smooth and fair sharing of the computer between applications and users is ensured, even under the heaviest of loads.
Multiuser access. Many people can use an OS X system simultaneously for a variety of things. This means, for example, that system peripherals such as printers and disk drives are properly shared between all users on the system or the network and that individual resource limits can be placed on users or groups of users, protecting critical system resources from overuse.
Strong TCP/IP networking with support for industry standards such as SLIP, PPP, and NFS. OS X can interoperate easily with other systems as well as act as an enterprise server, providing vital functions such as NFS (remote file access) and email services, or Internet services such as HTTP, FTP, routing, and firewall (security ) services.
Memory protection. Applications cannot interfere with each other. One application crashing does not affect others in any way.
Virtual memory and dynamic memory allocation. Applications with large appetites for memory are satisfied while still maintaining interactive response to users. With the virtual memory system in OS X, each application has access to its own 4 GB memory address space; this should satisfy even the most memory-hungry applications.
Support for kernel threads based on Mach threads. User-level threading packages are implemented on top of kernel threads. Each kernel thread is an independently scheduled entity. When a thread from a user process blocks in a system call, other threads from the same process can continue to execute on that or other processors. By default, a process in the conventional sense has one thread, the main thread. A user process can use the POSIX thread API to create other user threads.
SMP support. Support is included for computers with multiple CPUs.
Source code. Developers gain the greatest degree of control over the BSD programming environment because source is included.
Many of the POSIX APIs.
BSD Facilities
The facilities that are available to a user process are logically divided into two parts: kernel facilities and system facilities implemented by or in cooperation with a server process.
The facilities implemented in the kernel define the virtual machine in which each process runs. Like many real machines, this virtual machine has memory management, an interrupt facility, timers, and counters.
The virtual machine also allows access to files and other objects through a set of descriptors. Each descriptor resembles a device controller and supports a set of operations. Like devices on real machines, some of which are internal to the machine and some of which are external, parts of the descriptor machinery are built into the operating system, while other parts are often implemented in server processes.
The BSD component provides the following kernel facilities:
processes and protection
host and process identifiers
process creation and termination
user and group IDs
text, data, stack, and dynamic shared libraries
Источник
MacOSX: Много *BSD или мало?
Доброй ночи всем 🙂 В час ночи с чаем решил задуматься. Вот в инете всю дорогу противоречивая инфа: то ли можно с натягом рассматривать связь MacOSX и FreeBSD, другие не рассматривают.
Я решил почитать литры всякой, в том числе и по терминальным командам для MacOSX, в результате чего прихожу к выводу, что да: MacOSX носит в себе элементы FreeBSD и можно тогда можно МакОСь отнести к стану *BSD.
А как думает ЛОР? 🙂 (не холивара ради. Хочу за BSD взяться на домашнем компе) Хочется у себя «в жызны» сделать единую экосистему. В ночных раздумьях 🙂
P.S. И да, я наконец-то осилил brew и xcode command line
У MacOS мало чего осталось от *BSD. То же ядро у них другое. Да и вроде вместо xorg’а у них свое упраление графикой.
судя по маковским манам, датированным началом 90х, юзерспейсные утилиты они позаимствовали ещё до появления FreeBSD
Darwin — это химера, микроядро Mach, отдельные части FreeBSD (сейчас — FreeBSD5) и I/O Kit.
А Mach — это развитие патча BSD ядра.
В общем в основе OS X лежит BSD и «киты» для ObjC, берущие начало в NextSTEP (OpenSTEP).
NextSTEP — это уже не уровень ядра. Ядерные киты плюсовые.
Ну, как я понимаю, изначально userland и большая часть утилит. При этом впилено уже столько своего, что можно относить, а можно и не относить. Знания FreeBSD тебе в макоси помогут мало.
Знания FreeBSD тебе в макоси помогут мало.
Так и наоборот: знания всяких там brew и xcode практически ничем не помогут знаниям FreeBSD.
прихожу к выводу, что да: MacOSX носит в себе элементы FreeBSD и можно тогда можно МакОСь отнести к стану *BSD.
нет, бсд — говно, os x — не говно.
Да и вроде вместо xorg’а у них свое упраление графикой.
Вроде? Удивляюсь с лора.
Хочется у себя «в жызны» сделать единую экосистему.
Да кто такая эта ваша «экосистема»? Все про неё говорят, но никто толком не может сформулировать что это такое, обычно говоря про банальную синхронизацию, которая, каким нибудь дропбоксом делается с пол пинка.
MacOSX носит в себе элементы FreeBSD
Именно — «носит»
На самом деле Mac OS X из двух систем как бы состоит: первая половина собсно то что пришло из NeXTSTEP и то что пользователь видит, с чем он работает, вторая от BSD (от пользователя скрыта и видна в основном всякими разработчикам и энтузиастам)
На BSD часть приходиться разграничение прав доступа, сетевой стек, работа с FS совместимость с UNIX/POSIX
Можно ли отнести Мас OS X к стану *BSD? Незнаю, смотря что имеется в виду под *BSD.
Mach — это развитие патча BSD ядра
Обновись до 10.9 хотя бы. Батарейка там лучше держит.
в том числе и по терминальным командам для MacOSX, в результате чего прихожу к выводу, что да
Скажи-ка, дядя, а насколько
Ко БЗДе приблизится винда
Коль водки бахнуть смачно
И dir сменить на ls?
Человек на linux.org.ru не знает чего-то о проприетарной ОС
Да я был бы рад, вот только люди жалуются на выпады звуковой системы да на сеть после пробуждения. Я конечно любитель вырубать систему в стиле «Винды», но иногда просто крышку закрываю и открываю, и мне тогда нужен сразу работающий со звуком и сетью ноут :)))
Ок, спасибо. Я хотел бы тогда задать такой под-вопрос: Программы для BSD и же для GNU/Linux лучше компилируются на MacOSX, или тут уже без разницы (куча кроссплатформенных)? Да, я реально уже хочу страдать «гентофилией», благо железка ’13 года, и вроде должно все быстренько собираться 🙂
А чего он тогда ерунду пишет, если не знает?
Да и вроде вместо xorg’а у них свое упраление графикой.
И вроде DE у них не GNOME.
обычно говоря про банальную синхронизацию
Да не, просто я хотел тут «подразумевать» возможность красноглазить. GNU/Linux мне плохо подходит, потому что я теряюсь в ее многообразии.
Может я и не прав, но мне кажется, что политика «1 ОС — почти 0 форков» показывает большую монолитность и «стабильность». OS X — это очень отдаленная от GNU/Linux и freeBSD ОСь, но она, тем не менее, в стане UNIX-подобных. Вот и начал подумывать о том, что пора браться за BSD.
P.S. и да, мне скучно на домашнем HP под виндой сидеть, скукота неописуемая. На маке вот начал баловаться компиляцией и репами homebrew. 😀
Скажи-ка, дядя, а насколько
С линупсом сблизится винда
Ежели водки бахнуть смачно
А сверху навернуть цыгвин?
Сигвином мазать можно много
Но хоть ты плачь, а хочешь сри
Но водкой не стереть следы винды
Программы для BSD и же для GNU/Linux лучше компилируются на MacOSX,
Источник
FreeBSD на Mac
Публикуется от имени и по просьбе товарища mrTuborg
Год назад поднял я сервер на Mac mini под управлением Leopard’a (Mac OS X 10.5), как и все порядочные люди, обнаружив внутри — зачатки/огрызки от FreeBSD, скачал и поставил порты fink (finkproject.org). Год поигрался… выставил WiFi адаптер в режим Infrastructure… теперь он и Internet стал на ноутбук отдавать… Качает торренты в режиме 24/7, переправляет поток VNC из локалки во внешний инет (для доступа с того же ноутбука при нахождении далеко от своего дома)… предоставляет опять же для меня любимого дискетку по SFTP размером в 500Г, держит транспорт для джаббера…
И стало скучно…
А что вот если взять и поставить на него настоящий FreeBSD? Пацан сказал — пацан сделал. ан нет… вот тут и начинается самое интересное.
Прожёг образ FreeBSD 7.0 PowerPC. Мак стартанул с диска нормально. Начинаем установку… упс… а где fdisk?? Нету fdisk’a. Есть Label Editor. Но как начинает выясняться он ничего не может сделать с таблицей разделов… И понеслось. В результате 2х недельного копания родилcя небольшой ToDo «Как поставить FreeBSD на Mac»… Который я и собираюсь представить вашему вниманию.
Итак, проблемы с которыми я столкнулся:
1) FreeBSD Installation DVD не имеет fdisk. Только LabelEditor который впринципе ничем помочь с разделами не может.
И нигде не найдёте портированную версию fdisk под Mac (по крайней мере работающую версию). Проблема кроется в «особом» железе и особом
Open-Firmware(об этом чуть ниже) фирмы Apple.
2) «Особенный» Open-Firmware
Всё прогрессивное человечество уже отказалось от системы BIOS заменив их постепенно (я так понимаю пока в теории, а на маках уже и в практике) на Open Firmware. Аппаратный предзагрузчик с функциями самотестирования. В маках хоть и указано что это Open Firmware, но исходя из набора команд это всё таки свой Open Firmware. И этот Open Firmware понимает загрузку лишь с Маковских разделов HFS+. Собственно все дальнейшие танцы с бубном и происходят вокруг этого Open Firmware.
Что это такое написано здесь — en.wikipedia.org/wiki/Open_Firmware. Новомодная технология пришедшая на смену морально умершему BIOS. Набор команд для управления можно почитать здесь — www.firmworks.com/QuickRef.html. Но особенность Apple’вского OpenFirmware и заключается в том, что оно практически ни как не пересекается с описанными вещами. Здесь немного изменённый набор команд (большинство команд из указанного Reference — не работают) и поведение этих команд немного не предсказуемое. Очень часто одни и те же команды перестают работать или работать как то по другому. Выход один — перезагрузка.
Итак, вход в Mac’овский OpenFirmware — Alt + Cmd + O + F. После недолгой тренировки эта комбинация легко нажимается одной правой (левой не получится — пробовал =)).
Самые полезные, из обнаруженных команд:
mac-boot — продолжить загрузку
shut-down — выключить мак
reset-all — перезагрузить систему
eject cd — «выплюнуть» диск
boot — загрузить систему
devalias — вывод списка всех назначенных символьных сокращений для устройств
(запишите алиас для hd и сd)
Вывод всего дерева устройств:
1) dev / — подмонтировать дерево устройств в корень
2) ls
printenv — вывод переменных окружения.
(самая для нас интересная переменная — boot-device)
setenv — Назначить переменную окружения
Чтобы сбросить все настройки в заводские — необходимо в выключенном состоянии подержать кнопку включения до появления характерного звука и реакции домашних а-ля «у тебя всё в порядке? 0_o» Вобщем сигнал узнаваемый.
Вроде всё кристально чисто понятно. Но! OpenFirmware не может загружаться ни с чего иного, кроме как HFS+, и при этом…
3) FreeBSD не видит маковские HFS+ разделы.
Впринципе этого и нетребуется. Всё что требуется — создать при помощи инструментов Mac OS подготовить раздел HFS+ и не трогать его уже из
FreeBSD, чтобы не испортить.
4) Mac OS при первой возможности «бросается улучшать» разделы на жёстком диске.
Проблема обратная описанной в п.3 Когда уже установим FreeBSD ни в коем случае не допустите загрузки Mac OS X (с установочного диска). Всю процедуру установки BSD придётся начинать заново.
Итак. Это была теоретическая часть. Теперь собственно приступим к практике — к препарированию пациента.
Инструменты:
1) Установочный диск FreeBSD.
2) Установочный диск Mac OS X (Тигр или Леопард).
3) Флэшка.
0. Определение оборудования.
Далее мы будем везде указывать символические имена устройств, но на всякий случай если они не сработают, надо выпытать полное название необходимых нам устройств на данном этапе.
Входим в Open Firmware(путём зажима клавиш Cmd+Alt+O+F)…
пишем следующие команды:
начнётся постраничный вывод дерева устройств построенного на начальном этапе загрузки Open Firmware. Здесь требуется внимательность.
Для имени нужна вся ветка… которая собственно там не указывается… а лишь обозначается отступами.
мой контроллер ATA (куда подключены жёсткий диск и cd-rom) выглядит так:
(через слэш разделены ветви дерева).
как узнать правильно ли определили ветку дерева?
Загружаемся дальше — в boot2/EFI (при условии что вставлен диск установки Free BSD). Там имеем более расширенный (но такой же глючный) набор команд от FreeBSD где можно проверить все наши догадки:
Как загрузить boot2/EFI. Находясь в OpenFirmware вводим команду (второй параметр опущен — ядро загружаться не будет)
boot cd:,\boot\loader
Итак мы в boot2/EFI.
все догадки вбиваем в переменную окружения «currdev»:
после имени контроллера ata-дисков(pci@f4000000/ata-6@d/disk) надо указать номер диска и номер раздела
set currdev=/pci@f4000000/ata-6@d/disk@1:0
в моём случае это cdrom. поскольку там всего один раздел, то номер раздела можно опустить, оставив так:
set currdev=/pci@f4000000/ata-6@d/disk@1
дальше проверяем нашу догадку коммандой ls.
Если получили листинг файлов и директорий диска — догадка оказалась верна.
Жёсткий диск в моём случае вышлядит как: /pci@f4000000/ata-6@d/disk@0
Если мы ошиблись то нахождение требуемых разделов решается путём простого перебора =).
1. Подготовка загрузчика (на соседнем компьютере)
Берём флэшку и копируем на неё loader и boot.tbxi (в любую папку, флэшка — как инструмент для переноски, не более)
Что за файлы… и где их взять? loader — находится на установочном диске FreeBSD (\boot\loader), boot.tbxi там же, но его надо поправить или создать заново если его не найдёте.
Это загрузочный скрипт на языке Forth для Open Firmware, выглядит следующим образом:
» screen» output
boot hd. \boot\loader hd.
Нас интересует команда boot. Разберёмся с её синтаксисом:
1й параметр — место расположения загрузчика (в данном случае boot2/EFI-загрузчик от FreeBSD). В данном примере укзана символическая подстановка, hd — hard disk (cd — compact disk), через двоеточие номер раздела (о номере раздела чуть ниже) и через забятую путь на этом разделе к файлу загрузчика. Файловая система HFS+.
2й параметр — место расположения ядра загружаемой системы. Здесь проще — просто номер раздела. Параметр передаётся на вход файла-загрузчика, поэтому требования к формату файловой системы не предъявляются.
Как выяснить нужные номера разделов мы выясним соответственно в момент когда эти разделы создадим. Поэтому редактирование скрипта на соседнем компьютере этим не заканчивается…
2. Подготовка жёсткого диска.
Установочный диск MAC OS X потрбуется один раз (см. проблему №4) поэтому с него и начнём.
После загрузки установочного диска MAC OS X вам доступны следующие необходимые нам инструменты: Disk Utilities и Terminal
2.1 Разбиваем диск при помощи Disk Utilities.
Почему бы не сделать один раздел и не поделить его на слайсы при помощи Label Editor’a? Не получится. Label Editor может только использовать созданные для него разделы, но никак не вмешиваться в таблицу разделов — не получится. Вот поэтому под каждый слайс лучше всё-таки сделать свой раздел…
Перед разбиением диска на разделы нужно выбрать тип таблицы разделов. GUID, Apple Partition Map или MBR. Выбрать нужно для PowerPC mac — APM, для Intel mac — GUID.
Я сделал следующие разделы:
под root — 4 Gb
под swap — 2 Gb
под var — 2 Gb
под usr — 8 Gb
под home — всё что осталось, а именно 22 Gb.
чтобы их было проще на следующем шаге идентифицировать в терминале зададим этим разделам метки типа root, swap… и пр.
Вообще на всяческих буржуйских форумах не советуют долго играться с Disk Utilities так как подозревается он в глючности. Не отрицаю сей факт, было такое, но я это списывал на свои кривые руки.
Пару слов о совместимости файловых систем Mac OS и BSD. В Disk Utilities есть 4 типа файловых систем для выбора — они все называются длинно и заумно Extended File System (Расширенная файловая система) с поддержкой (или без) журналирования и с поддержкой (или нет) различия заглавных и строчных букв в названиях файлов. На самом деле это ничто иное как Journaled или Non-Journaled Ext3 с опциями. Так что проблем с прочтением как в теории так и в практике этих разделов из под BSD не возникает (он их переконвертирует в UFS). Но закавыка всё таки есть. Надо загрузчик загрузить c HFS+, а ядро уже с партиции понимаемой в BSD.
Для дальнейшей успешной загрузки устанавливаемой BSD надо разделить загрузчик и собственно само ядро. Для этого на диске к уже описанным выше разделать создать раздел для bootloader’a. Я указал размер как 0.2Гб, Леопард тут же поправил до 1 Гб, но после процесса разбиения раздел оказался размером 0.86Гб. Ну не будем с ним спорить =). Далее BSD при установке сделает нечитаемыми для мака свои разделы, поэтому диск установки Leopard’a используем лишь один раз и только до установки BSD на жёсткий диск. Иначе, при следующей загрузке установочного диска Leopard’a, Mac OS все подготовленный разделы «улучшит» до степени непригодности так что процесс установки придётся начинать сначала.
Итак имеем следуюшую таблицу разделов:
bootloader (1G)
root (4G)
swap (2G)
var (2G)
usr (8G)
home (22G)
Закончив подготовку разделов, закрывем Disk Utilities и запускаем terminal (Всё с того же установочного диска Leopard или Tiger).
находяcь в терминале, необходимо разместить в разделе bootloader 2 файла c ранее подготовленной флешки- loader и boot.tbxi. Требований по размещению нет. Я, к примеру создал там директорию boot, и скопировал всё туда… а да нам надо закончить приготовление загрузочного скрипта.
2.2 Идентификация номера раздела
Способ 1: Находясь в терминале установочного диска leopard, выведите список подмонтированных разделов (всё подмонтировалось уже до нас)
пример работы команды mount, у меня:
/dev/disk0s3 on /bootloader
/dev/disk0s5 on /root
……
цифра стоящая после s и есть требуемые нам циферьки (см выше пример моего загрузочного скрипта)
Способ 2: Находясь в LabelEditor’е установочного диска FreeBSD.
пример моего случая:
Здесь уже приходится ориентироваться по порядку расположения и размерам разделов для выяснения — кто есть кто, так как заданных меток не видно. Немного неудобно.
Теперь добиваем загрузочный скрипт:
» screen» output
boot hd:3,\boot\loader hd:5
2.3 Подготовка bootloader
Находясь в Terminal копируем с флэшки на мак в раздел bootloader файлы loader и boot.tbxi
3. Установка FreeBSD.
Итак. Что имеем к этому моменту — разбитый (пока что только на разделы) диск, скопированные в bootloader-раздел файлы loader и boot.tbxi.
Перезапускаем Мак и загружаемся с установочного диска FreeBSD. Проводим установку. Перезапускаемся. Получаем мигающую папочку 😉
4. Загрузка установленного FreeBSD.
Пока всё хорошо. Заходим снова в OpenFirmware. Тестим установку ручной загрузкой:
0> eject cd — вытаскиваем загрузочный диск инсталлятора FreeBSD
ok
0> boot hd:3,\boot\loader hd:5 — загружаем подготовленный нами loader на 3ьей партиции и передаём ему на вход ядро с 5й партиции.
ok
…
Успешно? Если да переходим к пункту 4.2. Нет — читаем дальше.
4.1 Непосредственные имена устройств.
Если загрузка не пошла, значит не верно определены символические ссылки (devalias)
Значит будем использовать непосредственные имена устройств. Вспоминаем пункт 0. Загружаемся опять в EFI
Проверяем там ли у нас загрузчик и ядро:
set currdev=/pci@f4000000/ata-6@d/disk@0:3
ls — листинг файлов с раздела bootloader. Должны увидеть loader и boot.tbxi
…
set currdev=/pci@f4000000/ata-6@d/disk@0:5
ls — листинг файлов с раздела root.
…
Если неудачно, то меняем цифры a и b — disk@a:b путём перебора, пока не найдём.
Допустим нашли нужные цифры, тогда тестируем загрузку (предварительно перегрузившись в OpenFirmware)
0> boot /pci@f4000000/ata-6@d/disk@0:3,\boot\loader /pci@f4000000/ata-6@d/disk@0:5
соответственно придётся поправить загрузочный скрипт boot.tbxi на найденные параметры
4.2 Установленная FreeBSD загрузилась.
Можно работать… Вуаля!
На этом месте информация примерно на всех буржуинских форумах заканчивается… Для них всё ок. Они достигли нирваны…
Но как заметит наш внимательный пролетарский читатель — неужели теперь ручками надо это всё загружать? На многих форумах в этом месте рекоммендуют подготовить загрузочный диск (по типу инсталляционного) с правильным скриптом .tbxi который будет загружать ядро не с диска, а с винчестера.
5. Но это не выход!
Прошла не одна бессонная неделя и я натолкнулся в другом месте и совсем по другому поводу на команду setenv. Вот он выход, финальный аккорд, так сказать…
setenv boot-device hd:3,\boot\boot.tbxi
На моём маке сработал. Сработает ли у вас — гарантии никаких… поскольку всё это недокументированные возможности маковского Open Firmware.
В любом случае, как вернуть всё взад? Сбросить параметры nvram — при выключенном маке зажмите на 20 секунд кнопку питания.
Послесловие.
На моём маке загрузилась FreeBSD. Кулеры работают теперь постоянно… WiFi модуля не видно… Есть что продолжить. Если конечно это всё кому-нибудь надо.
Источник