2008年9月17日星期三

内核读写文件

内核读写文件当然有用,比如打印的一些重要信息掉电后就看不到了,所以要存在flash里。直接调用flash驱动读写,还不如直接读写文件。应用程序可以直接用open, read, write, close文件操作,对应到内核的系统调用是sys_open, sys_read, sys_write, sys_close.在syscall里排号挺靠前的,第3,4,5,6
SYSCALL(0, 0) /* 00 */
SYSCALL(sys_exit, 1)
SYSCALL(sys_ni_syscall, 0)
SYSCALL(sys_read, 3)
SYSCALL(sys_write, 3)
SYSCALL(sys_open, 3) /* 05 */
SYSCALL(sys_close, 1)

一般没人直接调用sys_*函数,可能可以,我没试过。
sys_open -> do_sys_open -> filp_open
sys_close -> filp_close
sys_read -> vfs_read -> file->f_op->read
sys_write -> vfs_write -> file->f_op->write

因为是内核空间,要读写用户空间数据需要在read/write前设置,用来表示buf是内核地址还是用户地址,0xc0000000以上还是以下。
file->f_pos表示文件内读写位置,open时是0,read后可修改file->f_pos的值,再read/write

tsfile = filp_open(tsdev->fileName, O_RDONLY, 0);
set_fs(KERNEL_DS);
err = tsfile->f_op->read(tsfile, tsbuf, TSBUFSIZE, &(tsfile->f_pos));
set_fs(USER_DS);
filp_close(tsfile, 0);

没有评论: