自作言語 on 自作os +α
この記事は自作OS Advent Calendar 2017 - Adventarの22日目の記事です。
タイトルからお察しの通り、予定されていた「真acpi入門」は死亡しました。能力不足です。。
hariboteOSしか作った事無いのに背伸びし過ぎましたね。。僕は何も分かってない事が分かりました。
また今度リベンジしたいです。
ということで、「自作言語 on 自作os」 を書いていきたいと思いまつ!
間違っていたら指摘お願いします;;
自作言語とは
流れ
ファイル等から文字を読み取る
↓
字句解析と構文解析、つまり特定のフレーズに反応して処理を行う。
(追記)
ご指摘を受けたので追記します。
字句解析は単語を分解すること、構文解析は単語の並びを解析すること。
「字句解析→フレーズに反応して処理を行う」は間違っていました。
「字句解析+構文解析→フレーズに反応して処理を行う」が正しいと思います。
この言語ではその処理を一緒に行っているので違いが分かっていなかったです。
(追記終わり)
多分基本はこうなんじゃないかなぁ、と思います。コンパイラ、オブジェクト指向、最適化、型推論、とか色々発展はあると思いますが。
つまりOS自作入門(30日本)の30日目のcalcアプリケーションと同じ感じなんですよね。
そう、アプリケーションなんです。よって別に自作OS上だからといって特別なことは何もなく、普段使いのPCで動く自作言語がほぼそのまま移植できます。(I/Oの違い等によるライブラリの差はある)
「自作言語 on 自作 OS 」というフレーズはカッコイイんですけどね、、
という事で、四則演算と標準出力しか実装が終わってない僕の自作言語から提供できる話はございません!!
(一応ソースはここ!)
zuvizudar-os/app/zuv at master · zuvizudar/zuvizudar-os · GitHub
fh=api_fopen(p); //ファイルを開く ~ api_fread(&c,1,fh) //cにfhから1文字入れる(文字を読み取る) ~ if(strncmp(p,"print",5)==0) //文字列と一致したら処理!
ふぅ、タイトルを回収してしまいました。
ここで終わるのも寂しいので、「「自作言語 on 自作 OS 」の周辺」について書きたいと思います。
つまり、hariboteOSにおけるファイル書き込みAPIとエディタのお話です。
fwrite on hariboteOS
追加したAPIは3つ。
fopen_w,fclose_w,fwrite
やっていることはFAT12への書き込みです。
api_fopen_w(char *fname); :ファイルを開ける。
api_fwrite(char *buf, int maxsize, int fhandle); :bufをfhにコピー
api_fclose_w(int fhandle); :fhをclose&fatに保存。fatは空いている所を探す
zuvizudar-os/console.c at a615d487c1ca9c1878cb502ced59ecbfbe0fdfd4 · zuvizudar/zuvizudar-os · GitHub
vim
コンソールとtviewを組み合わせた様な感じです。
vim a.txt
保存出来ている事が確認できます
自作言語実行!
(これは誰がなんと言おうとvimなんだ、、)
(-s はソースを表示するオプションです。)
zuvizudar-os/app/vim at master · zuvizudar/zuvizudar-os · GitHub
あとがき
もう少し自作言語を凝りたかったんですが、acpiに時間を盗まれてしまいました。。
パケットの学び(超初級編)
この記事はseccamp2017 Advent Calendar 2017 - Adventarの15日目の記事です。
初ブログ&知識が拙い なので間違いがあれば指摘お願いします。
パケットとは
情報伝送の一単位。伝送・交換に必要な情報を付したもの。
らしいです。
今回色々コードを書いてみて、まさにpacket(小包)だなぁと感じました。
パケットを解析する
基本的にはプロトコルによって「定められたサイズ」ごとにパケットを区切っていく作業です。
お弁当箱に仕切りを入れる感じですね。
ゲームのバイナリを解析したときもこんな感じで進めていったのを思い出しました。
流れ
まず、「定められたサイズ」というのはヘッダーに書いてあるのでインクルード
↓
ファイルディスクリプタであるsocketを得る
↓
soketからパケットを読み取る
↓
上図の流れでパケットの種類を判別する (チェックサムも行う)
↓
「定められたサイズ」に区切る→種類ごとの構造体にキャストする(型抜きでズバッと)
arp=(struct ether_arp *)ptr; //ptrが元data
↓
表示する
詳しくはここのソースを見れば分かると思います
packet/packet_analyze at master · zuvizudar/packet · GitHub
pingを自作する
流れ
ICMPのサイズ分のパケットを目的地IPに送りつける。
↓
目的地IPに反応があればICMPで帰ってくるので解析
packet/ping at master · zuvizudar/packet · GitHub
チェックサムについて
受信者はなにも気にせずパケット全体の「1 の補数和の 1 の補数」を取り、チェックサムが 0x0000 になるか確かめればよい。
「1 の補数和の 1 の補数」を使うと、チェックサムが正しく含まれているデータのチェックサムを計算するとゼロになる性質があるらしいです。
使うだけなら深く考えなくても大丈夫、、
メモ
SIOCGIFINDEX ...Socket Input Output Configuration Get InterFace INDEX の略(?)
ntoa ... Network byte order TO Address の略(?)
ntohs ... Network byte order TO HoSt byte order の略(?)
感想
思っていたよりずっと単純ですよね。
参考書:
Amazon CAPTCHA
書いたソースは多少の改造はあるもののping以外この本の物です。これからブリッジ、ルーターを作っていくそうなので楽しみです。
めっちゃ面白いのでおすすめです!
おまけ
伸びました。パワーワードという奴ですね。”パケットの気持ち”""パケットの気持ち"" pic.twitter.com/yO5KfvKj6p
— けいと (@zuvizudar) 2017年11月11日