本当に30日で自作OSに入門可能なのか検証記録

この記事は自作OS Advent Calendar 2018の21日目の記事です。

こんにちは、hiroyukimです。自作OS超初心者枠で書いています。前々からOSは興味がありつつ忙しさにかまけてLinux Programming Interfaceとか読んでシステムコール越しに触れるとかしかしてなかったので、「30日で出来る自作OS入門」を30日で出来るのかやってみました。結論から言うと色々忙しすぎて最後の3日ぐらいは手を付けられませんでした。

ただですね、タイトルにあるように入門は可能だと思います。エミュレータからの起動、バイナリエディタでのマシン語アセンブラ、CPUの各種機能とそれをどう使うかの解説。低レイヤーを知りたいが手を出す機会がないと考えている人がいるなら是非読むべきだと思いました。もちろん1周廻っただけで完全に理解したとも思ってはいないし、他の環境で作れますかと言われれば厳しいですが、このまま自作OS方面を文字通りこの本を入門として深掘りしていけばどこかでそうなれるんじゃ無いかなと思わせてくれる良書でした。

以下は、自分なりに興味のある部分の感想等を書いてみました。基本的にウインドウ周りよりはエミュとかアセンブラ周りに興味が集中していたので前半が多いのですが。

QEMUというエミュレータ。前々から存在は知っていたのですが、本格的に意識して見たのは初めてです。本家のサイトを見に行くとthe FAST! processor emulator と書かれていますね(関係ないのですが、いまQEMUのサイトを覗いたらqemu-advent-calendarというものがありました)。 本の中ではcpuのエミュレータを使ってその上でOSのimgを動かすということをしていました。

naskというアセンブラ。これ、すごく嬉しくて今までアセンブラを学んでも使う機会が全くといって良いほど無かったので、具体的にOSを作るという目的でアセンブラのコードをいじれたのはテンションが上がりました。 しかも、ORG命令、JMP命令、レジスタとか言った物がどういう代物で何のために使うのかという解説がひたすらされてるんですよ。OSの勉強をしてると思ったらCPUとアセンブラの姿が頭に浮かんできて、これが自作OSを学と言うことかと感動しました。 あとは、昔から知識としては知っていたのだけど、CPUの16bitモードと32bitモードの話はも良かったです。( BIOSが16ビット用の機械語で書いてあるので32bitからは利用できないとか)

この本読んでいると、C言語というかコンピュータ言語の本来の姿が、アセンブラ機械語へ変換するための記法なんだなというコトが浮かび上がってきて、高いレイヤーにいると意識しづらい所なので いいですね。

マルチタスク。これの実現方法がタスクスイッチ。戻ってきたときに処理が再開出来るようにレジスタの値をメモリに書き込む処理。再開するときはメモリからレジスタに読み込とか。この辺でETPとか出てきて、これはこういう風に使うんだなと思いながらやってました。

あとは、どのセクタから読み出すとか、mallocとか、VRAM、メモリ管理とか1個づつ、現代ではどうなっているのかとか、一般的なOSはどうやっているのかとか無限に深掘り出来そうな内容が多かったです。まだ読んでない方是非読まれることをおすすめします。

あと、この場を借りて、お礼を言っておきたいのですが、Mac環境の整備を行っている方々がいらっしゃいましてこれらの成果を受け取ることが出来たのでなんとか進めることが出来ました。ありがとうございます。アセンブラ系の10年ほど前の本を読んだことあると分かると思いますが、少し昔の本だと環境構築をすることそのものが恐ろしく手間かそもそも同一環境を手に入れることがかなり厳しいことがある中で、2018年現在でも動作できる環境があることに驚きました。本自体が名著でファンが多い故と思われます。

最後に、カレンダー投稿機会を提供してくれたuchanさんありがとうございました。

30日でできる! OS自作入門

30日でできる! OS自作入門

builderscon2018に参加してきました

  1. https://builderscon.io/tokyo/2018
  2. https://qiita.com/kou-sy/items/f0a97c524148d7633abe

builderscon2018に参加してきました。
talkについては資料とそのうちyoutubeに動画が上がるので見てもらった方が良いです。
知らなかったことをしる。というテーマの通り、日常生活をしていては知り得ないJavaCardの話やraspiでものすごく楽しそうに開発をする話、QuicやEnvoyなどの話題について知ることが出来ました。

電子名刺の作成過程を死ぬほど楽しそうに発表していたうずらさんがすごく印象に残っています。

twitter.com


以下、きになった技術などのメモ書きです。

## QUIC

twitter.com

