開発における諸注意等

開発への参加方法

Raph Kernelの開発を行う場合は、github上で(上に記載)forkし、pull requestを作ってください。

 

ブランチ

開発のベースとなるRaph_Kernelのブランチはdevelopでお願いします。開発中のため、masterとdevelopとの間の差分が多いのです。同様に、pull requestを送る先はdevelopにしてください。

Raph_Kernelは内部にRaph_Libraryというsubmoduleを有しているのですが、Raph_Library自体の開発を行う人もいると思います。その場合は、Raph_Libraryも自分の元にforkしてください。

Raph_Libraryについては、特殊な事情がない限り、kernelブランチで作業してください。(開発を行う、行わないに関わらず)ユーザー空間のプログラムを実装する場合はuserブランチになるのですが、たぶん殆どの人には縁がないと思います。また、masterはkernelとuserブランチのmerge用なので、使わないでください。

 

コーディング規約

コーディング規約はGoogle C++ Style Guide (3.199)(リンクは日本語訳)を採用しています。とはいっても、そこまで厳密に順守しているわけではないです。

参考までに今のところ意識的に順守している規則を抜粋して記載しておきます。

  • コンストラクタでは複雑な初期化を行わず、Initで行う
  • 例外は使わない
  • 多重継承はインターフェースクラス以外行わない
  • defineガードは必ず入れる
  • 実行時型情報を使わない
  • 命名規則はほぼGuide通り
    • private変数のアンダースコアの位置は非準拠
  • Cのキャストを使わない
  • 整数型はint以外はint64_t等を使う。それ以外の組み込み型を使ってはいけない。(long、short、整数に対するchar等)文字はcharを使っても良い。
  • 書式はほぼGuide通り
    • if文の中身が1行の場合、中括弧を省略してはいけない
      • ただし、条件式を含めて1行で書く場合は省略可
  • 行の長さは80文字以下
  • 既存のコードを移植してきた場合は、できるだけ移植元のコーディング規約に沿う

 

一般的なプログラムを書く場合との差異

カーネル開発においては、普通のC++アプリケーションを書くのと勝手が異なる部分が多くあります。以下に幾つか例を挙げておくので、気をつけてください。また、各種ドキュメントの類も参考にしてください。

 

  • 割り込みハンドラの中(割り込みハンドラから呼ばれる可能性のある関数を含む)では幾つか制限がある。
    • そもそも、割り込み処理は可及的速やかに終わらせなければならない。
      • メモリ確保等の重い処理はしない
      • 割り込みハンドラ内では必要最低限の処理のみを行い、後は割り込み解除後に処理を継続できるよう、タスクをスケジューリングしておく
    • 割り込みハンドラ内では使えないクラスが存在
      • 割り込みハンドラ内でも使用可能なクラスが定義されている事が多いので、それを使う事
      • このクラスは割り込みハンドラ内で使える代わりに非効率なので、割り込みハンドラ内で呼ばれる可能性のない場所では極力使わない事
  •  glibc, STLは存在しない
    • 独自実装のlibcが定義されており、これらは使用可能
  • グローバル変数のコンストラクタは呼ばれないので、利用する際は明示的に初期化する(placement newやInit関数など)事

 

随時追記します。