モノシリックカーネルとマイクロカーネル

モノシリックカーネル
全OSは一つのカーネル内に存在し、カーネルスレッド上で実行される
システム構成要素間の依存関係が複雑
デバイスドライバ、スケジューラ、メモリ管理、ファイルシステム、ネットワークプロトコルスタックなどもカーネル空間におかける
Linux, FreeBSDはモノシリック
ソフトウェアが少なく高速、コードも少ない
システムコールの延長で動作する
コーディングは難しい 標準Cライブラリが使えず、GNUデバッガが必要

モノシリックカーネル
伝統的なカーネルからサーバ群に機能を移転するOS設計方針
サーバ群を可能な限りユーザ空間で動作させる
ハードウェアの抽象化とシステムコールの最小
IPC(プロセス間通信)、基本スケジューラ、基本メモリハンドラ、基本I/Oプリミティブなどはカーネル空間におかける
スケジューラ本体、メモリ管理、ファイルシステム、ネットワークスタックの大部分はユーザ空間で動作
macOS, QNX, GNU Hurdなど
マイクロカーネルは通常、アドレス空間定義部、プロセス間通信(IPC)、プロセス管理などを扱う
ハードウェア処理などの昨日はマイクロカーネルで扱わない
メモリ、ソフトウェアを多く使用し、プロセス管理が複雑
ロボット、医療用システムで使われる

ハイブリッドカーネル
macOS
通信プロトコルスタックやファイルシステムをカーネル空間で動作、一部のカーネルコードはユーザ空間で提供
サードパーティーのテクノロジーを素早く統合できる

unixはユーティリティプログラム群とカーネル
linuxカーネルは1300万行
macOSはDarwinをベースとしており、XNUと呼ばれるハイブリッドカーネルを採用
Windowsもクライアント・サーバ型階層型サブシステムモデルを採用しており、ハイブリッドカーネルと見なされている

なるほど、Linux, Windows, MacOSだと、カーネルの設計・仕組みが異なるってことか。

Kernel

kernelって、どの本にも出てくるけど、具体的に何やってんの?
→ OSの中核。アプリケーションとハードウェアのデータ処理の架け橋
ハードウェアとソフトウェアコンポーネントのやり取りを管理する
プロセスの抽象化、プロセス間通信、システムコールなどを提供する
L モノシリックカーネルは全てを一つの仮装アドレス空間に格納されたコードで実行して性能を向上
L マイクロカーネルはサービスの大部分をユーザー空間で実行し、保守性とモジュール性を向上

あれ、これ、CPU、memory, deviceと繋がってるってことは、CPU、memory、deviceのアーキテクチャを理解してないと、kernelは書けないってこと? ん?
CPU、memory、deviceも日進月歩で進化してるよね。。

– カーネルの機能
コンピュータのリソースを管理し、他のプログラムがそれらのリソースを使って動作できるようにする
 CPU(プロセッサ): 多数のプロググラムからプロセッサ群を選択する
 memory: メモリにはプログラムとデータ両方が格納される
 input, output: keyborad, hdd, usbなど
リソース管理の重要な観点は、実行領域とその領域へのアクセス調停
プロセス同士の同期も提供
マルチタスクシステム(Mac OS, Windows採用)はプロセスを高速に切り替える。プロセスには優先度が設定される。プロセス間通信(IPC)は、パイプ、共有メモリ、メッセージ、RPC、ソフトウェア割り込みなどがある。
協調型マルチタスクは、割り込まれずに実行される。

メモリ管理
ページング方式、セグメント方式による仮想アドレッシング
物理アドレスを仮想アドレスに変換している(RAMからHDDなど)

システムコール
カーネルを呼び出す

カーネルの設計
モノシリックカーネル(大部分をカーネル内に含む)とマイクロカーネルで設計に大きな違いがある
多くのカーネルは、中間のハイブリッドカーネルになっている

Solaris

Soralisはサン・マイクロシステムズによって開発され、UNIXとして認証を受けたOS
sunのマイクロプロセッサ搭載
高性能、大規模システム向け
→ 大規模ストレージ向けの高信頼性ファイルシステムZFSなど

illumosとして開発は続けられている
https://github.com/illumos/illumos-gate

後は、windows, OSXがどのように開発されているかは知っておかないと駄目ですね。。
windowsは、OS, networking, C++, C, powershellの知識が必須
MacOSでもC/C++, ARM assembly, multi-thread application,file-sytem, encryption, operating system, hardware, low-level device

なるほどー、OSが絡む開発だとどこもC/C++は運転免許証ってレベル感になってくるな。

FreeBSD

