本当に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さんありがとうございました。
- 作者: 川合秀実
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2006/03/01
- メディア: 単行本
- 購入: 36人 クリック: 735回
- この商品を含むブログ (299件) を見る
builderscon2018に参加してきました
builderscon2018に参加してきました。
各talkについては資料とそのうちyoutubeに動画が上がるので見てもらった方が良いです。
知らなかったことをしる。というテーマの通り、日常生活をしていては知り得ないJavaCardの話やraspiでものすごく楽しそうに開発をする話、QuicやEnvoyなどの話題について知ることが出来ました。
電子名刺の作成過程を死ぬほど楽しそうに発表していたうずらさんがすごく印象に残っています。
以下、きになった技術などのメモ書きです。
## QUIC
kazuhoさんの発表でTLS1.3とQUICについて
個人的にはこれが一番興味深くて、「スノーデン事件」とかあの辺好きなら楽しめると思います。
transport層からすげ替えるんですね。各技術の問題点とそれをどう克服したのかが楽しく説明されていてワクワクしながら聞いてました。
## Envoy
Envoyとは大規模で近代的なサービス指向アーキテクチャー向けに設計されたL7プロキシーおよび通信バス
所謂microserviceについて回る問題を解決するためのproxy。
導入したいので、自分でも検証してみよう。
中身がC++11なので復習しないといけない。
+ https://speakerdeck.com/seikoudoku2000/envoy-externals-and-ideas-builderscon-2018
+ https://www.youtube.com/watch?v=RVZX4CwKhGE
## Kubernetes
カンファレンスの中で一番登場回数が多かった気がします。
この間でたと思ったのに、普通に運用されてるんだな。
- https://kubernetes.io/docs/home/?path=users&persona=app-developer&level=foundational
- https://www.slideshare.net/teppeis/kintone-awsdvopsqa-111906067
開催者、発表者、スタッフの皆様お疲れ様でした。
素晴らしいカンファレンスでした。
ありがとうございます。
macでのperoの設定
こちらのツールが非常に素晴らしかったので周りの人に紹介するために書いてます。
本日時点だと以下の手順を踏まないとつかえません。
そのうち、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を始めるにあたり、皆様はどうしているでしょうか?
- A Tour of Go
- Packages - The Go Programming Language
- Command Documentation - The Go Programming Language
- The Go Programming Language Specification - The Go Programming Language
- The Go Memory Model - The Go Programming Language
などを見て始める方がいらっしゃる一方、 本を手にとって始めて見る方も一定数いらっしゃるかと思います。やはり日本語で書かれていること、本を書かれた方の知見などが得られるのは大きいのではないでしょうか。ここ最近、日本でもGoが流行っているせいか割と多くの本が出版されています。 私も本を読むのが好きなせいもあり、出版されて目立つ物は買って読んでいました。 自分よりその分野に詳しい人が、本を書くという過程で不要な情報をそぎ落とし精製された文章は読んでいてとても楽しいです。そんな感じで本が好きなので、同僚に「どの本がおすすめ?」なんて聞かれるのは割と楽しいわけです。そう言う場合、相手は同僚なのでスキル傾向とかやりたいこととかある程度分かっているので、
- 入門じゃ無くてもうちょい深いところを知っときたい
- Windowsで動かす予定があるのでその辺の知識が欲しい
- 並列周り知りたい
という事前情報がありました。
もうちょい深くということで、
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- 作者: Alan A.A. Donovan,Brian W. Kernighan,柴田芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2016/06/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
と
Windows対応と言うことで、
- 作者: 松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太,稲葉貴洋
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/09
- メディア: 大型本
- この商品を含むブログ (2件) を見る
と
並列周りということで、
- 作者: 小出淳子,黒澤剛志,牧大輔,横江亮佑,山口貴也,尾藤正人,佐藤琢哉,中橋研太郎,田中慎司,小西裕介,伊藤直也,稲富駿,前島真一,長野雅広,山際康貴,のざきひろふみ,うらがみ,岡林大,遠藤雅伸,ひげぽん,海野弘成,はまちや2,竹原,大場寧子,大場光一郎,野々下裕子,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2016/10/22
- メディア: 大型本
- この商品を含むブログを見る
をおすすめしたんですが、 「僕の小遣いじゃ、全部は辛いすね。」 というお返事がかえってきまして、うーん。そういう事情もありますよね。そうなると、この中で一番コスパが良い「プログラミング言語Go」をおすすめしました。( 460pあって4000円ぐらいのお値段はお得ですよ。
- Goの機能について一通り紹介している
- 特に以下は読むまで詳しく知らなかった
- forによる文字列連結のコスト
- UnicodeやUTF-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/
node-nopasteを作りました
npm installで手軽に入るnopasteが欲しかったので作ってみました。
- npm installでよほどnodeのバージョンが古くない限りは入るはずです。
- defaultの挙動がonmemoryなのでserverを落とすとそのままデータが消えます。
- nopaste本来の役割が一時的なデータの保存であるという意味合いがあるのでこうなっています。
- 永続化を希望する場合は、redisを立ち上げて環境変数からredisを指定してください。
npm install node-nopaste
まだ0.0.1なので改善したいところなどありますが
ちまちまアップデートしていこうかと考えています。