Writing an OS in Rust を読みながらゆっくりRustで自作OS・ブラウザ・CLI作成他低レイヤー
[hello,world!封印]
#![no_std]
だけでhello,world!すら出来なくなった!
上記でprintlnをすると以下のエラー
cannot find macro println in this scope
printlnマクロは標準ライブラリ内のものなのでno_stdで使えなくなる。
そのためスコープにないエラーが出る。
#[panic_handler] function required, but not found:
no_stdはパニックハンドラーも自分で作成する必要がある。
language item required, but not found: eh_personality:
例外処理パーソナリティ関数が見つからない
プログラムが例外(panic)を処理する方法を定義する低レベルな関数
例外が発生した時のリリース解放や後処理を担える。
PanicInfo は名前とか場所とか内容とかパニックが起こった時の情報が格納されている
以下のコードでwarningが出た。
#[no_std]
単純なtypoで正解は以下
#![no_std]
ただ原因について深掘りしたいので以下のエラーコードについても調べてみた。
warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]
クレートレベルの属性は内部属性でないといけないので!を加えて...と言っている。
Rustのクレートレベルの属性とは、Rustのプログラム全体(クレート全体)に適用されるマクロ(指示)のこと。(柵を作るイメージ?)
で、内部属性は
#![foo]
のように先頭に書く必要がある。
Rustだと使用されない変数が出た時にパニックが出るので変数の先頭に_をつけてそれを回避する。
fn main (_foo: &PanicInfo) .....
このコードではfoo変数でPanicInfoを参照して、どんなパニック(Rustのエラーコードのようなもの?)を取得する。
error: language item required, but not found: `eh_personality`
について...
Language Itemとは???
コンパイラに具体的な機能などを伝える。
(どの型がどういうものか、エラーがどういうふうに走るかなど?)
eh_personalityについて:
ehはexception handling...つまり例外処理のこと。
つまり例外処理を定義するlanguageItemが必要だけど無いよ?ということだと思う。
スタックアンワインディングって何?
プログラムがパニックを起こした時に行われる処理で
スタック上の全ての変数の終了処理を順々に呼び出して行く。
これでメモリリークを防いだりやリソースを解放できる。
C言語だとこの仕組みがない(例外処理もない)ので、こちらが明示的にリソースの解放とかメモリリークを防いで行かないといけない。
ただ今回はこれを無効化しておく。(無効化方法は元記事へ)
Rustのランタイムについて
C のランタイムライブラリを呼び出しているらしい...
最後にmainが呼ばれる
今回は#![no_main]を置いてランタイムを無効化する。
#[no_mangle]
通常の場合Rustは一意な関数名を作成するためになっがい識別子を作る。
今回はリンカが関数を見つけられるようにこの修飾子をつける。
pub extern "C"
C言語の呼び出し規約を使う。
_startが大体のデフォのエントリーポイントなのでこの名前にする。
ここでcargo buildすると長文のエラーが出た。🤯
Rustはデフォで今のシステムに合ったファイルをビルドしようとする...(OSのバージョンごとに対応したり)
targettripletでシステム環境を確認して、じゃあそれ用に実行ファイル作ろう!とコンパイラとリンカが判断してエラーとなる。(リンカエラー)
なのでrust用のtargettripletを追加する必要がある。(OSが必要ない)
追加後、
cargo build --target thumbv7em-none-eabihf
のようにすることでビルド成功!👏👏👏
次は遂にカーネル...!
rustにもバージョンがありos作成にはnightyを使用...
targetにもカスタムな設定が必要な部分がありjsonでなんとかしている。
カーネルを作る上で必要な要素をjsonファイルに詰める
エントリポイントは_start限定
ポインタにキャストできるらしい。
0xb8000 as *mut u8;
for (i, &byte) in HELLO.iter().enumerate()
HELLOに対して反復処理
生ポインタを使用するために
unsafe
が必要
*vga_buffer.offset(i as isize * 2) = byte;
VGAバッファ 偶数オフセットに ASCII 書き込み
*vga_buffer.offset(i as isize * 2 + 1) = 0xb;
奇数?に色書き込み
bootloader クレートは、
コンピュータの起動プロセスを管理し、Rust で書かれたカーネルをロードするためのブートローダー
ariyama
nfc:誘導式読み書き通信設備 総務省へ 基本登録
シールドルームやシールドボックス内でやる
RFIDの一種
リーダー/ライター と カード(タグ)
クレジット,パスポート,イヤホン,トークン内などなど
Daikin NFC App:空調用
ISO/IEC
7816 -4で通信プロトコル opensc-tool
レスポンス 末尾のニバイトが各シグナル
シールドの袋がある 傍受
sniffing
select file:7816
verify:31アスキー1
type-bでAndroid端末が通信しようとするパターンがある
type指定が必要
KDF:Androidでオンしている。sha256などで送っているのでパスワードが傍受されない。
Salt Iterationなどのパラメータを共有する
バイトデータを傍受されたら終わり
Secure Messaging: 事前キー共有
後々物理カードの暗号化技術を変更するのは難しい
電子署名技術 秘密鍵 公開鍵
署名用のアルゴリズムがあるので必ずしも複合しない
スマートカード:耐タンパ性 自己破壊機能 CC EAL EMVCo
ぷろっくすまーくすりー:送信すると違法 Androidのレイヤーの内部を知る
suica:feica 国際規格でプロトコルは公開されている。仕組みは公開することで逆に安全が担保される。
チャージ
引き落とし
権限:残高情報は読める ライターから署名値?
14443:Type A TypeB
Type-F 180092
takahashi
大規模計算 並列分散処理
HPC
とにかく計算を早く分散を早く
どうやって協働で動かしている
576ノード
なぜそこまで スピード
三層アーキテクチャ
たくさんのCPUを同時に動かした方がメモリ消費が減る
行列計算でも4に分散するとメモリは1/4
MPI:プロセス並列化
OpenMPやGPU
TEnsor core
プロセス間で通信
Tensor parallel
forward:データをモデルに流して計算
gradient:結果から計算
backward:パラメータ更新
data parallel 全部のモデルをコピーしている
Pipeline Parallel:モデルをレイヤーごとに分割
Tensor Parallel:コーディングがしんどい
ZeRO: 段階ごとに 冗長性を減らす
バッチサイズを増やす?
ZeRO Offload:一部の処理はCPUで処理してGPUに送る
DGX
Accelerate 並列分散 MegatronLM?
GPU付きのJetson
MPI 超 入門
Parallel and Distributed Programming
NVIDIA社員ブログ
データベース 並列処理 大規模になるとライブラリでは対応できない?
通信のトレードオフ・アウトオブインデックス
割算演算 商 0割エラーなどなど
物理的距離がボトルネック 橋と橋のGPUの通信の解消
100ごとのクラスタなどを作る?
ネットワークの研究者
ihara
WASM
セキュリティ:
スタックマシン:限定継続
webassembly:cont 親子関係
generator:実行ごとに 初期化?
コンシューマ:Cに保存される リジューム
resume_throw:
suspend ハンドラ
websocket fetch webtransport webgpu webcodecs 非同期APIともスムーズに可能
http2 プロキシを挟まないと ?
koto
関数型言語の実行モデル
PureScript,Nix
現実は命令型のレジスタ
機械のデザインも?
全てがデータ
関数はデータを別のデータへとマッピングする?
関数の連続 rust
ADT:既存の型から新しい型を構成する
Card Suit Int | Joker
イミュータブル
パターンマッチング
case card of
match関数
λ計算に基づく
チューリングマシンと等価
λ抽象
カリー化
全ての関数は一つの引数しかとらない
が
xを受け取るとyを返す
バケツリレーみたいな感じ?
環境 キャプチャ
抽象機械上で考えてみる
レジスタマシン↔︎スタックマシン
レジスタは状態を変化
スタックマシン
スタックしてポップする
関数型:スタックマシン
SECDマシン
FAM,CAM,ZAM,STGなどなどOCaml Haskell
DAM4G
GML
メモリリスト
closure:番地からスタートする ヒープに作成
apply:
grab:引数に載せてるものをキャプチャして環境にのせる
x y をキャプチャしてzのスコープ?
アロケーションを一回しか実行しないように設計されている。
パターンマッチ:
上から順番に実行 ナイーブだと
無駄な計算になってしまう
compiling pattern matching to good deision trees
小さいパターンマッチングへと分割
上下のパターンマッチ
計算必要な部分で切る
トップレベルのシンボルに注目して分類する
再帰的な分割
幅0のパターンマッチ
高さ0は失敗する
FAST LISP
神戸大学
カリー化:オブジェクトの寿命が伸びる。ポインタが生成 環境の中に入る 参照しないといけない?
ガベージコレクションはどうするか
パケット解析
tam
有線lan:
nas
ハブ:リピーターハブ だと効率が悪い すべてのデータがのぞかれてしまう
スイッチングハブ:宛先だけ送る
無線LAN:パスワードがわかっているとデータを除けてしまう
暗号化されていない状態 災害対応のも
tllss を暗号化されていない
暗号化されていても危険
無理やり復号されてしまう可能性
bluetoothの解析
暗号化
wireshark tcpdump...今のところ違法性はないがモラル的に❌
ネットワーク系の職業
wifiパケット
osi参照モデル
telnetサーバー
スリーハンドシェイク?
7 tcp trying 127.0 ....
4 tcp 20byte ヘッダーの大きさで変わる 最低20byte 一つのパケットごとに数字が上がる
通信終了 開始の フラグ
windowsize 一度に遅れるパケっとのサイズ
アージェントポインタ
3 ip パケット ipv4の4 length Identification
time to live
checksum
2 イーサネット macアドレス
自分と相手 指定
VPN などのプロトコル作成
傍受そのものの対策:wifiの暗号化
ファイヤーウォール 同一セグメント内の話?
L3
途中経路、ファイヤーウォールも怪しい?
有料のVPNを使う?
ネットワーク機器
LANケーブル: P2P通信?
二つのPCをLANケーブルで繋ぎ 同じ サブネットマスクを作成する
pinを送る
Local Area Network
ルーターも増やすとwan widearea network
wifiアクセスポイント: wifiアクセス
DHCPサーバー:DHCPサービス
サーバーを公開する可能性がある。外部公開用のLANを用意する。
ファイアウォール
DMZ サーバーを置いてwebサーバーを置く
itaya
Androidのアップデート
多種多様すぎて更新がしづらい
ハードをモジュール化できないか
project ara:規格を統一したい
自作スマホ?
SoCなのでcpu や メモリの交換が不可
耐久性が難しい
2016に終わる
project treble
CTS/VTS:
メーカー負担は減
効果はあった
カスタムrom
メーカー経由だとアップデートはむずい
Direct アップデート
Google製アプリは簡単に更新できる
mainline
システムの一部をモジュール化
メーカーサポート後も更新できる
VNH5019
公共施設ゴミ箱置きたくない vs ゴミ箱が欲しい
溜まり場
scaventure
施設内を移動 自動で動く
lineで呼ぶなど
ブラシ付きDCモーター
印加電圧によって回転数が変化する
実効的に変更
7.2 0
交流のような 3.6v 実質
pulse width modulation
してくれる何か
マイコン+モータードライバー
md.setM1Speed
shima 24/7
デザインスプリント?
世の中の問題をピックアップし課題を増やす
投票して解決策を絞る
2,3票目はあまり熱心でないものに投票してしまう。
アイデーション手法:
重み付け投票?
greek alpha software academy
スマートフォンのエディタ
ジョイスティックで実装
ショートカットエディタ
プルーフオブコンセプト?
コードをスマホで書きたい
コーディング ブロックを組み合わせて? ビジュアルプログラミング
leetcode などを電車で解きたいなどなど
kazu
コンパイラ
コードからターゲットプログラムを出力する
elf
再配置可能ファイル
実行可能ファイル
共有オブジェクトファイル
一つのファイルのみ:
複数ファイル:
リンカ で 一つ
llvm:コンパイラ基盤
IR中間表現 モジュール性?
X86バックエンド
ARMバックエンド
RISC-Vバックエンド
アセンブリコードとオブジェクトコード
a.out 実行可能ファイル リンク後
mac maco
モダンな言語のコンパイラ
swiftc
抽象構文木
字句解析器
型検査
意味解析
名前解決
yacc
tokenを割り振る どういう構文かをパースする
アブルトラクト
意味解析後
SIL
定数畳み込み
コンパイラ作成入門
swiftc:機能が多い メモリ管理の方法
swift-wasm
URL SHORTENER
postリクエスト
getリクエスト
ステータスコード
短縮URLサービス
先に使用されている
リダイレクトで情報が失われる