[プログラミング]OS自作入門はじめました
こんにちは、もざみみです∩_∩
最近どうにも忙しくて、ブログにまで手が回りません..
さて、みなさんはセキュリティ&プログラミングキャンプというものをご存じでしょうか。
文字通り、セキュリティやプログラミングについて、みんなで学んでいこう!という会なのですが、交通費・宿泊費・3食全部支給してもらえる大変ありがた~~~~~~いキャンプなのです。
応募が多いだろうし、たぶんムリだろうなーと思いながら申し込んだところ、
なんと参加が決定しました。ありがたやありがたや。
8月12日から16日は東京です。
16日は少し時間が空きそうなので、またリナカフェへ行こうかなと思ってます。
テキストは30日でできる!OS自作入門という本なのですが、これがなかなか面白い本で、機械語やらそういう泥臭いものがキライなわたしでも、スイスイ進められてます。
ただいま4日目に突入して、本の通りにソースをmakeしてハイ実行にも飽きてきたので、ちょっとプログラムを改変してみました。
まずはharib01bをそのまま仮想マシンで動かしたものが下のSSです。
しましまが出てます。超しましま。
これをちょっと変えて、もっと楽しい模様が出るようにしたのが下のSSです。
これを実現するために、bootpack.cを編集しました。以下に示します。
- #define SEED1 10995 /* 乱数のタネ */
- #define A 1664525
- #define C 1013904223
- #define M 559
- void io_hlt(void);
- void write_mem8(int addr, int data);
- int Random(int t);
- void HariMain(void)
- {
- int i; /* ループカウンタ*/
- int x = SEED1; /* 漸化式で使う */
- for (i = 0xa0000; i <= 0xaffff; i++)
- {
- x = Random(x);
- write_mem8(i, Random(x) % 16);
- }
- for (;;)
- {
- io_hlt();
- }
- }
- /* 線形合同法による乱数生成 */
- int Random(int t)
- {
- return ((A * t + C) % M);
- }
要は乱数を使って模様を描こう、というわけです。
ただ、Linuxみたいな出来合いのOSみたいにいろんな関数群がそろってる訳じゃないので、なるべく簡単に乱数を生成して、かつ模様になるようにしたい。
そう思って調べていると、ありました。線形合同法。
乱数生成自体に規則性があり、色の指定が0-15までの16種類に限定されている(たぶん)ため、乱数のタネ(SEED1の値)を変えることによって、いろんな模様が描けます。
SEED1 = 15のときはこんなかんじ。
SEED1 = 192ならこんなかんじ。
ここでA、C、Mの値を適当に決めちゃってますが、ここをいろいろいじると、さらに複雑性に富んだ模様も作れそうです。
あれ、これ自作OS上でやる意味がないんじゃない..?
いやいやいや。