Open35

Writing an OS in Rust を読みながらゆっくりRustで自作OS・ブラウザ・CLI作成他低レイヤー

nk_worknk_work

上記でprintlnをすると以下のエラー
cannot find macro println in this scope
printlnマクロは標準ライブラリ内のものなのでno_stdで使えなくなる。
そのためスコープにないエラーが出る。

nk_worknk_work

#[panic_handler] function required, but not found:

no_stdはパニックハンドラーも自分で作成する必要がある。

nk_worknk_work

language item required, but not found: eh_personality:

例外処理パーソナリティ関数が見つからない
プログラムが例外(panic)を処理する方法を定義する低レベルな関数
例外が発生した時のリリース解放や後処理を担える。

nk_worknk_work

PanicInfo は名前とか場所とか内容とかパニックが起こった時の情報が格納されている

nk_worknk_work

以下のコードでwarningが出た。

#[no_std]

単純なtypoで正解は以下

#![no_std]

ただ原因について深掘りしたいので以下のエラーコードについても調べてみた。

warning: crate-level attribute should be an inner attribute: add an exclamation mark: #![foo]

クレートレベルの属性は内部属性でないといけないので!を加えて...と言っている。
Rustのクレートレベルの属性とは、Rustのプログラム全体(クレート全体)に適用されるマクロ(指示)のこと。(柵を作るイメージ?)
で、内部属性は

#![foo]

のように先頭に書く必要がある。

nk_worknk_work

Rustだと使用されない変数が出た時にパニックが出るので変数の先頭に_をつけてそれを回避する。

fn main (_foo: &PanicInfo) .....

このコードではfoo変数でPanicInfoを参照して、どんなパニック(Rustのエラーコードのようなもの?)を取得する。

nk_worknk_work
error: language item required, but not found: `eh_personality`

について...
Language Itemとは???
コンパイラに具体的な機能などを伝える。
(どの型がどういうものか、エラーがどういうふうに走るかなど?)

eh_personalityについて:
ehはexception handling...つまり例外処理のこと。
つまり例外処理を定義するlanguageItemが必要だけど無いよ?ということだと思う。

nk_worknk_work

スタックアンワインディングって何?

プログラムがパニックを起こした時に行われる処理で
スタック上の全ての変数の終了処理を順々に呼び出して行く。
これでメモリリークを防いだりやリソースを解放できる。

C言語だとこの仕組みがない(例外処理もない)ので、こちらが明示的にリソースの解放とかメモリリークを防いで行かないといけない。

ただ今回はこれを無効化しておく。(無効化方法は元記事へ)

nk_worknk_work

Rustのランタイムについて
C のランタイムライブラリを呼び出しているらしい...
最後にmainが呼ばれる

今回は#![no_main]を置いてランタイムを無効化する。

nk_worknk_work
#[no_mangle]

通常の場合Rustは一意な関数名を作成するためになっがい識別子を作る。
今回はリンカが関数を見つけられるようにこの修飾子をつける。

nk_worknk_work
pub extern "C"

C言語の呼び出し規約を使う。
_startが大体のデフォのエントリーポイントなのでこの名前にする。
ここでcargo buildすると長文のエラーが出た。🤯

nk_worknk_work

Rustはデフォで今のシステムに合ったファイルをビルドしようとする...(OSのバージョンごとに対応したり)

targettripletでシステム環境を確認して、じゃあそれ用に実行ファイル作ろう!とコンパイラとリンカが判断してエラーとなる。(リンカエラー)

なのでrust用のtargettripletを追加する必要がある。(OSが必要ない)
追加後、

cargo build --target thumbv7em-none-eabihf

のようにすることでビルド成功!👏👏👏

nk_worknk_work

rustにもバージョンがありos作成にはnightyを使用...

nk_worknk_work

targetにもカスタムな設定が必要な部分がありjsonでなんとかしている。

nk_worknk_work

カーネルを作る上で必要な要素をjsonファイルに詰める

nk_worknk_work

ポインタにキャストできるらしい。

0xb8000 as *mut u8;
nk_worknk_work
for (i, &byte) in HELLO.iter().enumerate()

