コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2016年2月19日 >>> 2016年2月6日
link もっと後

2016年2月19日

Linux platform busデバイスドライバ

適当に書いたままにしていたLinux platform busデバイスドライバのサンプルコード(2016年2月14日の日記参照)をちゃんと書き直しました。

ついでにMakefileも足してビルドできる状態にして GitHub に置きました。後で自分で使うときに便利なはず。

編集者:すずき(2016/02/19 23:09)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2016年2月14日

Linuxデバイスドライバのprobeが呼ばれるまで

目次: Linux

Linuxはバスにデバイスを追加すると、ドライバのprobe() というコールバックが呼ばれますが、こいつがどこから呼ばれているのか?のメモです。

結論から言うと「たくさんありすぎて全部は分からない」ですが、後で調べるときの取っ掛かりになると信じて、とりあえず2つの経路をメモしておきます。

ドライバとデバイスの例

来年の自分が「何言ってんのお前??」と言っている気がしたので、例を挙げておきます。platform_busを例に取りますと、下記のようにデバイスドライバを登録します。

platform_busのデバイスドライバを登録する

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>

static int sample_platform_probe(struct platform_device *pdev)
{
    return 0;
}

static int sample_platform_remove(struct platform_device *pdev)
{
    return 0;
}

static struct platform_driver hogehoge_driver = {
    .probe  = hogehoge_probe,
    .remove = hogehoge_remove,
    .driver = {
        .name   = "hogehoge"
    },
};

module_platform_driver(hogehoge_driver);

このドライバに対して、下記のようにデバイスを追加します。platform_busの場合、デバイス名は "ドライバ名.ID番号" つまりhogehoge.0という名前になるようです。

platform_busにデバイスを追加する

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>

static struct platform_device *pdev = NULL;

static int __init hogehoge_device_init(void)
{
    int ret;

    pdev = platform_device_alloc("hogehoge", 0);
    if (pdev == NULL) {
        //error
        return -ENOMEM;
    }

    ret = platform_device_add(pdev);
    if (ret != 0) {
        //error
        platform_device_put(pdev);
        return -ENOMEM;
    }

    return 0;
}

static void __exit hogehoge_device_exit(void)
{
    platform_device_del(pdev);
}

module_init(hogehoge_device_init);
module_exit(hogehoge_device_exit);

ドライバの登録とデバイスの追加はどちらが先でも構いません。

ドライバを登録してからデバイスを追加するか、その逆、デバイスを追加してからドライバを登録すれば、デバイスドライバのprobe() コールバック、つまりhogehoge_probe() が呼ばれます。

ぱっと見、デバイス追加が先で、ドライバ登録が後の場合をケアする必然性があるのか?疑問を感じるかもしれませんが、USBデバイスが既に筐体に接続されていて、USBドライバをカーネルモジュールでロードする場合を考えると、ごく普通の状況ですよね。

経路その1 - デバイス追加がトリガ

ドライバを登録してからデバイスを追加する場合と「思われる」経路の一例です。ちゃんと呼び出しの条件を追っていないので、条件が間違っているかもしれません。

- platform_device_add()
  - device_add()
    - bus_probe_device()
      - device_initial_probe()
        - __device_attach()
          - __device_attach_driver()
            - driver_probe_device()
              - really_probe()
                - drv->probe()

デバイス追加の際に呼ばれるdevice_add() が契機になるようです。platform_busの場合はplatform_device_add() が内部で呼んでいます。

経路その2 - ドライバ追加がトリガ

デバイスを追加してからドライバを登録する場合の経路と思われる一例です。ちゃんと呼び出しの条件を追っていないので、条件が間違っているかもしれません。

- __platform_driver_register()
  - driver_register()
    - bus_add_driver()
      - driver_attach()
        - __driver_attach()
          - driver_probe_device()
            - really_probe()
              - drv->probe()

ドライバ追加の際に呼ばれるdriver_register() が契機になるようです。先ほどの例だとmodule_platform_driver() マクロが勝手に呼んでくれます。

補足

他にもdevice_attach() 時に __device_attach_async_helper() なる関数をワークキューにぶっ込んで非同期でデバイスを検知する系、bind_store() で手動でデバイスを検知する系がありそうです。

他にもprobe() を呼び出す系はありそうですが、今のところ良くわかってません。あの手この手で動かしているんだなー、と思いました。

編集者:すずき(2023/04/29 21:38)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2016年2月13日

あえてCookieをブロックしてみる

SNSなどのWebサービスでは不可欠の存在となったCookieですが、Cookieをブロックしても正常にサービスを使えるんだろうか?と気になったので、やってみました。

ブラウザはSeaMonkeyです。メニューのEdit - Preferencesの画面から、左のツリービューをPrivacy & Security - Cookiesと辿り、Block cookiesオプションを選んでOKを押します。この設定によって、明示的に許可されたサイト以外はCookieをブロックします。

Cookieを全てブロックするとSNSなどのログインは一切出来なくなります。この状態から、どのドメインのCookieを受け入れればサービスが使えるようになるか?を見てみたいと思います。

TwitterとFacebook

一番シンプルなパターンです。

Twitterであればドメインtwitter.comの、Facebookであればドメインwww.facebook.comのCookieを許可すればサービスが使えます。

やり方は、メニューからTools - Cookie Manager - Allow Cookies from This Website(以降、Cookie許可と呼ぶ)を選んで、リロードです。

mixi

ちょっとハマりましたが、これもシンプルです。

ドメインmixi.jpのCookieを許可するだけだとRedirect Loopというエラーが出てログインできませんので、併せてSession Cookieを許可すればサービスが使えます。

やり方は、メニューからTools - Cookie Manager - Allow Session Cookies from This Website(以降、Session Cookie許可と呼ぶ)を選んでリロードです。

Amazon, GitHub

これらはmixiと同様です。

Amazonはドメインwww.amazon.co.jpの、GitHubはgithub.comのCookieとSession Cookieを許可すればサービスが使えます。

ニコニコ動画と仲間達

ちょっと変わっていて、サービスごとに細かく制御できます。

ニコニコ動画はサービスごとに、

  • ログイン: account.nicovideo.jp
  • 動画: www.nicovideo.jp
  • 静画: seiga.nicovideo.jp
  • 生放送: live.nicovideo.jp

のようにドメインが異なっています。ログイン用にドメインaccount.nicovideo.jpのCookie許可は必須となりますが、それ以外は許可するも許可しないも自由です。

従って、動画にログインしたい(Cookieを許可)が、静画にはログインしたくない(Cookieをブロック)など、器用な制御ができます。そんなことして何か意味があるのかまではわかりませんが…。

SlideShare

え?Cookie使ってたの?という意外なサービスです。

Cookieをブロックすると、プレゼンテーションの表紙だけは見ることが出来ますが、他のスライドが表示できません。ドメインwww.slideshare.netのCookieを許可すると、表紙以外のスライドも表示できるようになります。

TSUTAYA DISCAS

単純な設定では使えませんでした。

まずCookieをブロックした状態でアクセスすると、エラーTA-20-1319「認証のためのCookieが有効になっておりません。」が出て、ドメインssl.tsite.jpのCookieを許可せよと言われます。

勧めに従って許可しても、ひたすらエラーTA-90-1001「申し訳ございません。時間をおいて再度アクセスしてください。」が出るだけで、どうしたら良いのかわかりません。困ったね…。

所感

TSUTAYA DISCASは良くわからず残念でしたが、大抵のサービスはCookieをブロックしちゃっても結構使えるんだなー、と感心しました。メジャーなWebサービスって、良く出来ていますね。

SlideShareのような意外な発見があって面白いので、もうしばらくやってみようと思います。

編集者:すずき(2016/02/15 00:16)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2016年2月19日 >>> 2016年2月6日
link もっと後

管理用メニュー

link 記事を新規作成

<2016>
<<<02>>>
-123456
78910111213
14151617181920
21222324252627
2829-----

最近のコメント5件

  • link 24年6月17日
    Bobさん (06/04 09:25)
    「BindIPv6Only=no does...」
  • link 18年8月12日
    すずきさん (05/29 16:57)
    「コメントありがとうございます。\n\nこ...」
  • link 18年8月12日
    ARM926EJ-Sさん (05/29 14:27)
    「この記事が書かれたのは2018年ですが、...」
  • link 17年9月3日
    すずきさん (05/26 23:59)
    「>ちょさんさん\nご参考になれば幸いです...」
  • link 17年9月3日
    ちょさんさん (05/26 20:34)
    「自分もこの機種と全く同じCN-SP700...」

