目次: Linux
Linuxはバスにデバイスを追加すると、ドライバのprobe() というコールバックが呼ばれますが、こいつがどこから呼ばれているのか?のメモです。
結論から言うと「たくさんありすぎて全部は分からない」ですが、後で調べるときの取っ掛かりになると信じて、とりあえず2つの経路をメモしておきます。
来年の自分が「何言ってんのお前??」と言っている気がしたので、例を挙げておきます。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という名前になるようです。
#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ドライバをカーネルモジュールでロードする場合を考えると、ごく普通の状況ですよね。
ドライバを登録してからデバイスを追加する場合と「思われる」経路の一例です。ちゃんと呼び出しの条件を追っていないので、条件が間違っているかもしれません。
- 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() が内部で呼んでいます。
デバイスを追加してからドライバを登録する場合の経路と思われる一例です。ちゃんと呼び出しの条件を追っていないので、条件が間違っているかもしれません。
- __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() を呼び出す系はありそうですが、今のところ良くわかってません。あの手この手で動かしているんだなー、と思いました。
SNSなどのWebサービスでは不可欠の存在となったCookieですが、Cookieをブロックしても正常にサービスを使えるんだろうか?と気になったので、やってみました。
ブラウザはSeaMonkeyです。メニューのEdit - Preferencesの画面から、左のツリービューをPrivacy & Security - Cookiesと辿り、Block cookiesオプションを選んでOKを押します。この設定によって、明示的に許可されたサイト以外はCookieをブロックします。
Cookieを全てブロックするとSNSなどのログインは一切出来なくなります。この状態から、どのドメインのCookieを受け入れればサービスが使えるようになるか?を見てみたいと思います。
一番シンプルなパターンです。
Twitterであればドメインtwitter.comの、Facebookであればドメインwww.facebook.comのCookieを許可すればサービスが使えます。
やり方は、メニューからTools - Cookie Manager - Allow Cookies from This Website(以降、Cookie許可と呼ぶ)を選んで、リロードです。
ちょっとハマりましたが、これもシンプルです。
ドメインmixi.jpのCookieを許可するだけだとRedirect Loopというエラーが出てログインできませんので、併せてSession Cookieを許可すればサービスが使えます。
やり方は、メニューからTools - Cookie Manager - Allow Session Cookies from This Website(以降、Session Cookie許可と呼ぶ)を選んでリロードです。
これらはmixiと同様です。
Amazonはドメインwww.amazon.co.jpの、GitHubはgithub.comのCookieとSession Cookieを許可すればサービスが使えます。
ちょっと変わっていて、サービスごとに細かく制御できます。
ニコニコ動画はサービスごとに、
のようにドメインが異なっています。ログイン用にドメインaccount.nicovideo.jpのCookie許可は必須となりますが、それ以外は許可するも許可しないも自由です。
従って、動画にログインしたい(Cookieを許可)が、静画にはログインしたくない(Cookieをブロック)など、器用な制御ができます。そんなことして何か意味があるのかまではわかりませんが…。
え?Cookie使ってたの?という意外なサービスです。
Cookieをブロックすると、プレゼンテーションの表紙だけは見ることが出来ますが、他のスライドが表示できません。ドメインwww.slideshare.netのCookieを許可すると、表紙以外のスライドも表示できるようになります。
単純な設定では使えませんでした。
まずCookieをブロックした状態でアクセスすると、エラーTA-20-1319「認証のためのCookieが有効になっておりません。」が出て、ドメインssl.tsite.jpのCookieを許可せよと言われます。
勧めに従って許可しても、ひたすらエラーTA-90-1001「申し訳ございません。時間をおいて再度アクセスしてください。」が出るだけで、どうしたら良いのかわかりません。困ったね…。
TSUTAYA DISCASは良くわからず残念でしたが、大抵のサービスはCookieをブロックしちゃっても結構使えるんだなー、と感心しました。メジャーなWebサービスって、良く出来ていますね。
SlideShareのような意外な発見があって面白いので、もうしばらくやってみようと思います。
< | 2016 | > | ||||
<< | < | 02 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | - | - | - | - | - |
合計:
本日: