by shigemk2

当面は技術的なことしか書かない

Unix

Unixの歴史をなんとなく思い出すのアレ

Unixの歴史をなんとなく思い出す - by shigemk2useraddは確かSVR4由来のコマンドで、SolarisやHP-UXにもあります。2016/02/08 12:29b.hatena.ne.jp Unixの歴史をなんとなく思い出す - by shigemk2[UNIX]OS Xだとユーザー作るのに正統的なのはniloadかniclじ…

Unixの歴史をなんとなく思い出す

Macにuseraddコマンドがないな…って思ったので、いろいろ調べていたらば、やっぱりUnixの歴史を思い出さねば、という気持ちに駆られました。 WikipediaのHistory of Unixのページのこの画像を見たらば、もう説明不要ッ!ってなります。変な説明をするとマサ…

main()

読んでもあまりおもしろくない、らしい P430 ken/main.c /* * Initialization code. * Called from m40.s or m45.s as * soon as a stack and segmentation * have been established. * Functions: * clear and free user core * find which clock is config…

ttstart

端末への出力処理を行う /* * Start output on the typewriter. It is used from the top half * after some characters have been put on the output queue, * from the interrupt routine to transmit the next * character, and after a timeout has fini…

端末への出力

ユーザプログラムが端末にwriteシステムコールを発行 ユーザ空間のデータがtty.t_outqに追加 tty.t_outqの先頭データをKL11レジスタに設定して端末の出力処理を開始 出力端末の動作が完了するとKL11が割り込みをかけて、割り込みハンドラはtty.t_outqにデー…

入力されたデータの読み込み

入力されたデータは以下の流れでユーザ空間に読み込まれる ユーザプログラムが端末に対してreadシステムコールを発行 tty.t_rawqからデータを読み出し、tty.t_canqへデータを移す tty.t_canqのデータをユーザ空間に呼び出す klread(データをユーザ空間に読み…

端末からの文字入力

概要 P403 1文字入力したら割り込みが発生 変換した値をtty.t_rawqに追加 割り込みのハンドラ マイナー番号に対応するtty構造体をkl11[]から取得し、kl11の入力レジスタから入力された値を取得する 受信可能状態にしたあとにttyinputを実行 dmr/kl.c klrint(…

sgtty

sgtty dmr/tty.c gttyとsttyの実際の処理 /* * Stuff common to stty and gtty. * Check legality and switch out to individual * device routine. * v is 0 for stty; the parameters are taken from u.u_arg[]. * c is non-zero for gtty and is the plac…

gttyとstty

P399 カーネルランドにある端末の情報をユーザランドに書き込むのがgtty 逆にユーザランドにある端末の情報をカーネルランドに書き込むのがstty 書き込み先の指定はsgtty関数で行う(処理は丸投げ) suwordはカーネル→ユーザ fuwordはユーザ→カーネル dmr/tty.…

klopen()

端末のオープン処理を行うデバイスドライバである。 openシステムコールを発行うるとklopenが実行される。 該当端末のアドレスを算出して、tty構造体とレジスタの初期設定を行う。 klopen(dev, flag) { register char *addr; register struct tty *tp; if(de…

KL11/DL11

端末関連のソースコードは「端末共通の処理」と「各端末インターフェース専用のデバイスドライバ」に分かれる KL11/DL11 16ビットのレジスタを4つ持つ 1つのポートを持って1つの端末と接続出来、かつKL11/DL11インターフェースはシステムに複数接続される。 …

maptabとpartab

maptab[] 端末は文字セットにASCIIコードを用いる 純粋な文字として扱うためには\のあとに入力しないといけない文字をmaptabで管理している dmr/tty.c /* * Input mapping table-- if an entry is non-zero, when the * corresponding character is typed pr…

tty構造体 P386

各端末は対応するtty構造体を持つ。(tty.h) バッファキューを3つ持つ。 [Q&A] バッファとキューについて 【OKWave】 ttyのフラグがあったりttyの状態フラグがあったりする struct tty { struct clist t_rawq; /* input chars right off device */ struct cli…

v6本 P384-P386 メモ #firstv6

テレタイプ端末 - Wikipedia シリアル通信 - Wikipedia パラレル通信 - Wikipedia Unibus - Wikipedia バス (コンピュータ) - Wikipedia はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ (Software Design plus)新品価格¥3,456から(2014/7/…

仕様書を基にリファクタリング その1 #ikebin

今週はExcelにスクショを貼るのがトレンドらしいですが、 逆にExcelをスクショしてみた。 mov命令でImmediate to Register/Memoryかつw=1、つまりデータありのやつを一つの関数にまとめる。 まとめるっていうか、一つの関数に押し込んだだけなのだが。

MMU

memory management unit アドレス変換やアクセス権限などの管理をおこなう。

16進数と8進数と2進数に慣れ親しんでみたかった

lpoutput() #firstv6

1文字の印字処理を行う。文字数をオーバーしたら一旦スリープする。 保留中にまたリクエストが来ても保留状態が保存されているので、 スリープが終わったらまた処理が始まる。 spl4でプロセッサ優先度を4にする。 スリープ中に、別のプロセスがlpoutputを実…

lpcanon() #firstv6

1バイト文字に対応した処理を行う。 switch caseやってる。 シングルクォートをそのまま出力するとシンタックスエラーになるので、エスケープしてる。 一文字カウントを戻して、同じ場所に印字する。 ccc 処理中の論理的な印字ヘッドの位置 mcc 処理中の物理…

lpwrite #firstv6

lpwrite 印字する。 lpwrite() { register int c; while ((c=cpass())>=0) lpcanon(c); } cpass 1バイトずつシステムコールで渡されたデータを取ってくる。 u_baseがバッファのアドレス /* * Pick up and return the next character from the user's * write…

lpopen #firstv6

概要 LP11のオープン処理、フラグ確認が主 statusをenableにする(使用可能にしてる?) その場では使用されない引数dev flag どのビットもホスト側から書ける雰囲気 openなので設定だけしている。 lpopen(dev, flag) { if(lp11.flag & OPEN || LPADDR->lpsr <…

8086の逆アセンブラをリファクタリング その3 #ikebin

これも(ry 概要 outファイルをF#で実行(逆アセンブル)するために、いちいちファイル名を指定するのが 面倒なので、処理をmainファイル化し、main関数をいっぱい呼び出すふうに変えた。 なお、複数のoutファイルを呼び出すとポインタがズレズレになるので、こ…

8086の逆アセンブラをリファクタリング その2 #ikebin

これも途中 要点 配列にレジスタを突っ込む ベタ書き部分を配列を使うように書き換える

8086の逆アセンブラをリファクタリング その1 #ikebin

ぶっちゃけ途中 仕様書 http://datasheets.chipdb.org/Intel/x86/808x/datashts/8086/231455-005.pdf PDP-11の圧倒的な読みやすさにお前が泣いた。 配列 (F#)

レジスタの規則 #ikebin

7shi / ikebin / wiki / 8086 / regs — Bitbucket アセンブリ mov ax, #0 mov bx, #0 mov cx, #0 mov dx, #0 mov sp, #0 mov bp, #0 mov si, #0 mov di, #0 逆アセンブラ let aout = System.IO.File.ReadAllBytes "regs.out" let read16 (a:byte[]) b = (int…

レジスタ

7shi / ikebin / wiki / 8086 / regs — Bitbucket $7run -d regs.out 0000: b80000 mov ax, 0000 0003: bb0000 mov bx, 0000 0006: b90000 mov cx, 0000 0009: ba0000 mov dx, 0000 000c: bc0000 mov sp, 0000 000f: bd0000 mov bp, 0000 0012: be0000 mov s…

8086 引き算 #ikebin

7shi / ikebin / wiki / 8086 / write-7 — Bitbucket アセンブリ ! write(1, hello, 6); mov ax, #1 int 7 .data1 4 .data2 hello, 6 ! *(uint16_t *)hello -= 0x2020; sub hello, #0x2020 ! write(1, hello, 6); mov ax, #1 int 7 .data1 4 .data2 hello, 6…

8086 メモリを直接指定 #ikebin

let aout = System.IO.File.ReadAllBytes "write-6.out" let read16 (a:byte[]) b = (int a.[b]) ||| ((int a.[b + 1]) <<< 8) let write16 (a:byte[]) b c = a.[b] <- byte c a.[b + 1] <- byte (c >>> 8) let tsize = read16 aout 2 let dsize = read16 ao…

8086のレジスタ小話 #ikebin

cx 16bit 2byte ch 8bit 1byte cl 8bit 1byte ax bx cx 全部数字が入る bx = 数字 (bx) メモリのbx番目 movb ch, #'H' movb cl, #'E' ↑8086系列はこのような分割が連綿と続く 逆アセとアセンブラで文法が違うので、今のところmovbが逆アセでは表示されない a…

8086 movb

8086のアセンブリ ! write(1, hello, 6); mov ax, #1 int 7 .data1 4 .data2 hello, 6 ! bx = hello; ! *(uint8_t *)bx = 'H'; mov bx, #hello movb (bx), #'H' ! write(1, hello, 6); mov ax, #1 int 7 .data1 4 .data2 hello, 6 ! bx = hello; ! *(uint8_t…