Yabu.log

色々勉強するブログです。

30日OS自作本18日目

細かいコンソールの修正といくつかのコマンド(mem,cls,dir)を作る内容でした。

動画

www.youtube.com

文字列を比較する

string.hで定義されているstrcmpを使用します。

arr[0] == "t" && arr[0] == "s" && arr[2] == "t"

これが

strcmp(arr,"tst")==0

こんなにシンプルにかけます。

#include<stdio.h>
#include<string.h>

int main(void){
        char arr[3] = "tst";
        if(strcmp(arr,"tst")==0){
                printf("true");
        }
        return 0;
}

文字列の取り扱い、Cは普段使っているもの(Java,JS,VB)と結構違うので苦労します。

コマンド

  • mem:今まで画面に出してたmemory freeみたいな情報をコンソールにだすだけ
  • cls:コンソールに書かれている内容を削除するだけ。
  • dir:linuxでいうlsコマンド

dir

dirコマンドに利用するファイルはhariboteOSの中で作成するのではなく、windowsからコピーしてきます。 ですので、本書の内容ではファイルフォーマットはWindowsのものをそのまま拝借するようになっています。

struct FILEINFO {
    unsigned char name[8];  //8
    unsigned char ext[3];   //3
    unsigned char type;     //1
    char reserve[10];       //10
    unsigned short time;    //2
    unsigned short date;    //2
    unsigned short clustno; //2
    unsigned int size;      //4        
};
FILEINFO(見やすさのために書いてます)
NNNNNNNNNNNNNNNNEEEEEETTRRRRRRRRRRRRRRRRRRRRTTTTDDDDCCCCSSSSSSSS
FILE(私の実行結果)
48415249424F544553595300000000000000000000007A16C84C0200706C0000
49504C31302020204E41530000000000000000000000927B924C3900950B0000
4D414B45202020204241540000000000000000000000927B924C3F002E000000

あれ?これファイル内容は入ってなくないか?と思いましたが、19日目の内容を見るとこのclustnoに入っている数字の先にファイル内容が入っているようです。

N文字ごとに改行する置換

下記の正規表現で16進数で書かれたテキストを32バイトごとに改行します

置換前
(.{64})

置換後
$1\r\n

バイナリエディタからコピペで持ってきた時点ではもちろん一行の長い16進数でしかなかったので 上記で置換しました。

余談

昔、結合したセルが一行になるようなエクセルのシートに研修の感想を書かされたことがあります。 これ右端に行った時の改行を自分でやらないといけないんですよね(それじゃ紙に書いてるのと一緒じゃねーか) 固定幅フォント何文字で改行されるのか調べてsakura editorで同じような置換をしてそのまま貼り付けて提出しま した。

コマンド名の変更

dirコマンドなんてWindowsみたいで嫌いだ、Linuxみたいにlsコマンドの方がいいよーという人もいるかもしれません。そういう人は、もちろんlsコマンドにしてくれていいですよ。どこを直したらいいかなんて、ここまで読んできた皆さんには言わなくてもわかりますよね?

とのことですので他のも全部変えて見ました

  • mem:free
  • cls:clear
  • dir:ls

lsコマンド作った、というとなんかすごいことをやったように思えますが、今の所、リードしたデータをWindowのファイルフォーマットに合わせてデータを分解して画面に出してるだけですね〜 そういえばlsコマンドのソースを読む内容の本があったのを思い出しました。

lsを読まずにプログラマを名乗るな!

lsを読まずにプログラマを名乗るな!

いつか読もうと思っています。

感想

コマンドを作っているというより、コンソールを改造しているような感じです。実装もconsole_taskの中にベタ書きになっているので。でも多分今後の章で切り出す気がします。

そういえば普通のコンソール(bash,zsh,cmd)でも実行ファイルとして切り出されておらず、コンソールの機能として実装されているコマンドがあったりするのかしら?

30日でできる! OS自作入門

30日でできる! OS自作入門