最近の記事20件

  • link 20年10月23日
    すずき (05/29 16:53)
    「[ROCK64/ROCKPro64 - まとめリンク] 目次: ROCK64/ROCKPro64[ROCK64] ROCK64ブート...」
  • link 18年8月12日
    すずき (05/29 16:53)
    「[ARM PCで開発できるか?] 目次: ROCK64/ROCKPro64最近のARM搭載SoCはかなり速くなっています。もし...」
  • link 18年12月15日
    すずき (05/29 16:52)
    「[ARMワンボードPCのネットワーク速度] 目次: ROCK64/ROCKPro64Raspberry Pi対抗ボードの多くは...」
  • link 21年5月22日
    すずき (05/29 16:50)
    「[ベンチマーク - まとめリンク] 目次: ベンチマーク一覧が欲しくなったので作りました。USB HDD RAIDのベンチマー...」
  • link 06年5月17日
    すずき (05/29 16:49)
    「[ディスクI/Oベンチマークプログラム] 目次: ベンチマーク研究室のゼミの後に、明日のシス情セミナーの発表練習を行いました。...」
  • link 06年5月15日
    すずき (05/29 16:45)
    「[USB HDD RAIDのベンチマーク] 目次: ベンチマーク昨日作成したRAID0+1の書き込み性能を測定しました。やはり...」
  • link 25年5月24日
    すずき (05/25 22:25)
    「[メガネが壊れた] 金曜日、メガネの鼻当てが曲がってんなー?と思って、元の位置に戻そうと指で押したらパキっと音がして折れました...」
  • link 25年5月25日
    すずき (05/25 21:53)
    「[JTSA Unlimited大会参加2025] 目次: 射的JTSA Unlimitedの大会に参加しました。「木」ステージ...」
  • link 22年3月18日
    すずき (05/25 21:41)
    「[射的 - まとめリンク] 目次: 射的関係の深いまとめリンク。目次: Arduino一覧が欲しくなったので作りました。ガスガ...」
  • link 25年5月9日
    すずき (05/23 23:31)
    「[JavaとM5Stamp C3とBluetooth LE - Bluetoothデバイスとの通信改善] 目次: Arduin...」
  • link 23年6月2日
    すずき (05/23 23:31)
    「[Arduino - まとめリンク] 目次: Arduino関係の深いまとめリンク。目次: 射的一覧が欲しくなったので作りまし...」
  • link 23年4月10日
    すずき (05/23 22:59)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 24年4月25日
    すずき (05/23 22:59)
    「[ImageMagickでAVIFを変換] 目次: LinuxAVIFが読めないアプリケーションがたまにあるので、AVIF(A...」
  • link 25年5月23日
    すずき (05/23 22:30)
    「[デバッグ用のlibcを使って実行する方法(ダイナミックリンク編)] 目次: C言語とlibcCライブラリのデバッグをしたいと...」
  • link 22年4月13日
    すずき (05/23 22:30)
    「[C言語とlibc - まとめリンク] 目次: C言語とlibcC言語について。プログラムの落とし穴、演算子の優先順位標準入力...」
  • link 25年5月22日
    すずき (05/23 22:21)
    「[デバッグ用のlibcを使って実行する方法(スタティックリンク編)] 目次: C言語とlibcCライブラリのデバッグをしたいと...」
  • link 25年5月20日
    すずき (05/23 03:18)
    「[glibcのsigprocmask()とpthread_sigmask()の実装] 目次: C言語とlibc以前、シグナルマ...」
  • link 23年6月1日
    すずき (05/23 00:38)
    「[自宅サーバー - まとめリンク] 目次: 自宅サーバーこの日記システム、Wikiの話。カウンターをPerlからPHPに移植日...」
  • link 25年5月16日
    すずき (05/23 00:37)
    「[フォントがおかしいので直した] 目次: 自宅サーバーこのブログ、フォント設定が2つほどおかしかったので直しました。今まで見づ...」
  • link 23年5月15日
    すずき (05/22 00:23)
    「[車 - まとめリンク] 目次: 車三菱FTOの話。群馬県へのドライブ1群馬県へのドライブ2将来車を買い替えるとしたら?FTO...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 2025年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www2.katsuster.net
RDFファイル RSS 1.0

最終更新: 06/04 09:25