質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

866閲覧

Linux process / kernel間の参照

Gammodler

総合スコア9

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2019/09/19 13:05

Linux process / kernel間の参照

Microzed
Windows10 64Bit
petalinux 2019.1
開発用OS:CentOS-7-1708+Hyper-V
で開発中です。

petalinux 2016.2 :旧と呼ぶ
petalinux 2019.1 :新とよぶ
への移行過程で問題が発生しました。
新でデバイスドライバ側がOpenできません。

process側冒頭で下記を実行します:

#ifdef FLASH fd = open("/dev/mydev", O_RDWR); #else fd = open("mydev", O_RDWR); #endif if (fd < 0) { printf("Device Driver Open Error fd= %x\n", fd); exit(1); } printf("Device Driver Open No fd= %x\n", fd);

新ではFLASHを定義、未定義とも
fd=0xffffffff
が返ってきます。
旧では問題ありません。

Kernel側で関係すると思われる箇所。

static struct file_operations my_fops = {
owner: THIS_MODULE,
open: my_open,
unlocked_ioctl: my_ioctl, // ioctl以外は使用しない
};

static int my_open(struct inode *inode, struct file *filp)
{
int minor;

printk("System call enabled\n"); minor = MINOR(inode->i_rdev); if (minor > MY_MAX) { printk(KERN_ERR "illegal minor number\n"); return -1; } my_dev[minor].minor = minor; filp->private_data = &my_dev[minor]; return 0;

}

新の場合、process側での記述
fd = open("/dev/mydev", O_RDWR);
fd = open("mydev", O_RDWR);
上記ふたつともNGでした。
my_open関数冒頭の
printk("System call enabled\n");
が実行されていないので呼ばれていないようです。

旧では
fd = open("mydev", O_RDWR);
でGOになります。

一般には/dev/mydevが正しいらしいのですが、根拠が分かりません。
新の場合でも一時的にErrorが出ないことがありました。誤認の可能性もあります。

process側のキーワードは3つあります。
open、mydev、O_RDWR
このうち"open"だけがKernel側への指令として意味があり,mydevは別のワードでも差し支えないのではないかと思っています。

Kernel側でmydevというワードは単独では使われていません。
insmodに対応するstatic int __init mydev_init(void)関数
rmmodに対応するstatic void __exit mydev_exit(void)関数
という形で登場しますが。
これらの動作は問題ありません。

非常に簡単な間違いをしているのではないかと恐れています。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nomuken

2019/09/19 13:31 編集

まずopenに失敗したときのerrnoを確認するべきです。 FLASHを定義したうえで > printf("Device Driver Open Error fd= %x\n", fd); の前に perror("/dev/mydev"); と書いて、出力内容を記載してください。
nomuken

2019/09/19 13:36

シェルから ls -l /dev/mydev と実行したときの結果を記載してください。(デバイスファイルの存在確認とmajor/minor番号確認のため)
Gammodler

2019/09/20 05:54

nomuken様 毎回お世話になります。 fd = open("/dev/mydev", O_RDWR); にして、perror("/dev/mydev"); を実行させたところ、 root@root:~# ./myproc myproc Started /dev/mydev: No such file or directory Device Driver Open Error fd= ffffffff となりました。 つまりmydevは存在していません。 cd / find -name mydev -type f でも何も表示されません。 実はmknodで作ったものがあるのですがサイズゼロであるためひっからないようです。 旧の方で確認してみました。 こちらの方は fd = open("mydev", O_RDWR); にしてありますが、この場合もmydevというFile名称のものはどこにも存在しません。 cd /dev, cd /いずれにもありません。 しかし驚くことに動作はします。 fd = open("mydev", O_RDWR);はNGです。 mydevというFile名ではない別のものになっているのかもしれません。 何か大きな勘違いがあるようです。 insmod mydev.ko で登録したものはmydevとは別の名称になっているらしいです。 もう一度教科書に近いDocumentに沿って見直しをしてみます。
Gammodler

2019/09/20 05:57

一つ誤りがありました。 旧の方では fd = open("/dev/mydev", O_RDWR); では動作しません。
nomuken

2019/09/20 06:42

ルートに移動して find -name mydev -type c で、探してみてください
Gammodler

2019/09/20 09:16

何度もお手間を取らせ申し訳ありません find -name mydev -type c で1個見つかりました。 ただしこれはmknodで生成したサイズゼロのものです。 find -name mydev* でようやくひとつ見つかりました。 ./sys/module/mydev がそれです。しかしサイズはゼロでした。これは求めるものではないようです。 旧でもこの点は同様でした。同じDirにmydev=0が存在します。 ただし動作だけはGOなのは奇妙です。 もう一度基本的にやり直してみます。 示唆いただけることがあればお願いいたします。
guest

回答1

0

ベストアンサー

結論から言うと mknodで作成したファイル(find -name mydev -type cコマンドで見つけたファイル)絶対パスで指定してopenしてください。

ユーザ空間のプログラムとカーネル空間のプログラムがやり取りする手法はいくつかありますがそのうちの一つがデバイスファイルを使用する手法です。

すべて説明するときりがないので省きますがそのデバイスファイルを開くと

static struct file_operations my_fops = { owner: THIS_MODULE, open: my_open, unlocked_ioctl: my_ioctl, // ioctl以外は使用しない };

open:で指定しているmy_openが呼び出されます。また、取得したfdを引数にioctl関数を呼び出せばmy_ioctl関数が呼び出されます。

旧環境でできていたのはプログラムを開始したときそのプログラムのカレントディレクトリ上にmydevファイルがあったためと思われます。

投稿2019/09/20 10:52

nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Gammodler

2019/09/20 14:04

nomuken様 残業時間のご回答、痛み入ります。 /home/root/myproc /home/root/mydev.ko を格納、 chmod 755 * insmod mydev.ko を実行、successful mknod mydev c 245 0 によりサイズゼロのmydev fileが生成されたのを確認 ./ilcdev を実行したところ pemisssion denied が表示されました。 この手続きは誤っていますか?。 でも一歩前進の気もします。
nomuken

2019/09/20 14:20 編集

> ./ilcdev がどこから出てきたかわかりません。 実行すべきプログラムは > ./myproc では?それより前の手順は特に問題は見当たりません。
nomuken

2019/09/20 14:54

./myprocでもpermission deniedになるようならmydevのパーミッションを666に変えてみてください。
Gammodler

2019/09/23 14:21

nomuken様 深夜の回答、見落としていました。その後も見落とし申し訳ありません。 permisson666はやはりDeniedになりました。 mknodでmydev fileを生成後chmod 755 *を実行したのですが、Deniedではなく mydev: No such device or address というMessageが返ってきます。 find -name mydev -type c でだけ見えるmydev fileがprocess,kernelをつないでいるようです。 "C"は通常のmanualに記載されていません。 旧ではこの”かぼそい”糸でGOになるらしいです。 あきらめて旧に復帰しようと考えています。 ご支援ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問