⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _2_4_051_fs_read_write_.html

📁 重读linux 2.4.2o所写的笔记
💻 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 -&gt;file-&gt;f_op-&gt;read(以ext2为例) <br id=j.rw>                             |<br id=rlwu>                  ext2_file_operations<br id=zkg:>                             |<br id=mbkd>                    generic_file_read-&gt;do_generic_file_read(this file,filemap.c)<br id=hxb7>                                          |<br id=vdfw>                                            从page cache寻找指定页__find_page_nolock     <br id=ltp9>                                            如果没有找到则从文件读取mapping-&gt;a_ops-&gt;readpage<br id=b9-n>                                                                                      |<br id=v9gu>                                                                                 ext2_aops<br id=wq0l>         |------------------------------------------------------------------&lt;------+<br id=aqqs>       ext2_readpage-&gt;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 &amp; 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 + -