Giter Site home page Giter Site logo

driver_tutorial's Introduction

このレポジトリについて

デバイスドライバについて学習するため、こちらの記事を再現実装したもの。
(デバイスドライバ名やファイル名は実験のため変更)

環境

  • jetson orin nano developer kit (8GB)

実行方法について

おおよそMakefileで提供している。(必要に応じて後述)

# モジュール(デバイスドライバ)のビルド
make

# モジュールの削除
make clean

# モジュールのロード
make load

# モジュールのアンロード
make unload

# デバイスファイルの読み込み
make read

# デバイスファイルへの書き込み
make write

# 確認(詳しくは各モジュールのMakefileを確認)
make check_[hogehoge]

シンプルなモジュール

デバイスドライバとシステムコールハンドラ

./dfile

  • デバイスドライバのメジャー番号を決め打ちで静的に登録し、ユーザスペースからデバイスドライバにアクセス
    • デバイスドライバのメジャー番号を決め打ちで静的に登録(63)
    • メジャー番号60~63、120~127、240~254はローカルの実験用にreservedされている番号
  • デバイスドライバに対応するデバイスファイルを作成し、そのファイルに対する open/read/write/close のシステムコールを処理するの関数を実装
    • デバイスファイルの作成は手動

注意点 :

  • 今回利用したjetson orin nanoでは、ユーザスペースのポインタはカーネルスペースから直接アクセスすることはできない
  • カーネルスペースからユーザスペースへのデータの転送には、copy_to_user()関数を使用する

動的なデバイスメジャー番号の割り当て ~ ユーザースペースと値のやり取り

./ddfile

デバイスのメジャー番号を決め打ちで静的に設定して、カーネルに登録するという方法は現在では推奨されていない。

  • デバイスのメジャー番号を動的に設定
  • ルールファイルを作成し、後続のステップで作成されるデバイスファイルの権限を設定
    • デフォルトでは 600など
    • /etc/udev/rules.d/に、拡張子が.rulesで数字から始まるファイルとして作成 (sudo では作成できないので、sudo -i)
  • udevの仕組みを利用してデバイスファイルを自動で作成
    • デバイスクラス構造体を用意する
    • 初期化関数で、/sys/class/にクラス登録をする (class_create(), device_create())
    • insmodしたタイミングで/sys/class/mydevice/mydevice0/devが作成される
    • udevdというデーモンがそれを検出して自動的にデバイスファイルが作成される
    • 手動で/dev/mydevice2を作ることはできるが、openしたりアクセスしようとすると、No such device or addresといったエラーになる

補足 :

  • マイナー番号0(/dev/mydevice0)とマイナー番号1(/dev/mydevice1)で処理を変えたい場合
    • read/writeハンドラ関数内で、マイナー番号を使ってswitch-caseで処理を分ける方法
    • 登録するハンドラテーブルを分ける方法
      1. s_ddfile_fopsを処理を分けたいマイナー数分用意する(例えば、s_ddfile_fops0s_ddfile_fops1)
      2. struct cdev ddfile_cdev;を配列にする
      3. cdev_init(), cdev_add(), cdev_del()で、別々の設定をする

driver_tutorial's People

Contributors

jankenshow avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.