/*====
* Create DMA stuffs for TX ring
*/
error = bus_dmamap_create(sc->sc_dmat, ALC_TX_RING_SZ, 1,
ALC_TX_RING_SZ, 0, BUS_DMA_NOWAIT, &sc->alc_cdata.alc_tx_ring_map);
if (error)
return (ENOBUFS);
/* Allocate DMA'able memory for TX ring */
error = bus_dmamem_alloc(sc->sc_dmat, ALC_TX_RING_SZ,
ETHER_ALIGN, 0, &sc->alc_rdata.alc_tx_ring_seg, 1,
&nsegs, BUS_DMA_NOWAIT | BUS_DMA_ZERO);
if (error) {
printf("%s: could not allocate DMA'able memory for Tx ring.\n",
sc->sc_dev.dv_xname);
return error;
}
error = bus_dmamem_map(sc->sc_dmat, &sc->alc_rdata.alc_tx_ring_seg,
nsegs, ALC_TX_RING_SZ, (caddr_t *)&sc->alc_rdata.alc_tx_ring,
BUS_DMA_NOWAIT);
if (error)
return (ENOBUFS);
Linux:
alx->descmem.virt = dma_zalloc_coherent(&alx->hw.pdev->dev,====
alx->descmem.size,
&alx->descmem.dma,
GFP_KERNEL);
9front:
ctlr->tx_ring = mallocalign(sizeof(TxDesc) * DSCN, 8, 0, 0);====
А вот ещё один очень наглядный пример из ACPI.
Linux:
args[0] =====
acpi_ut_create_integer_object((u64)region_obj->region.space_id);
if (!args[0]) {
status = AE_NO_MEMORY;
goto cleanup1;
}
args[1] = acpi_ut_create_integer_object((u64)function);
if (!args[1]) {
status = AE_NO_MEMORY;
goto cleanup2;
}
args[2] = NULL; /* Terminate list */
/* Execute the method, no return value */
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
(ACPI_TYPE_METHOD, info->prefix_node, NULL));
status = acpi_ns_evaluate(info);
acpi_ut_remove_reference(args[1]);
9front:
p = amlwalk(dot, "^_REG");====
if (p != nil) {
amleval(p, "ii", 0x3, 1, nil);
}
Это не шутка, это эквивалентный код. Код из 9front это мой код, который внесён в 9front, который я писал изучая аналогичный код Linux.
Конечно, с одной стороны можно сказать, что это следствие примитивности, но не только. Весь код системы следует этой идее -- не усложнять!
Немного отвлекаясь, хочу рассказать, что похожие эмоции я испытал, когда смотрел код утилиты cat одной из ранних версий Unix. Исходный код делал именно то, что и должна делать утилита cat. Не больше и не меньше. Сегодня же, можно посмотреть на https://www.gnu.org/software/hello/ чтобы убедиться, насколько технологии переусложнены. Кто-то скажет, что это неизбежно. У нас появились локали, gettext, разные варианты системных вызовов и так далее... Всё это, конечно, так. Но... Как программисту, мне хочется спросить -- адекватна ли цена? В общем, архитектурная простота Plan9 сквозит во всём. Plan9 -- не продукт.
Итак, если вы программист (на C) -- проблем с доработками кода не будет. Кодовая база небольшая, доступна в /sys/src из коробки и очень быстро собирается/обновляется по mercurial даже на eeepc. C компилятор (вернее, даже серия компиляторов для разных архитектур) в Plan9 очень быстрый! Я так понимаю, написан он Кен Томпсоном. Система mk (аналог make) -- тоже очень быстрая и лаконичная. Ну, давайте что-нибудь соберём?
# Выход в сеть
Если у вас qemu установка, то сеть скорее всего просто работает. Попробуйте:
cat /net/ndb====
ip/ping ya.ru
Я поднимаю wifi руками, скриптом. Мне так удобнее. Делается это очень просто:
bind -a '#l1' /net # l1 это моя wifi карта, cat /dev/kmesg====
aux/wpa -s ACCESS_POINT -p /net/ether1 # ether1 моя wifi карта
ip/ipconfig ether /net/ether1 # dhcp
Как посмотреть доступные точки доступа?
cat /dev/ether1/ifstats====
На самом деле bind '#l1' я делаю в lib/profile, до старта rio. Помните? У каждого процесса своё дерево файловой системы. А так, все процессы в rio будут наследовать его и /dev/ether1 станет доступным везде.
Дальше, разберётесь. :)
# git/mercurial
В 9front уже входит mercural. Давайте воспользуемся им, чтобы забрать проект 9front ports, там есть много чего полезного. Открываем окно rio. (Или запускаем win в acme).
cd /sys/====
hg clone http://code.9front.org/hg/ports
cd 9ports/dev-vcs/git9
mk install
Теперь у нас есть git! На самом деле, есть второй способ сделать это, подмонтировав к себе один из сетевых ресурсов по 9p, например 9front.
9fs 9front====
cd /n/extra
lc
Здесь вы найдёте git9.tgz, который можно распаковать и собрать. Для тренировки (и пользы!) предлагаю собрать irc7.tgz из extra. Скопировать себе в $home, распаковать, собрать (mk install) и зайти на канал #instead сервера irc.freenode.net.
Реализация git своя. Конечно, в виде файловой системы. :) Давайте заберём какой-нибудь проект по git. Я предлагаю попробовать собрать браузер netsutf.
cd====
mkdir Devel
cd Devel
git/clone https://github.com/netsurf-plan9/nsport
git/clone -- это не опечатка! lc /bin/git/ да...
Ох, чуть не забыл. Все пароли (от ssh, http, wpa, от _всего_) хранит специальная служба factotum! Вы можете добавлять в неё свои пароли/ключи при запуске, чтобы не вводить пароли руками. Я делаю это через скрипт из lib/profile, который читает файлик и добавляет пароли в factotum. Это небезопасно, т.к. мой файлик -- открытый. Для безопасного способа смотрим man secstore.
Пример добавления пароля github:
echo 'key proto=pass realm=GitHub server=github.com service=http user=gl00my !password=password' > /mnt/factotum/ctl====
Для сборки netsurf нужно следовать инструкциям: https://github.com/netsurf-plan9/nsport
Но, не буду разжёвывать и лишать вас радости исследования. :)
В портах вы найдёте golang свежей версии. Полезная в быту вещь.
// На данный момент, кстати, он собирается только если закомментировать строку CLEANCOMMAND в mkfile.
На eeepc мне удалось собрать только go14 (мало памяти), но в qemu установке собрал современную версию. Так что можно собирать софт для eeepc в qemu.
# Браузеры
"Современных" браузеров в 9front нет. Для многих "пользователей" это невыносимая потеря. А для меня это делает 9front настоящей отдушиной. В этой системе нет окна в зашлакованный современный веб! По-моему, это даже здорово.
Если серъёзно, у меня уже был опыт использования урезанных браузеров, так что был подготовлен. Для государственных сайтов и банков придётся использовать другие ОС или запускать в виртуалке (man vmx) OpenBSD. На eeepc я этого не делал. Ну, конечно, можно ещё по vnc ходить куда-то...
Итак, браузеры которые я пробовал.
## abaco
Канонический plan9 браузер. Если честно, чисто эстетически, очень понравился! Но, увы, в 9front он падуч. И, кажется, не поддерживает png. Короче, не рекомендую.
## mothra
Сначала не понравился. Но потом, оказалось, что он удобен. И есть у него кое-какие биндинги на клавиши, что удобно. Например: a ввод - однооконный режим. m ввод - режим скачивания (режим mothra). Выглядел он страшненько в основном из-за русских символов. Но мы уже умеем патчить код:
cd /sys/src/cmd/mothra====
acme rdhtml.c
# меняем шрифты, я рекомендую везде dejavusans(it,bd)/unicode.12 и .14
mk install
Мой вариант изменений лежит на https://github.com/gl00my/plan9hacks
Короче, можно пользоваться.
http://hugeping.tk/lib/uploads/opennet-mothra.png
## netsurf
Работает, только для показа картинок нужно раскомментировать jpeg/png библиотеки в mkfile/mkfile.native и добавить флаги -DWITH_PNG -DWITH_JPEG.
Рендерит странички неплохо, но нет многих удобных фич mothra. Подходит для просмотра сайтов, с которыми не справилась mothra.