BLOG.QuelLENcode

Portrait

ソフトウェア・Linux・好きなモノ・日々のこと

 
 

[プログラミング]OS自作入門はじめました

4月 05 2011

こんにちは、もざみみです∩_∩
最近どうにも忙しくて、ブログにまで手が回りません..

さて、みなさんはセキュリティ&プログラミングキャンプというものをご存じでしょうか。
文字通り、セキュリティやプログラミングについて、みんなで学んでいこう!という会なのですが、交通費・宿泊費・3食全部支給してもらえる大変ありがた~~~~~~いキャンプなのです。

応募が多いだろうし、たぶんムリだろうなーと思いながら申し込んだところ、
なんと参加が決定しました。ありがたやありがたや。
8月12日から16日は東京です。
16日は少し時間が空きそうなので、またリナカフェへ行こうかなと思ってます。

テキストは30日でできる!OS自作入門という本なのですが、これがなかなか面白い本で、機械語やらそういう泥臭いものがキライなわたしでも、スイスイ進められてます。
ただいま4日目に突入して、本の通りにソースをmakeしてハイ実行にも飽きてきたので、ちょっとプログラムを改変してみました。

まずはharib01bをそのまま仮想マシンで動かしたものが下のSSです。

original

しましまが出てます。超しましま。
これをちょっと変えて、もっと楽しい模様が出るようにしたのが下のSSです。

edited01

これを実現するために、bootpack.cを編集しました。以下に示します。

  1. #define SEED1 10995 /* 乱数のタネ */
  2. #define A 1664525
  3. #define C 1013904223
  4. #define M 559
  5.  
  6. void io_hlt(void);
  7. void write_mem8(int addr, int data);
  8. int Random(int t);
  9.  
  10.  
  11. void HariMain(void)
  12. {
  13.     int i;         /* ループカウンタ*/
  14.     int x = SEED1; /* 漸化式で使う */
  15.  
  16.     for (i = 0xa0000; i <= 0xaffff; i++)
  17.     {
  18.         x = Random(x);
  19.         write_mem8(i, Random(x) % 16);
  20.     }
  21.  
  22.     for (;;)
  23.     {
  24.         io_hlt();
  25.     }
  26. }
  27.  
  28. /* 線形合同法による乱数生成 */
  29. int Random(int t)
  30. {
  31.     return ((A * t + C) % M);
  32. }
  33.  

要は乱数を使って模様を描こう、というわけです。
ただ、Linuxみたいな出来合いのOSみたいにいろんな関数群がそろってる訳じゃないので、なるべく簡単に乱数を生成して、かつ模様になるようにしたい。
そう思って調べていると、ありました。線形合同法

乱数生成自体に規則性があり、色の指定が0-15までの16種類に限定されている(たぶん)ため、乱数のタネ(SEED1の値)を変えることによって、いろんな模様が描けます。
SEED1 = 15のときはこんなかんじ。

edited02

SEED1 = 192ならこんなかんじ。

edited03

ここでA、C、Mの値を適当に決めちゃってますが、ここをいろいろいじると、さらに複雑性に富んだ模様も作れそうです。

あれ、これ自作OS上でやる意味がないんじゃない..?
いやいやいや。