投稿

MochiOS開発記@デバッグログ強化検討

 MochiKernelのデバッグログは下記情報を持っている。 ・ログ出力したモジュール-サブモジュール(つまりひとつのソースファイル)のID ・ログ出力した行数 ・文字列 デバッグログ種別やレベルなどは持たせていなくて、好き勝手していた。 いざ不具合があると情報が足りなくなるし、不具合がないと不要なログで埋め尽くされて見たいものが見れなくなる、ということに悩まされてきたので、種別の概念を追加することにする。 大体、世の中のシステムログ種別は以下のような感じか(超適当) 種別 概要 emergency システムが使用できなくなった系 alert 対処しないとまずい系 critical 致命的で対処しようがない系 error エラー全般 warning 警告全般 notice エラーでも警告でもないがちょっとあやしい系 informational なんか処理したよ系 debug プログラムデバッグ情報系 参考にしてこんな感じにしよう。(全然参考にしてない) 種別 概要 abort あぼーと。もう何もできない。死んだ。 error 想定外のエラー。処理を続けられないので中断。 warning 想定内のエラー。処理を続けられないので中断。 info なんか処理した。頻度低(HW割込みとかタスクスイッチ系はダメ)。 trace コードここ通ったよ。頻度低(HW割込みとかタスクスイッチ系はダメ)。 temp デバッグ中に使う専用。残さない。 種別ごとに有効化マクロ定義しとこ。

MochiOS開発記@当面の目標

イメージ
突然のフリーズ。 カーネルログを見ても解析困難。 というわけで、このバグ修正を当面の目標にしよう。 INT14なのでページフォルトなのだけど、誰かがメモリ破壊してる気がするなぁ。。。 とりあえず、カーネルログのレベル実装してもうちょい情報増やしてみよう。

CUnit@単体テストはじめ

CUnit@単体テストはじめ はじめに 自作kernel作るにあたってDebug機能が欲しくなり。 snprintfが必要となり。 やっぱlibc欲しいなとlibcを作り始め(newlib使ってもよかったんだけど、自作楽しいので)。 snprintfを作ったのだが、これ動くのか?と。 単純に作業量2倍になるので、趣味でテスト系は避けてきたのだけど、やっぱ避けて通れないよねテスト。 というわけで、CUnit使うか・・・の備忘録。 ライブラリインストール sudo apt-get install libcunit1-dev テスト対象コード例(target.c) int target_func ( void ) { return 5 ; } テストコード例 # include <CUnit/CUnit.h> # include <CUnit/Basic.h> # include "target.c" void test_func_1 ( void ) { ret = target_func ( ) ; CU_ASSERT_EQUAL ( ret , 5 ) ; } int main ( void ) { CU_pSuite suite ; /* テストレジストリ初期化 */ CU_initialize_registry ( ) ; /* テストスイート追加 */ suite = CU_add_suite ( "TestSuite" , NULL , NULL ) ; /* テスト追加 */ CU_add_test ( suite , "test1" , test_func_1 ) ; /* テスト実行 */ CU_basic_set_mode ( CU_BRM_VERBOSE ) ; CU_basic_run_tests ( ) ; /* テストレジストリ削除 */ CU_cleanum_registry ( ) ; return 0...

linux@VPN構築

linux@VPN構築 はじめに 在宅勤務になってから、ほぼ外出することが無くなり、外出先から自宅ネットワークに繋ぐことも無くなっていた。久しぶりに繋いでみたら、繋がらない。どうやら使っていたDDNSサービス(ieserver)が終了したらしく、他にも色々と理由があってダメだったので、見直すことにした。 ネットワーク構成は下記の通り。 My home My Device Rooter VPN server VPN Client INTERNET DDNS VPN serverは、Debian GNU/Linux 9 (stretch) VPNClientは、WindowsだったりAndroidだったり。 ドメイン名設定 私の自宅インターネット接続環境は固定IPアドレスではなく、再接続なんかの度にコロコロIPアドレスが変わるので、外出先からはvpn.mochi.cоm(仮)みたいなドメイン名を使ったアクセスをできるようにする必要がある。 これは、どこかのDDNSサービスを使ってドメイン名を取得し、自宅サーバから定期的に自分のグローバルIPアドレスを更新してあげることで実現できる。 DDNSサービスの選択 今回、適当に検索して色々出てくるなか、下記サービスを使うことにした。 DDNS Now 簡単に説明すると、 無料 ホスト名: アカウント名.f5.si  ※siはスロベニアらしい Aレコード設定可 AAAAレコード設定可 TXTレコード設定可 こんな素晴らしいサービスを無料で提供して頂けることに感謝。 そして、もともと使っていたieserver並みにシンプルに使える。 crondでIPを自動更新する 自宅のIPアドレスはインターネット再接続の度に変わってしまい、その都度手動でDDNSサービスに再登録するのは面倒な上に、外出先からはIPアドレスが判らず再登録できないので、VPNサーバを使って自動的にIPをDDNSサービスに再登録する様にする。 crontabを開く crontab -e 10分毎に実行するコマンドを追加する 0,10,20,30,40,50 * * * * wget -O DDNSNow_update.log "https://f5.s...

github@パスワード認証でpushできなくなった

github@パスワード認証でpushできなくなった はじめに 最近、漸くコードをイジれて、久しぶりにgithubにpushしようとしたのだが、 $ git push origin develop Username for 'https://github.com': MasterMochi Password for 'https://MasterMochi@github.com': remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information. fatal: Authentication failed for 'https://github.com/MasterMochi/mvfs.git/' あれ、pushできな~い。なになに・・・ パスワード認証のサポートは2021年8月13日に削除されました~。 代わりにパーソナルアクセストークンを使ってくれ~ そういえば、以前pushした時にそんな警告が出ていた気がする。承認方法変わったのか。 8月ってダイブ前だな・・・ 誘導されたページを見てみる https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ 前置きはすっ飛ばして、"What you need to today"をテキトーに読むと、 今日すべきこと 開発者さんのために、もしGitHub.comでGit操作を承認するためにパスワード使ってんなら、HTTPS (推奨)かSSH鍵を介した パーソナルアクセストークン を使わなきゃダメよ。 うん、で?と思ったら、「パーソナルアクセストークン」...

MochiOS@仮想ファイルシステムの作成part10

イメージ
MochiOS@仮想ファイルシステムの作成part10 前提知識無しで作るなんちゃって仮想ファイルシステムpart10。 開発日記です。独り言です。 これまでのあらすじ part 内容 0 仮想ファイルシステムを作りたい宣言をする。 1 ざっくり仮想ファイルシステムの機能を決める。 が、機能呼出し先の仮想ファイルシステムのタスクIDをどう取得するかという問題に気付く。 2 カーネルにタスク名登録機能を実装した。 これでタスク名からタスクIDを取得する事が出来る様になるハズ、なので試したいが試す方法が無い事に気付き、ログ出力タスクの開発を宣言する。 3 ログ出力の為に使うvsnprintf()の仕様を調べる。 4 ログ出力タスクを開発してタスク名からタスクIDの取得機能が正しく動いている事が確認できた。 5 mount機能を実装した。たぶんできてる。 6 FDどうやって管理しようかー。メッセージのやり取り制御を状態遷移で制御しようかー。とか考えて、open機能を実装した。たぶんできてる。 7 openと同じようなシーケンスなので、メッセージとちょっとやる事変えて簡単にwrite機能を実装できちゃった。 8 writeと同じようなシーケンスなので、メッセージとちょっとやる事変えて簡単にread機能を実装できちゃった。 9 readと同じようなシーケンスなので、メッセージとちょっとやる事変えて簡単にclose機能を実装できちゃった。 応用 これまでmount、open~closeまでさくっと何も考えずに実装してきた。(そういえばunmount実装してないな。まいいか) 全てはドライバとアプリ間のインタフェースを作ることがひとまずの目的だったので、ドライバを作ってみなければ。 というわけでns16550ドライバを作った。 ns16550は所謂、RS-232C、COMポート、シリアルポート、UARTなどと呼ばれているハードウェアで、割りと制御が簡単。 それぞれ16byteの転送バッファと受信バッファがあって、書き込む(VfsWrite)時は転送バッファがフルでなければ1byteづつ書き込んでフルの時は転送バッファ空割り込...