BSDの流れを組むオープンソースのUNIX系OS, linuxの次に人気が高い
主な開発ターゲットはインテルのx86系プロセッサを搭載したPC/AT互換機
Linuxはdistributionと呼ばれる配布パッケージを利用するが、FreeBSDは一通りのソフトウェアが揃っている
packageはバイナリファイルのソフトを取得導入でき、portsはソースコードを元にコンパイルを行い組み立てる
カーネルの高負荷耐性が強く、サーバー用途を志向している

-推奨設定
amd64プロセッサ
rEFIndをインストールする為のEFIシステムパーティション
4GB RAM
8GBハードドライブ空き容量
3Dアクセラレーションビデオカード
ネットワークカード
サウンドカード

freebsd github
https://github.com/freebsd/freebsd

なんだこの26万commitsって。。異次元だな。まーlinuxは90万commitsな訳だが。

あれ、これ、binディレクトリの中を見ると、linux commandがc言語で書かれていますね。はー、fedora, centos, ubuntuなどもこういう仕組みなんだー。

ってことは、linux開発やりたいなら、c言語は必須ってことじゃん。
あれ、ってことは、linux, windows, OSX向けにbuildするソフトウェア開発するには、ゴリゴリC言語書けないと話にならないってことでしょうか?まじかー

configureの作成

cc コンパイラオプション
% cc [<オプション>] <ファイル名> [<ライブラリ>]

srcdir: コンパイルされるソースに対するディレクトリ
.ac: ユーザーのアクセス権限を証明

#!/bin/bash
cat >>Makefile.am <

# ビルドしてインストール
bin_PROGRAMS=test

#コンパイルする際のコンパイルオプション
#../configureなどルートディレクトリ以外で実行した時のインクルードディレクトリ
test_CFLAGS=-g -l @srcdir@/include/

#test_LDADDはライブラリ
test_LDADD= -lm

#ソースコード
test_SOURCES=test.c 

#ライブラリ用設定
include_HEADERS=test.h 
#ライブラリ作成する際のライブラリ名
lib_LIBRARIES=libtest.a 
#libtest.aのソースコード
libtest_a_SOURCES

#ビルドしないがインストールするファイル
#prefixオプションで指定したディレクトリ以下の/share/パッケージ名に配置
pkgdata_DATA=setting
#C言語からdesineとして参照
AM_CFLAGS= -DEVENTTABLE_CSV=""$(pkgdatadir)/setting""

#再帰的にmakeを実行
SUBDIRS= subdir subdir2/subsubdir 
EOF 
vim Makefile.am 
autoscan 
touch NEWS README AUTHORS ChangeLog 
awk '{if(/AC_INIT/){print "AC_INIT(FULL-PACKAGE-NAME, 0.0.1, name@hoge.jp)";print"AM_INIT_AUTOMAKE"}else{print $0}}' configure.scan >
congifure.ac 
vim configure.ac 
aclocal 
autoheader
autoconf
automake -a -c

shell

#!/bin/bash
n=0
for i in $(seq 1000)
do
	n=$(echo $n + $i | bc)
done
echo $n

vagrant@trusty:~/other$ sh main.sh
500500

#!/bin/bash
n=0
for i in $(seq 5)
do
	echo "${i}回目の実行です"
done

vagrant@trusty:~/other$ sh main.sh
1回目の実行です
2回目の実行です
3回目の実行です
4回目の実行です
5回目の実行です

#!/bin/bash
n=0
for i in $(seq 5)
do
	echo "$i * 3" | bc
done
#!/bin/bash
for i in $(seq 5)
do
	printf "$i + "
	[ $i -eq 5 ] && printf "0\n"
done | bc

echoは改行を付与するがprintfは改行を入れない
-eq はイコール

#!/bin/bash
cnt=0
if [ -z “$1”]; then
cat <&0 else cat "$1" fi | while read line do echo "Installing $line" go get -u "$line" & (( (cnt += 1) % 16 == 0 )) && wait done wait [/code] -z "$1" : $1が指定していないときはTrueを返す &0: 標準入力(ファイルディスクリプタ 0) >> 追記する

am拡張子はautomake template

#!/bin/bash
cat >>Makefile.am < [/code]

.bashrcでターミナルプロンプトの表示名変更

.bash_profileはログイン時に一回起動、.bashrcはシェル起動時に毎回起動

ubuntu-trusty という長ったらしいの変更したい

vagrant@vagrant-ubuntu-trusty-64:~/*

\u:username
\h:hostname
\W:current directory

vim ~/.bashrc

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

PS1がプロンプトの表示
“\h”を”trusty”に書き換えてsource .bashrcで反映する

vagrant@vagrant-ubuntu-trusty-64:~/other/hello-2.7$ source ~/.bashrc
vagrant@trusty:~/other/hello-2.7$

おー、スッキリした♪♪

configureスクリプト

configureスクリプトで設定する項目は、インストールディレクトリ、コンパイラやそのオプション、機能や追加オプションのオン・オフ、ソフトウェア実行時の設定のデフォルト値

インストールディレクトリの設定は、「–prefix=dirname」

$ ./configure --prefix=/opt/hello-2.7
$ make
$ sudo make install

vagrant@vagrant-ubuntu-trusty-64:~/other/hello-2.7$ /opt/hello-2.7/bin/hello
Hello, world!

–prefixを指定しないと、/usr/localにインストール。/usr/localはos標準外のソフトをインストール

shareディレクトリはプロセッサーのアークテクチャに寄らないファイル

./configure

vagrant@vagrant-ubuntu-trusty-64:~/other$ wget http://ftp.gnu.org/gnu/hello/hello-2.7.tar.gz
vagrant@vagrant-ubuntu-trusty-64:~/other$ tar zxvf hello-2.7.tar.gz
vagrant@vagrant-ubuntu-trusty-64:~/other$ cd hello-2.7
vagrant@vagrant-ubuntu-trusty-64:~/other/hello-2.7$ ls
ABOUT-NLS ChangeLog configure.ac gnulib man src
aclocal.m4 ChangeLog.O contrib INSTALL NEWS tests
AUTHORS config.in COPYING Makefile.am po THANKS
build-aux configure doc Makefile.in README TODO

慣習としてドキュメントは全て大文字

Makefile.am, Makefile.inはあるが、Makefileはありませんね。
環境に合わせたmakefileを作成するのが.congifureです。


Makefile.amは、プログラマが作成した定義ファイルでautomakeがMakefile.inを作成する。Makefile.inがMakefileを作成する

bitcoin/Makefile.amも、.configureでmakefileを作成する為のファイルですね^^ なるほどーすげー知識いるなー

./configureを実行します
vagrant@vagrant-ubuntu-trusty-64:~/other/hello-2.7$ ./configure
.
.
.
config.status: creating Makefile
config.status: creating contrib/Makefile
config.status: creating doc/Makefile
config.status: creating gnulib/lib/Makefile
config.status: creating man/Makefile
config.status: creating po/Makefile.in
config.status: creating src/Makefile
config.status: creating tests/Makefile
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile

vagrant@vagrant-ubuntu-trusty-64:~/other/hello-2.7$ ./configure | grep ‘checking’ | wc -l
202

あれ、よく見たら、Makefile.amとかみんなで作ってるけど。。。configureやmakefileまで作るレベルにならにゃいかん、ってことか。。

GNU

GNU hello
http://www.gnu.org/software/hello/
https://github.com/avar/gnu-hello

wgetのバージョンを見ます
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ wget -V
GNU Wget 1.15 built on linux-gnu.

+digest +https +ipv6 +iri +large-file +nls +ntlm +opie +ssl/openssl

Wgetrc:
/etc/wgetrc (system)
Locale:
/usr/share/locale
Compile:
gcc -DHAVE_CONFIG_H -DSYSTEM_WGETRC=”/etc/wgetrc”
-DLOCALEDIR=”/usr/share/locale” -I. -I../../src -I../lib
-I../../lib -D_FORTIFY_SOURCE=2 -I/usr/include -g -O2
-fstack-protector –param=ssp-buffer-size=4 -Wformat
-Werror=format-security -DNO_SSLv2 -D_FILE_OFFSET_BITS=64 -g -Wall
Link:
gcc -g -O2 -fstack-protector –param=ssp-buffer-size=4 -Wformat
-Werror=format-security -DNO_SSLv2 -D_FILE_OFFSET_BITS=64 -g -Wall
-Wl,-Bsymbolic-functions -Wl,-z,relro -L/usr/lib -lssl -lcrypto
-ldl -lz -lidn -luuid ftp-opie.o openssl.o http-ntlm.o
../lib/libgnu.a

PGP, MD5, SHA1はチェックサム

e.g. ece4c66f0c05d216fc96969fcf3d1add *mod_fcgid-2.3.9.tar.gz
md5sumで確認する
$ md5sum -b httpd-2.2.19.tar.gz

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ dpkg -l gnupg
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-=================================
ii gnupg 1.4.16-1ubun amd64 GNU privacy guard – a free PGP re

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ gpg –list-keys
gpg: directory `/home/vagrant/.gnupg’ created
gpg: new configuration file `/home/vagrant/.gnupg/gpg.conf’ created
gpg: WARNING: options in `/home/vagrant/.gnupg/gpg.conf’ are not yet active during this run
gpg: keyring `/home/vagrant/.gnupg/pubring.gpg’ created
gpg: /home/vagrant/.gnupg/trustdb.gpg: trustdb created