kazuhoさんの発表でTLS1.3とQUICについて

個人的にはこれが一番興味深くて、「スノーデン事件」とかあの辺好きなら楽しめると思います。
transport層からすげ替えるんですね。各技術の問題点とそれをどう克服したのかが楽しく説明されていてワクワクしながら聞いてました。


## Envoy

Envoyとは大規模で近代的なサービス指向アーキテクチャー向けに設計されたL7プロキシーおよび通信バス
所謂microserviceについて回る問題を解決するためのproxy。
導入したいので、自分でも検証してみよう。
中身がC++11なので復習しないといけない。

  1. https://github.com/envoyproxy/envoy
  2. https://qiita.com/seikoudoku2000/items/9d54f910d6f05cbd556d

+ https://speakerdeck.com/seikoudoku2000/envoy-externals-and-ideas-builderscon-2018
+ https://www.youtube.com/watch?v=RVZX4CwKhGE

## Kubernetes

カンファレンスの中で一番登場回数が多かった気がします。
この間でたと思ったのに、普通に運用されてるんだな。

  1. https://kubernetes.io/docs/home/?path=users&persona=app-developer&level=foundational
  2. https://www.slideshare.net/teppeis/kintone-awsdvopsqa-111906067


開催者、発表者、スタッフの皆様お疲れ様でした。
素晴らしいカンファレンスでした。
ありがとうございます。

macでのperoの設定

blog.kazuhooku.com


こちらのツールが非常に素晴らしかったので周りの人に紹介するために書いてます。
本日時点だと以下の手順を踏まないとつかえません。
そのうち、peco本家が対応するとは思いますが、周囲に広めたいので書き残しておきます。

5.0以上じゃないと動かないのでbrew版があるなら消します

brew uninstall peco
Uninstalling /usr/local/Cellar/peco/0.4.9... (6 files, 4.2M)

依存しているものをいれます

brew install source-highlight less

最新版のpecoをinstallします

go get github.com/peco/peco
cd $GOPATH/src/github.com/peco/peco
make
cp releases/peco_darwin_amd64/peco $GOPATH/bin

必要な設定をする

export LESS='-R -N'
export LESSOPEN='| /usr/local/bin/src-hilite-lesspipe.sh  %s'

初回公開時に `/usr/local/bin/src-hilite-lesspipe.sh ` が違うパスになっていました。

cat > ~/bin/pero

#! /bin/sh

exec ack "$@" . | peco --exec 'awk -F : '"'"'{print "+" $2 " " $1}'"'"' | xargs less '
chmod + ~/bin/pero

agでファイル出力時もterminalと同じように閲覧したい

agことthe_silver_searcherをterminal上で使用した場合以下のような形式で出力されます

