[Armadillo:00436] Re: カーネルモードでのファイル読み込み
Masahiro Hanada
email@hidden
2005年 8月 5日 (金) 12:17:20 JST
花田です。
<email@hidden> wrote:
> 現在ドライバーの中でファイルを読み込もうとして、
> 以下のコードを実行していますが:
> int BytesRead;
> struct file *filp;
> mm_segment_t oldfs;
>
> filp = filp_open( filename, O_RDONLY | O_LARGEFILE, 0 );
> filp->f_pos = 0x0000;
> oldfs = get_fs();
> set_fs(KERNEL_DS);
> BytesRead = filp->f_op->read( filp, Buffer, size_t, &filp->f_pos );
> set_fs( oldfs );
>
> set_fs(KERNEL_DS);を実行した時点で、処理が進まなくなっています。
何がどういう理由で動かなかったのかわかりませんが…
下記のコードで動作することを確認しました。
(KERNEL_DSをget_ds()に変えたりしてますが、
Armの場合はinclude/asm-arm/uaccess.hで
#define get_ds() (KERNEL_DS)
されてるだけなので、この点は結局変わらないようです)
--------------------------------------------------------------------------------
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/processor.h>
#include <asm/uaccess.h>
static int ds_init(void)
{
struct file *filp;
mm_segment_t fs;
char buf[16];
int nr_read;
filp = filp_open("/etc/passwd", O_RDONLY | O_LARGEFILE, 0);
if (!filp) {
printk("can't open /etc/passwd\n");
goto end;
}
fs = get_fs();
set_fs(get_ds());
nr_read = filp->f_op->read(filp, buf, sizeof(buf)-1, &filp->f_pos);
buf[nr_read] = '\0';
printk("%d bytes read '%s'\n", nr_read, buf);
set_fs(fs);
filp_close(filp, NULL);
end:
return 0;
}
static void ds_exit(void)
{
}
module_init(ds_init);
module_exit(ds_exit);
MODULE_AUTHOR("Yasushi SHOJI <email@hidden>");
MODULE_DESCRIPTION("ds test module");
MODULE_LICENSE("GPL");
--------------------------------------------------------------------------------
____________________________________________________
花田 政弘 (はなだ まさひろ)
(株)アットマークテクノ IT開発部
TEL: 011-207-6550 FAX: 011-207-6570
URL: http://www.atmark-techno.com/
E-mail: email@hidden
____________________________________________________
armadillo メーリングリストの案内