QA@IT
«質問へ戻る

質問を投稿

ioctl, Process/Kernel間で不具合

ioctlでProcess、Kernel間の連絡を取っているのですが不調です。

Process側で
unsigned int cmd = 0;
unsigned long arg = 0x85c000;
ret = ioctl(fd, cmd, arg);
を発行、ret=0が得られます。fd = 3がそれ以前に得られています。

Kernel側ではmy_ioctlが対応するはずです:
int my_ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
printk("cmd arg %x %x\n", cmd, arg);

switch(cmd)
    case 0:
        __raw_write(arg,linuxAddr0);
    case 1:
        __raw_write(arg,linuxAddr2);
    ....................

}

Process側のcmd, argとkernel側のそれは1対1に対応しているものと期待していたのですがそうはなりませんでした。Kernel側で見ると
cmd = 0x85c000, arg = 0x3f057cc0
つまりProcess側argの値がcmdに入り、argにはPointerと思われるゴミが入りました。
Process側cmdの値は消えてしまっています。
Process側を
ioctl (fd, IOC_WRITE, cmd, arg);
としてみたのですが結果は変わりません。

OSはPetaLinux v2015.2.1というやや特殊なものでXilinx社が推奨しています。
Debianの場合は全く問題ありませんでした。

Kernel Setupの過程に問題がある可能性もあります。

file_operations my_fops = {
owner: THIS_MODULE,
open: my_open,
// ioctl: my_ioctl, // Errorになる
unlocked_ioctl: my_ioctl,
release: my_close,
}

このmy_openも実行されています。それから
static int __init mydev_init(void)
{
...............
ret = register_chrdev(DEV_MAJOR, DRIVER_NAME, $my_fops);
...............
}
でもret=0が返ります。

手続きには特段の問題はないようにも思えるのですが、どこかで思い違いあるいは単純なミスがあるのかもしれません。
ご示唆いただければ幸いです。

ioctlでProcess、Kernel間の連絡を取っているのですが不調です。

Process側で
unsigned int cmd = 0;
unsigned long arg = 0x85c000;
ret = ioctl(fd, cmd, arg);
を発行、ret=0が得られます。fd = 3がそれ以前に得られています。

Kernel側ではmy_ioctlが対応するはずです:
int my_ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
	printk("cmd arg %x %x\n", cmd, arg);

	switch(cmd)
		case 0:
			__raw_write(arg,linuxAddr0);
		case 1:
			__raw_write(arg,linuxAddr2);
		....................
}

Process側のcmd, argとkernel側のそれは1対1に対応しているものと期待していたのですがそうはなりませんでした。Kernel側で見ると
cmd = 0x85c000, arg = 0x3f057cc0
つまりProcess側argの値がcmdに入り、argにはPointerと思われるゴミが入りました。
Process側cmdの値は消えてしまっています。
Process側を
ioctl (fd, IOC_WRITE, cmd, arg);
としてみたのですが結果は変わりません。

OSはPetaLinux v2015.2.1というやや特殊なものでXilinx社が推奨しています。
Debianの場合は全く問題ありませんでした。

Kernel Setupの過程に問題がある可能性もあります。

file_operations my_fops = {
	owner:			THIS_MODULE,
	open:			my_open,
//	ioctl:			my_ioctl,		// Errorになる
	unlocked_ioctl:	my_ioctl,
	release:		my_close,
}

このmy_openも実行されています。それから
static int __init mydev_init(void)
{
	...............
	ret = register_chrdev(DEV_MAJOR, DRIVER_NAME, $my_fops);
	...............
}
でもret=0が返ります。

手続きには特段の問題はないようにも思えるのですが、どこかで思い違いあるいは単純なミスがあるのかもしれません。
ご示唆いただければ幸いです。