📄 _2_4_051_fs_read_write_.html
字号:
<html lang="zh-CN" xmlns:gdoc=""> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <style type="text/css">/* default css */table { font-size: 1em; line-height: inherit;}div, address, ol, ul, li, option, select { margin-top: 0px; margin-bottom: 0px;}p { margin: 0px;}body { margin: 0px; padding: 0px; font-family: Verdana, sans-serif; font-size: 10pt; background-color: #ffffff;}h6 { font-size: 10pt }h5 { font-size: 11pt }h4 { font-size: 12pt }h3 { font-size: 13pt }h2 { font-size: 14pt }h1 { font-size: 16pt }blockquote {padding: 10px; border: 1px #DDD dashed }a img {border: 0}div.google_header, div.google_footer { position: relative; margin-top: 1em; margin-bottom: 1em;}/* end default css */ /* default print css */ @media print { body { padding: 0; margin: 0; } div.google_header, div.google_footer { display: block; min-height: 0; border: none; } div.google_header { flow: static(header); } /* used to insert page numbers */ div.google_header::before, div.google_footer::before { position: absolute; top: 0; } div.google_footer { flow: static(footer); } /* always consider this element at the start of the doc */ div#google_footer { flow: static(footer, start); } span.google_pagenumber { content: counter(page); } span.google_pagecount { content: counter(pages); } } @page { @top { content: flow(header); } @bottom { content: flow(footer); } } /* end default print css */ /* custom css *//* end custom css */ /* ui edited css */ body { font-family: Verdana; font-size: 10.0pt; line-height: normal; background-color: #ffffff; } .documentBG { background-color: #ffffff; } /* end ui edited css */</style> </head> <body revision="dcbsxfpf_212g23gkff9:22"> <div align=center id=gx73>
<table align=center border=0 cellpadding=0 cellspacing=0 height=5716 id=hcqu width=800>
<tbody id=usp3>
<tr id=yupz>
<td height=5716 id=wdn1 valign=top width=100%>
<pre id=vhsg>2008-4-22<br id=mr3g><br id=e_5c>fs/read_write.c<br id=anfs><br id=cyyp><font color=#0000ff id=aavu>内核也有简单的函数, 这个lseek/llseek就不多非口舌了.</font><br id=dmnd>asmlinkage off_t sys_lseek(unsigned int fd, off_t offset, unsigned int origin)<br id=yqcl>asmlinkage long sys_llseek(unsigned int fd, unsigned long offset_high,<br id=nthx> unsigned long offset_low, loff_t * result,<br id=eaf4> unsigned int origin) <br id=r0l9><br id=u38x><font color=#0000ff id=tifh>文件读写:</font><br id=ko-q>asmlinkage ssize_t sys_read(unsigned int fd, char * buf, size_t count)<br id=xe5b>asmlinkage ssize_t sys_write(unsigned int fd, const char * buf, size_t count)<br id=ng2j>对于ext2文件系统,其核心函数是mm内的几个函数,已经反复看过多次:<br id=v61p><br id=nw3b>struct file_operations ext2_file_operations = {<br id=muzn> llseek: ext2_file_lseek,<br id=pc4o> read: <font color=#38761d id=qy.0><span id=k4wh><b id=h:2d>generic_file_read</b></span></font>,<br id=eq6d> write: <font color=#38761d id=hu7q><span id=s50t><b id=ke3r>generic_file_write</b></span></font>,<br id=cag-> ioctl: ext2_ioctl,<br id=qnan> mmap: generic_file_mmap,<br id=oxc4> open: ext2_open_file,<br id=prpr> release: ext2_release_file,<br id=in26> fsync: ext2_sync_file,<br id=k8mb>};<br id=iekg><br id=l473>sys_read ->file->f_op->read(以ext2为例) <br id=j.rw> |<br id=rlwu> ext2_file_operations<br id=zkg:> |<br id=mbkd> generic_file_read->do_generic_file_read(this file,filemap.c)<br id=hxb7> |<br id=vdfw> 从page cache寻找指定页__find_page_nolock <br id=ltp9> 如果没有找到则从文件读取mapping->a_ops->readpage<br id=b9-n> |<br id=v9gu> ext2_aops<br id=wq0l> |------------------------------------------------------------------<------+<br id=aqqs> ext2_readpage->block_read_full_page(fs/buffer.c,buffer cache) <br id=hwfi> 注意函数block_read_full_page,虽然位于buffer.c,但并没有使用buffercache. 但是确实使用了buffer:只是再指定page上创建<br id=jan:>buffer提交底层驱动读取文件内容.这个流程有两个值得注意的地方,一是普通file的read通过pagecache进行,二是page cache读取的时<br id=mm68>候不和buffer cache进行同步,三是page cache的确使用了buffer,不过注意,只是buffer io entry而已不是buffer cache.<br id=wmd:><br id=fmrf>详细的分析请参考 <a href=Doc?id=dcbsxfpf_47dqwb7fcm id=ewkc title=filemap.c>filemap.c</a>.<br id=ky.b><font color=#0000ff id=cffq><br id=vj5p>而readv/writev只是再加一层包装,比较简单的,不仔细列举了.</font><br id=p5rp><br id=wbp7>asmlinkage ssize_t sys_readv(unsigned long fd, const struct iovec * vector, unsigned long count)<br id=r3m9>asmlinkage ssize_t sys_writev(unsigned long fd, const struct iovec * vector,unsigned long count)<br id=c4ry><br id=l4o6><font color=#0000ff id=wdr4>pread 和pwrite看看注释就够了.<br id=wr4m>/* From the Single Unix Spec: pread & pwrite act like lseek to pos + op +<br id=b0ew> lseek back to original location. They fail just like lseek does on<br id=gz_:> non-seekable files. */</font><br id=oqfu>asmlinkage ssize_t sys_pread(unsigned int fd, char * buf, size_t count, loff_t pos)<br id=e-3f>asmlinkage ssize_t sys_pwrite(unsigned int fd, const char * buf, size_t count, loff_t pos)<br id=wy.u><br id=myy0>..嘿嘿,这个文件可是够简洁, 内容确不再这里的..<br id=ds68></pre>
</td>
</tr>
</tbody>
</table>
</div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -