ライセンス

本ブログ内で引用したソースコードは,引用元のライセンスにしたがって引用しています.

FreeBSD

Copyright 1992-2011 The FreeBSD Project. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
‪1.‬Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
‪2.‬Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project.

The FreeBSD Copyright

STBeeで遊ぶ ST-LINKを使ってみる

ST-LINKはSTマイクロエレクトロニクス純正のJTAGライター・デバッガ。
V2が登場したが手元にあるのはV1。
http://www.st.com/internet/evalboard/product/219866.jsp

準備

ST-LINK firmware upgradeをダウンロードする。
http://www.st.com/internet/evalboard/product/219866.jsp

ST-LINKをPCに接続してST-LinkUpgrade.exeを実行。
"Device Connect"をクリックし、Upgradeを勧められたらYesをクリックしてアップグレード。

使用

IDEなしでも利用できる方法。
上と同じリンク先からST-Link Utilityをダウンロードしてインストールする。
ST-LINKをPCに接続して、このツールを起動。
"Target" -> "Connect"を実行後、消去やバックアップ、書き込みができる。
ファームウェア更新もこっちでもできる。


さあ、ST-LINKを使ってデバッグだ。となると課題あり。
これまでは、プロ向けのIDE(IAR、KEIL、Atollicなど)を使う必要があった。
OpenOCD + GDBという組合せがST-LINKでは使えなかったため。


ST-LINKにこだわらず汎用のJTAGツールを持ってくれば良いのだが、せっかくなので使いたい。
そうしたら、なんと先達によってOpenOCDが使えるようになっていた。

STBeeで遊ぶ

Strawberry LinuxのSTBee。
http://strawberry-linux.com/catalog/items?code=32103

STM32F103VET6(ARM Cortex-M3)。

去年徹底入門の開発環境をもってきて試したが今回は別のアプローチで。
徹底入門はここ(http://miqn.net/)。

Strawberry Linuxが提供しているサンプルを動かすまで。
http://strawberry-linux.com/stbee/

開発環境はFreeBSDを使いたかったけれど一番実績のあるWindowsで。

ドライバの準備

um0412.zip
http://www.st.com/internet/mcu/product/164491.jsp
Design Supportタブを選択して、下の方のSW DEMOSのところにある。
"DfuSe USB device firmware upgrade STMicroelectronics extension"。
(みつからなければ http://strawberry-linux.com/stbee/driver
ダウンロードして、展開、インストール。
その後、STBeeをUSBでPCに接続すると、ドライバのインスト−ルが行われる。

Cygwin

setup.exe
1.7系のものをダウンロードする。
http://www.cygwin.com/
インストールする際にmakeを追加する。

GCC

LaunchpadのGCCをダウンロードしてインストールする。ABIはEABIを選択すること。
https://launchpad.net/gcc-arm-embedded
他にもARM向けGCCは提供されている。以前はSourcery CodeBench Lite Editionが有力だったが登録が必要になっている。
以下の情報も参照。
http://avr.paslog.jp/article/2545802.html

サンプルのコンパイル

STBee用のサンプルプロジェクトをダウンロード。
http://strawberry-linux.com/stbee/cc

$ make

書き込み

STBeeは標準でDFUというFirmware書き換え用ブートローダが搭載されている(0x8000000から0x8002fff)。
そのおかげでUSBでPCと接続するだけで書き込みができる。

DfuSe

um0412.zipからインストールしたDFU File Managerを利用する。
http://strawberry-linux.com/stbee/dfuse
GUIのツールを操作する。一度変換してから書き込む必要があって面倒。

DFUW

Strawberry Linuxが提供しているコマンドラインツール。
以下から取得して利用する.
http://strawberry-linux.com/stbee/dfuw
$ dfuw stbee-led.hex

結果

Lチカしていれば無事に書き込めている。

UNIX 4.3BSDの設計と実装 読書会(2)

メモと補足.

補足はこんな形.

2.2 カーネルの構成

  • VAX依存のメモリ管理機構は4.4BSDで捨てられた.Machから持ってきたものを使用.

参考文献[1] のp.155では,「Mach2.0の仮想メモリシステムに基づいたものだが、Mach2.5や、Mach3.0で加えられた修正も組み込まれている。」と記載あり.
ただし,MachシステムコールのI/Fは全く残っておらず,4.2BSDのI/Fに置き換えられている.

  • FreeBSDではさらに実装し直された?

参考文献[2] のp.68では,「4.4BSDの仮想記憶システムの実装を徹底的に最適化したものを使用している」とある.
マルチプロセッサもサポートしているが,初期のFreeBSDは対応していないように思う.

2.3 カーネルサービス

  • 下から4行目.読点は外して読んだほうが読みやすい.

2.4 プロセス管理

  • コルーチンとは?ユーザレベルでのスレッドのようなもの.yield がそれ.

yieldは初見.C#の機能のようだ*1

  • 追記。C#以前からyieldは存在する。GNU Pthなど。(@7shi さん)
  • コルーチンについて *2, *3

2.5 メモリ管理

  • Linuxではデマンドページングによる遅延が発生 → RTシステムでは問題となる.
  • mmap()インタフェースは4.2でも4.3でも導入を見送られた.

2.2節で補足したとおり,4.4BSDでMachベースのメモリ管理システムに置き換えられ,その際にmmap()が導入された.

  • システムコール時にカーネルに情報を渡す方法としてコピーを利用.再写像は使えない.
  • mmap()は導入されているが,カーネルへの情報渡しがコピーである点は同じ.copy on writeは実装されている[2] .
  • カーネル内部のメモリアロケータがゴチャゴチャしてしまっていた→単一のI/Fにすることでスッキリさせた.p.117にこのあたりの歴史の記載あり.

2.6 入出力システム

  • パイプ:4.2BSDより前(lionsなど)はFSで実装,4.2BSD〜はsocketで実装,

FreeBSDは,パイプを実装するのにsocketは使っていない([2]のp.72).

  • FreeBSDは三種類のオブジェクトではなく,四種類のオブジェクトになっている

名前付きパイプが追加されている([2]のp.72).

  • scriptコマンドでdup()を使っている?

FreeBSD9.0のscriptのソースコード(src/usr.bin/script)を眺めた限りは使っていないように見える.

  • sinkをどう訳すのが適切なのか?

「受信側」とか「出口」とかだろうか?

  • readv(),writev()をどのように使用するのか?
  • /proc(つまりprocfs)は無かったのか?

あった.最初の実装は,Version 8 UnixにTom J.Killianが実装したもの.
"Processes as Files"という論文がUSENIXで発表されたようだが現在は公開されていない?
BSD系では4.4BSDで実装されている.4.3BSDでは標準ではなかった?*4
FreeBSDではprocfsではなくsysfsを利用すべきとされており,標準では/procはマウントされていない.*5, *6

2.7 ファイルシステム

  • 空孔とは?

[2] p.80の説明の方が分かりやすい.
「ホールというのは,ファイルの中でデータが一度も書き込まれたことのない連続する空洞領域である.」
「書き込みポインタをファイルの終端よりも先に設定して書き込」んだり,「trancateシステムコールを使ってファイルの長さを伸ば」したりすることで作れる.

  • truncateコマンドはtruncateもextendも可能.
  • 4.2BSDより前はファイル名が14文字に制限されていた.以降は255文字以内.

2.8 機器

  • 現状のFreeBSDではブロックデバイスとキャラクタデバイスを区別していない.
  • FreeBSD勉強会で上記の話があったとのこと.ブロックデバイスという概念は存在しないということであった.

2.9 端末

  • 特になし.

2.10 プロセス間通信

ここではプロセス間通信(IPC)として,ネットワーク通信によった記載がされている.
[2]では,FreeBSDが「セマフォ,メッセージキュー,共有メモリなど」の「ローカルなIPC機構をサポートしている」と記載あり.

PF_UNIXとPF_LOCALは同じ値であり,/usr/include/sys/socket.h で定義されている.

       L.299
       #define	PF_LOCAL	AF_LOCAL
       #define	PF_UNIX		PF_LOCAL	/* backward compatibility */

では,PF_LOCAL(AF_LOCAL)を使うべきかというと,議論もあるため使用する環境を確認すべき.*7*8

2.11 ネットワーク通信

1つのドメイン(protcol family)の中に,複数のプロトコルが存在する.
ドメインの通信はソケット間で行われる.
socket()の引数typeでそのソケットの働き(意味,セマンティクス)を指定することになっている.
さらにこのtypeで利用できるプロトコルを引数protocolで指定する.
しかし,通常はtypeで一意にprotocolが決まってしまうため,protocolは指定しない.

  • socket()の呼び出し規約は次のとおり.
     socket(int domain, int type, int protocol);
  • domainとtypeとprotocolで指定する値はそれぞれ何か? → manに記載あり。

2.12 ネットワーク実装

  • 特になし.

2.13 システム操作

  • 課金とは? → p.64に記載あり.課金用の統計情報を集めている.実際の請求は別途運用次第.

参考文献

[1] Marshall Kirk McKusick他 著,砂原 秀樹 監訳,七丈 直弘 訳,「4.4BSDの設計と実装」,アスキー,2003.
[2] Marshall Kirk McKusick他 著,砂原 秀樹 監訳,歌代 和正 訳,「BSDカーネルの設計と実装−FreeBSD詳解−」,アスキー,2005.

UNIX 4.3BSDの設計と実装 読書会(1)

メモ+α.

原著の序

  • VMS(Virtual Memory System: 仮想メモリ・システム):VAX-11/780向けに開発されたOS

参考:
http://h50146.www5.hp.com/products/software/oe/openvms/faq/docu_001.html
http://www3.sympatico.ca/n.rieck/docs/vms_vs_unix.html

訳者の序

  • Bach(バッハ)本:「UNIXカーネルの設計」
  • CSRG(Computer System Rsearch Group)

参考:
http://en.wikipedia.org/wiki/Computer_Systems_Research_Group

1.1 UNIXシステムの歴史

  • 32V:V7のPDP-11の16bitアーキテクチャをVAXの32bitアーキテクチャに移植したもの.
  • Sun OSでBSDコマンドとSystem Vコマンドが使えるような構成→Open Solaris 10で廃止された?
  • Franz LISPLISPは処理系が大きく元々LISPマシンを作っていた.それをUNIX上で実行することを検討した.
    • その際,メモリを大きく取るため,仮想記憶が必要となった,ようだ?
  • simh上で動作するのは,4.3BSD Tahoe.しかも,ホストはNetBSDのみ?
  • Sony製のWorkstationがあった.NEWS.MIPSで動く.

参考:
http://en.wikipedia.org/wiki/Sony_NEWS

1.2 BSDと他のシステム

  • 特になし

1.3 4BSDの設計目標

参考:
http://ja.wikipedia.org/wiki/STREAMS

  • この節の内容は「UNIX原典」にも詳しいとのこと.

2.1 UNIX諸機能とカーネル

  • カーネル機構でシステムコール,割り込みなどは一緒に説明する
    • カーネルの処理には,ソフトウェア割込みのようにユーザ空間から入ってくる流れと,デバイスからの割込みのようにユーザ空間から入らない流れがあるよ

FreeBSD 9.0-R での Fortran 試用

備忘録。
FreeBSDports で利用できる Fortran コンパイラ(fortran95対応)

  • lang/g95
  • lang/gcc* (gfortran* コマンド)

g95

インストール
# portinstall -PP g95
実行
$ export LIBRARY_PATH=/usr/local/lib
$ g95 -o hoge hoge.f95
補足

g95 コマンド実行時に下のように表示された場合は,exportされていない可能性大。

ld: cannot find -lf95

gcc* (gfortran* コマンド)

今回はgcc46。gcc42などでも同じ。

インストール
# portinstall -PP gcc46
実行
$ gfortran46 -o hoge hoge.f95

比較

おまけ。

環境
CPU Core 2 Duo T7200 @ 2.00[GHz]
Memory (avail memory) 2929 [MB]
OS FreeBSD 9.0-RELEASE amd64

FreeBSD 用に新しい機材がほしいところ。

ファイルサイズ

定番の Hello World プログラム。

program hello
  print *, 'Hello World!'
end program hello
コマンド名 サイズ [B]
g95 739333
gfortran46 7592

g95 で生成したバイナリのサイズが大きすぎる。
readelf コマンドで見てみると .symtab のシンボルが 705個。
必要ないものも含めてリンクされている様子。

ベンチマーク

理化学研究所で提供されいている「姫野ベンチマーク」を利用。
http://accc.riken.jp/HPC/HimenoBMT.html
クラスタでもなんでもない,単一マシンでの計測なので不適切な選択だろう。

計算サイズは XS 。最適化オプションはどちらも -O3 のみ。

コマンド名 MFLOPS(3回の平均)
g95 507.4465
gfortran46 846.0841

この場合,個別の性能値にはあまり意味はない。
ただ,両者の結果を比較すると,gfortran46 でコンパイルしたバイナリの方が 1.67 倍高い性能を出している。
他のベンチマークなら違う結果かもしれない。

FreeBSDのsystatコマンド

FreeBSDにもLinuxのsysstatみたいなツールはないだろうか。
そうしたら,systatというコマンドがあることを知った(こっちが先?)。


※manに以下のとおり書かれていました。(12/5/15追記)

The systat program appeared in 4.3BSD.


sysstatではなく,systat。
ベースシステムに入っているので,標準で利用可能。

実行方法

$ systat [-display] [refresh-interval]

実行結果

上側にシステムの平均負荷(load average)が表示される。
下側はユーザが指定したコマンド次第で異なる情報が表示される。
(指定しない場合は,CPU利用率の高いプロセスを表示する)

指定できるコマンド

icmp, icmp6, ifstat, iostat, ip, ip6, mbufs, netstat, pigs, swap, tcp, vmstat

例)
$ systat -icmp

  • icmp:icmp情報用
  • icmp6:icmpv6情報用
  • ifstat:ネットワークインタフェースのトラフィック情報用
  • iostat:I/Oの利用情報用
  • ip:IPとUDP通信情報用
  • ip6:IPv6通信情報用(ipと違ってUDPはなし)
  • mbufs:mbuf情報用
  • netstat:ネットワーク接続情報用
  • pigs:CPU使用率の高いプロセス表示用(指定しない場合はこれ)
  • swap:swap領域の使用情報用
  • tcpTCP通信情報用
  • vmstat:色々用.仮想メモリ利用情報,プロセススケジューリング情報,割り込み情報,名前変換キャッシュ情報(パス名→inodeの変換),ディスクI/O情報


":"を入力するとコマンドラインにカーソルが移動する。
そこでコマンドを入力→Enterで別のコマンドの結果に切り替えることができる。