Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ロボットシステム学2015年第13回

2,954 views

Published on

デバイスドライバの作り方の概説

Published in: Technology
  • Be the first to comment

ロボットシステム学2015年第13回

  1. 1. ロボットシステム学 第13回 上田隆一
  2. 2. 本日の内容 • デバイスドライバ – 例 • 延々と寿司のアイコンを吐き続ける「寿司デバイス」 • https://github.com/ryuichiueda/SushiDevice • UbuntuとRaspbian OSで動作確認済み • インストール方法、コードの中身 • udevについて 2016年1月14日 ロボットシステム学 2
  3. 3. 参考 • 米田聡, RaspberryPiで学ぶ ARMデバイスドライバープログラ ミング, ソシム, 2014. • J. Corbet et al., Linuxデバイスドライバ第3版, O'reilly, 2005. • 動的メジャー番号割り当てとデバイスファイルの自動生成 | 迷える子羊の苦悩 – http://44781184.at.webry.info/201306/article_10.html 2016年1月14日 ロボットシステム学 3
  4. 4. デバイスドライバ • 機器とユーザをつなぐもの • カーネルの一部として動作 – 「カーネルモジュール」という、カーネルに動的に 組み込めるものとしてビルド • インタフェースはデバイスファイル – $ ls -l /dev/ • 「メジャー番号」「マイナー番号」を持つ 2016年1月14日 ロボットシステム学 4
  5. 5. 使ってみましょう • insmod: カーネルモジュールを組み込むコマンド • rmmod: カーネルモジュールを削除するコマンド 2016年1月14日 ロボットシステム学 5 $ git clone https://github.com/ryuichiueda/SushiDevice.git $ cd SushiDevice/ $ make $ sudo insmod sushi.ko $ sudo chmod 666 /dev/sushi0 ###使ってみる### $ cat /dev/sushi0 | head -n 3 🍣 🍺 🍣 🍣 ###削除### $ sudo rmmod sushi
  6. 6. デバイスドライバの役割 • ユーザにハードを使わせる – ユーザランドのプログラムでも可能だが、 いちいちroot権限で動かさないといけない • 例: 第7回のプログラム • デバイスファイルのパーミッションでアクセス制御 • 機械の操作をファイル入出力に置き換え – 何度も講義で言っている「抽象化」 2016年1月14日 ロボットシステム学 6
  7. 7. デバイスドライバを作る際の注意点 • libcなどの普通の関数が使えない – printfやmalloc、randあたりが全く使えない – カーネル用のものを使う • バグを埋め込むと最悪の場合、再起動 – カーネル空間で動くのでカーネルパニックが起こる 2016年1月14日 ロボットシステム学 7
  8. 8. 作り方 • デバイスの登録、読み書き、削除に 対応した処理を書く – insmod時: module_initマクロに登録した関数が 実行されるので関数の中身を実装 – rmmod時: module_exitマクロに登録した関数が 実行されるので関数の中身を実装 – 読み書き等: • それぞれに対応する関数を書いて file_operationsという構造体に登録 2016年1月14日 ロボットシステム学 8
  9. 9. module_init • module_initマクロ – insmodされた時の処理を書いた関数を渡す (メジャー番号取得とデバイスファイルを自動で行う場合の例) – module_initに渡す関数で行うこと(コード) • メジャー番号の取得(自動取得の場合) • カーネルにドライバの情報の構造体をぶら下げる • /sys/class/sushi、/dev/sushi0等インタフェースを作ってもらう – 注意: デバイスファイルを手動で作らなければならない デバイスドライバも存在 • 手動で作る例: $ sudo mknod /dev/sushi メジャー番号 マイナー番号 2016年1月14日 ロボットシステム学 9
  10. 10. rmmod / module_exit • デバイスドライバをカーネルから外す – ユーザから見ると、/sys/class/と/dev/から – 関係するファイル、ディレクトリが消える – module_exitマクロに処理を書いた関数を渡す 2016年1月14日 ロボットシステム学 10
  11. 11. デバイスファイルを通じた読み書き • ユーザ空間とカーネル空間でデータを授受 – file_operations構造体の • readがユーザから見た読み込み – copy_to_userでユーザ空間に文字列を転送 • writeがユーザから見た書き込み – copy_from_userでユーザ空間から文字列を受け取り 2016年1月14日 ロボットシステム学 11
  12. 12. copy_to_user • static inline unsigned long __must_check copy_to_user(void __user *to, const void *from, unsigned long n) – (/usr/src/<ヘッダのディレクトリ>/arch/x86/include/asm/uaccess.h) • to: ユーザ空間のバッファのポインタ • from: カーネル空間に自分で用意するバッファのポインタ • n: 転送するバイト数 • 返り値: コピーできなかったバイト数 • 実際の使い方はコードで 2016年1月14日 ロボットシステム学 12
  13. 13. copy_from_user • static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) – (/usr/src/<ヘッダのディレクトリ >/arch/x86/include/asm/uaccess.h) – to, from, n: copy_to_userと一緒 – 返り値: コピーできなかったバイト数 2016年1月14日 ロボットシステム学 13
  14. 14. udev • デバイス管理ツール • 動的な処理 • デーモンとして動作 • udev以前 – メジャー番号等が動的に得られない – ドライバをインストールしても デバイスファイルができない – ・・・ 2016年1月14日 ロボットシステム学 14
  15. 15. udevadmによる観察 • insmod時 • rmmod時 2016年1月14日 ロボットシステム学 15
  16. 16. udevの設定 • /etc/udev/rules.d/にファイルを置く – Ubuntu, Raspbian共に – ファイル名は「<優先度>-<対象>.rules」 – 基本: 「==」で条件をマッチさせて「=」で設定 • 反映 – $ sudo udevadm control --reload 2016年1月14日 ロボットシステム学 16 $ cat /etc/udev/rules.d/89-sushi.rules #rules for sushi KERNEL=="sushi0",SUBSYSTEM=="sushi",ACTION=="add",MODE="0666"
  17. 17. 機器の操作 • 例 – 第7回で行ったLチカのデバイスドライバ版 • 使うもの – request_mem_region • /dev/memのopenの代わり • 使いたい物理メモリ領域の予約 – ioremap_nocache • mmapの代わり 2016年1月14日 ロボットシステム学 17
  18. 18. 講義でやっていないこと • USB等 • 排他 • 一つのドライバで複数のデバイスファイル • read, write以外の方法 • ioctl – フォーマット等読み書きとは別の操作 • ブロックデバイス • ・・・ 2016年1月14日 ロボットシステム学 18

×