ag isatty
src/options.c
355:    if (!isatty(fileno(stdout))) {

src/print_w32.c
50:        !isatty(fileno(fp)) ||

これをファイルなどに書き込んだ場合、ファイルパスが先頭についた形で出力されます。

src/options.c:355:    if (!isatty(fileno(stdout))) {
src/print_w32.c:50:        !isatty(fileno(fp)) ||

これは出力先がterminalかどうかをisattyで判定しているので起きているのですが

351     /* If we're not outputting to a terminal. change output to:
352         * turn off colors
353         * print filenames on every line
354      */
355     if (!isatty(fileno(stdout))) {

terminalで見てる感じでファイルにも出力したいよねという感じでラーメン好きな人に相談したら

ag --heading --numbers isatty

こちらのオプションで似たような出力を得ることができました。

src/options.c
355:    if (!isatty(fileno(stdout))) {

src/print_w32.c
50:        !isatty(fileno(fp)) ||

便利ですね。

なお、こちらで使用されたagは以下のバージョンを使用しております

ag --version
ag version 1.0.2

Features:
  +jit +lzma +zlib

Goで読んだ本-とある同僚からの相談

この記事は Go (その2) Advent Calendar 2016 - Qiita の 18 日目の記事です。

Goを始めるにあたり、皆様はどうしているでしょうか?

などを見て始める方がいらっしゃる一方、 本を手にとって始めて見る方も一定数いらっしゃるかと思います。やはり日本語で書かれていること、本を書かれた方の知見などが得られるのは大きいのではないでしょうか。ここ最近、日本でもGoが流行っているせいか割と多くの本が出版されています。 私も本を読むのが好きなせいもあり、出版されて目立つ物は買って読んでいました。 自分よりその分野に詳しい人が、本を書くという過程で不要な情報をそぎ落とし精製された文章は読んでいてとても楽しいです。そんな感じで本が好きなので、同僚に「どの本がおすすめ?」なんて聞かれるのは割と楽しいわけです。そう言う場合、相手は同僚なのでスキル傾向とかやりたいこととかある程度分かっているので、

  • 入門じゃ無くてもうちょい深いところを知っときたい
  • Windowsで動かす予定があるのでその辺の知識が欲しい
  • 並列周り知りたい

という事前情報がありました。

もうちょい深くということで、

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

Windows対応と言うことで、

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

並列周りということで、

WEB+DB PRESS Vol.95

WEB+DB PRESS Vol.95

をおすすめしたんですが、 「僕の小遣いじゃ、全部は辛いすね。」 というお返事がかえってきまして、うーん。そういう事情もありますよね。そうなると、この中で一番コスパが良い「プログラミング言語Go」をおすすめしました。( 460pあって4000円ぐらいのお値段はお得ですよ。

  • Goの機能について一通り紹介している

- 特に以下は読むまで詳しく知らなかった
- forによる文字列連結のコスト
- UnicodeUTF-8の話
- 定数生成器 iota
- 構造体埋め込みと無名フィールド
- 無名関数のところにあるループ変数の捕捉
- 構造体埋め込みによる型の合成

  • 並行処理も2章さかれていて分かりやすい
  • Cとの接続方法であるcgoの使い方も書かれています

あと、大きなポイントと言えば ブライアン・カーニハンが書いてるのと、 割と大きな声で、「読んだ本?プログラミング言語Go読みましたよ。」って言える。ということろでしょうか。

ただ、個人的には他の2冊もお金が許すならおすすめです。

  • みんなのGo

- 言語を軽く学んだ後、次にやるべきコトが列挙されている
- 著者が活発に開発されている方が多いので経験からくるもので信頼できる
- 一般的な開発などをよく知らない人にはかなりお勧め
- マルチプラットフォームで動作する社内ツールのつくり方 は余り知る機会がすくないのでいい
- The Dark Arts Of Reflections 不可能を可能にする黒魔術 はこの手の黒魔術は知っておくとちょっと上達した気になれるのでいい

  • WEB+DB PRESS Vol.95 特集2 Goによる並行処理 複雑な処理をスイスイ書こう!

- マルチプロセスとマルチスレッド方式という、これまでの並列処理についての特徴などを解説していて並列処理どうしたらいいのてきな人におすすめ
- 美味しいのは、著者のpecoというツールを作る過程で得られた知見とpecoについて詳しく書かれている点です。


クリスマスですし、年末年始の長期休暇にも突入しますし、読んでない方いらっしゃいましたらこれを機会に読んでみられてはいかがでしょうか。

言語間に寄るsplitの仕様の差異

たまたま、goで書かれた物をperlへ移植しようとしていたらsplitの挙動の差が出てきまして、他の言語の場合どうなるんだろうとぱっと思いついた言語で実行して見ました。以下の文字列を言語標準でついている文字列のsplitを実行した結果となります。

"/path/to/hoge/"
言語 結果
perl(5.12) ['','path','to','hoge']
golang(1.5) ["" "path" "to" "hoge" ""]
ruby(2.1) ["", "path", "to", "hoge"]
ptyhon(2.7.8) ['', 'path', 'to', 'hoge', '']
js [ '', 'path', 'to', 'hoge', '' ]
perl6 ("", "path", "to", "hoge", "") # (perl6-m -e 'say "/path/to/hoge/".split("/").perl')
clojure(1.4.0) ["" "path" "to" "hoge"]
php(5.5.14) [0] => [1] => path [2] => to [3] => hoge

単純にsplitをした結果、末尾の扱いに差異が見られました。


言語の樹形図を遡っていけばなんか分かるのですかね。


http://gigazine.net/news/20070126_computer_languages_history/

追記

結果の例の字がtypoしてました。これは、言語別に試したときにtypoしていたようです。

node-nopasteを作りました

npm installで手軽に入るnopasteが欲しかったので作ってみました。

  1. npm installでよほどnodeのバージョンが古くない限りは入るはずです。
  2. defaultの挙動がonmemoryなのでserverを落とすとそのままデータが消えます。
    1. nopaste本来の役割が一時的なデータの保存であるという意味合いがあるのでこうなっています。
    2. 永続化を希望する場合は、redisを立ち上げて環境変数からredisを指定してください。

www.npmjs.com

npm install node-nopaste

まだ0.0.1なので改善したいところなどありますが
ちまちまアップデートしていこうかと考えています。