HELLOに対して反復処理

nk_worknk_work

*vga_buffer.offset(i as isize * 2) = byte;

VGAバッファ 偶数オフセットに ASCII 書き込み

*vga_buffer.offset(i as isize * 2 + 1) = 0xb;

奇数?に色書き込み

nk_worknk_work

bootloader クレートは、
コンピュータの起動プロセスを管理し、Rust で書かれたカーネルをロードするためのブートローダー

nk_worknk_work

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

nk_worknk_work

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ごとのクラスタなどを作る?
ネットワークの研究者

nk_worknk_work

ihara
WASM

セキュリティ:
スタックマシン:限定継続
webassembly:cont 親子関係
generator:実行ごとに 初期化?

コンシューマ:Cに保存される リジューム

resume_throw:

suspend ハンドラ

websocket fetch webtransport webgpu webcodecs 非同期APIともスムーズに可能

http2 プロキシを挟まないと ?

nk_worknk_work

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
神戸大学

カリー化:オブジェクトの寿命が伸びる。ポインタが生成 環境の中に入る 参照しないといけない?
ガベージコレクションはどうするか

nk_worknk_work

パケット解析
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を使う?

nk_worknk_work

ネットワーク機器
LANケーブル: P2P通信?

二つのPCをLANケーブルで繋ぎ 同じ サブネットマスクを作成する

pinを送る

Local Area Network

ルーターも増やすとwan widearea network

wifiアクセスポイント: wifiアクセス

DHCPサーバー:DHCPサービス

サーバーを公開する可能性がある。外部公開用のLANを用意する。
ファイアウォール
DMZ サーバーを置いてwebサーバーを置く

nk_worknk_work

itaya
Androidのアップデート
多種多様すぎて更新がしづらい

ハードをモジュール化できないか
project ara:規格を統一したい
自作スマホ?

SoCなのでcpu や メモリの交換が不可
耐久性が難しい

2016に終わる

project treble
CTS/VTS:
メーカー負担は減
効果はあった
カスタムrom

メーカー経由だとアップデートはむずい

Direct アップデート
Google製アプリは簡単に更新できる

mainline
システムの一部をモジュール化
メーカーサポート後も更新できる

nk_worknk_work

VNH5019

公共施設ゴミ箱置きたくない vs ゴミ箱が欲しい

溜まり場

scaventure
施設内を移動 自動で動く

lineで呼ぶなど

ブラシ付きDCモーター

印加電圧によって回転数が変化する

実効的に変更
7.2 0

交流のような 3.6v 実質
pulse width modulation
してくれる何か
マイコン+モータードライバー

md.setM1Speed

nk_worknk_work

shima 24/7

デザインスプリント?
世の中の問題をピックアップし課題を増やす
投票して解決策を絞る
2,3票目はあまり熱心でないものに投票してしまう。

アイデーション手法:
重み付け投票?

greek alpha software academy

スマートフォンのエディタ
ジョイスティックで実装

ショートカットエディタ

プルーフオブコンセプト?
コードをスマホで書きたい
コーディング ブロックを組み合わせて? ビジュアルプログラミング
leetcode などを電車で解きたいなどなど

nk_worknk_work

kazu
コンパイラ
コードからターゲットプログラムを出力する

elf
再配置可能ファイル
実行可能ファイル
共有オブジェクトファイル

一つのファイルのみ:

複数ファイル:
リンカ で 一つ

llvm:コンパイラ基盤
IR中間表現 モジュール性?
X86バックエンド
ARMバックエンド
RISC-Vバックエンド

アセンブリコードとオブジェクトコード
a.out 実行可能ファイル リンク後

mac maco

モダンな言語のコンパイラ
swiftc
抽象構文木
字句解析器

型検査
意味解析
名前解決

yacc

tokenを割り振る どういう構文かをパースする
アブルトラクト
意味解析後
SIL
定数畳み込み

コンパイラ作成入門

swiftc:機能が多い メモリ管理の方法
swift-wasm

nk_worknk_work

URL SHORTENER
postリクエスト
getリクエスト

ステータスコード

短縮URLサービス
先に使用されている
リダイレクトで情報が失われる