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

📄 00000047.htm

📁 一份很好的linux入门资料
💻 HTM
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;flamingo&nbsp;(火烈鸟),&nbsp;信区:&nbsp;Linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;第四章(Linux&nbsp;Kernel&nbsp;Internals)!&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Wed&nbsp;Dec&nbsp;20&nbsp;19:35:10&nbsp;2000)&nbsp;<BR>&nbsp;<BR>4.&nbsp;Linux&nbsp;Page&nbsp;Cache&nbsp;<BR>In&nbsp;this&nbsp;chapter&nbsp;we&nbsp;describe&nbsp;the&nbsp;Linux&nbsp;2.4&nbsp;pagecache.&nbsp;The&nbsp;pagecache&nbsp;is&nbsp;-&nbsp;as&nbsp;t&nbsp;<BR>he&nbsp;name&nbsp;suggests&nbsp;-&nbsp;a&nbsp;cache&nbsp;of&nbsp;physical&nbsp;pages.&nbsp;In&nbsp;the&nbsp;UNIX&nbsp;world&nbsp;the&nbsp;concept&nbsp;&nbsp;<BR>of&nbsp;a&nbsp;pagecache&nbsp;became&nbsp;popular&nbsp;with&nbsp;the&nbsp;introduction&nbsp;of&nbsp;SVR4&nbsp;UNIX,&nbsp;where&nbsp;it&nbsp;r&nbsp;<BR>eplaced&nbsp;the&nbsp;buffercache&nbsp;for&nbsp;data&nbsp;IO&nbsp;operations.&nbsp;<BR>While&nbsp;the&nbsp;SVR4&nbsp;pagecache&nbsp;is&nbsp;only&nbsp;used&nbsp;for&nbsp;filesystem&nbsp;data&nbsp;cache&nbsp;and&nbsp;thus&nbsp;use&nbsp;<BR>s&nbsp;the&nbsp;struct&nbsp;vnode&nbsp;and&nbsp;an&nbsp;offset&nbsp;into&nbsp;the&nbsp;file&nbsp;as&nbsp;hash&nbsp;parameters,&nbsp;the&nbsp;Linux&nbsp;<BR>&nbsp;page&nbsp;cache&nbsp;is&nbsp;designed&nbsp;to&nbsp;be&nbsp;more&nbsp;generic,&nbsp;and&nbsp;therefore&nbsp;uses&nbsp;a&nbsp;struct&nbsp;addr&nbsp;<BR>ess_space&nbsp;(explained&nbsp;below)&nbsp;as&nbsp;first&nbsp;parameter.&nbsp;Because&nbsp;the&nbsp;Linux&nbsp;pagecache&nbsp;&nbsp;<BR>is&nbsp;tightly&nbsp;coupled&nbsp;to&nbsp;the&nbsp;notation&nbsp;of&nbsp;address&nbsp;spaces,&nbsp;you&nbsp;will&nbsp;need&nbsp;at&nbsp;least&nbsp;<BR>&nbsp;a&nbsp;basic&nbsp;understanding&nbsp;of&nbsp;adress_spaces&nbsp;to&nbsp;understand&nbsp;the&nbsp;way&nbsp;the&nbsp;pagecache&nbsp;&nbsp;<BR>works.&nbsp;An&nbsp;address_space&nbsp;is&nbsp;some&nbsp;kind&nbsp;of&nbsp;software&nbsp;MMU&nbsp;that&nbsp;maps&nbsp;all&nbsp;pages&nbsp;of&nbsp;&nbsp;<BR>one&nbsp;object&nbsp;(e.g.&nbsp;inode)&nbsp;to&nbsp;an&nbsp;other&nbsp;concurrency&nbsp;(typically&nbsp;physical&nbsp;disk&nbsp;blo&nbsp;<BR>cks).&nbsp;The&nbsp;struct&nbsp;address_space&nbsp;is&nbsp;defined&nbsp;in&nbsp;include/linux/fs.h&nbsp;as:&nbsp;<BR>----------------------------------------------------------------------------&nbsp;<BR>----&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;address_space&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;list_head&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pages;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nrpages;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;address_space_operations&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a_ops;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;vm_area_struct&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_mmap;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;vm_area_struct&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_mmap_shared;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spinlock_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_shared_lock;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;<BR>----------------------------------------------------------------------------&nbsp;<BR>----&nbsp;<BR>To&nbsp;understand&nbsp;the&nbsp;way&nbsp;address_spaces&nbsp;works,&nbsp;we&nbsp;only&nbsp;need&nbsp;to&nbsp;look&nbsp;at&nbsp;a&nbsp;few&nbsp;of&nbsp;<BR>&nbsp;these&nbsp;fields:&nbsp;pages&nbsp;is&nbsp;a&nbsp;double&nbsp;linked&nbsp;list&nbsp;of&nbsp;all&nbsp;pages&nbsp;that&nbsp;belong&nbsp;to&nbsp;thi&nbsp;<BR>s&nbsp;address_space,&nbsp;nrpages&nbsp;is&nbsp;the&nbsp;number&nbsp;of&nbsp;pages&nbsp;in&nbsp;pages,&nbsp;a_ops&nbsp;defines&nbsp;the&nbsp;&nbsp;<BR>methods&nbsp;of&nbsp;this&nbsp;address_space&nbsp;and&nbsp;host&nbsp;is&nbsp;a&nbsp;opaque&nbsp;pointer&nbsp;to&nbsp;the&nbsp;object&nbsp;thi&nbsp;<BR>s&nbsp;address_space&nbsp;belongs&nbsp;to.&nbsp;The&nbsp;usage&nbsp;of&nbsp;pages&nbsp;and&nbsp;nrpages&nbsp;is&nbsp;obvious,&nbsp;so&nbsp;we&nbsp;<BR>&nbsp;will&nbsp;take&nbsp;a&nbsp;tighter&nbsp;look&nbsp;at&nbsp;the&nbsp;address_space_operations&nbsp;structure,&nbsp;defined&nbsp;<BR>&nbsp;in&nbsp;the&nbsp;same&nbsp;header:&nbsp;<BR>----------------------------------------------------------------------------&nbsp;<BR>----&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;address_space_operations&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*writepage)(struct&nbsp;page&nbsp;*);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*readpage)(struct&nbsp;file&nbsp;*,&nbsp;struct&nbsp;page&nbsp;*);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*sync_page)(struct&nbsp;page&nbsp;*);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*prepare_write)(struct&nbsp;file&nbsp;*,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;page&nbsp;*,&nbsp;unsigned,&nbsp;unsigned);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*commit_write)(struct&nbsp;file&nbsp;*,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;page&nbsp;*,&nbsp;unsigned,&nbsp;unsigned);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*bmap)(struct&nbsp;address_space&nbsp;*,&nbsp;long);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;<BR>----------------------------------------------------------------------------&nbsp;<BR>----&nbsp;<BR>For&nbsp;a&nbsp;basic&nbsp;view&nbsp;at&nbsp;the&nbsp;principle&nbsp;of&nbsp;address_spaces&nbsp;(and&nbsp;the&nbsp;pagecache)&nbsp;we&nbsp;n&nbsp;<BR>eed&nbsp;to&nbsp;take&nbsp;a&nbsp;look&nbsp;at&nbsp;-&gt;writepage&nbsp;and&nbsp;-&gt;readpage,&nbsp;but&nbsp;in&nbsp;practice&nbsp;we&nbsp;need&nbsp;to&nbsp;<BR>&nbsp;take&nbsp;a&nbsp;look&nbsp;at&nbsp;-&gt;prepare_write&nbsp;and&nbsp;-&gt;commit_write,&nbsp;too.&nbsp;<BR>You&nbsp;can&nbsp;probably&nbsp;guess&nbsp;what&nbsp;the&nbsp;address_space_operations&nbsp;methods&nbsp;do&nbsp;by&nbsp;virtu&nbsp;<BR>e&nbsp;of&nbsp;their&nbsp;names&nbsp;alone;&nbsp;nevertheless,&nbsp;they&nbsp;do&nbsp;require&nbsp;some&nbsp;explanation.&nbsp;Thei&nbsp;<BR>r&nbsp;use&nbsp;in&nbsp;the&nbsp;course&nbsp;of&nbsp;filesystem&nbsp;data&nbsp;I/O,&nbsp;by&nbsp;far&nbsp;the&nbsp;most&nbsp;common&nbsp;path&nbsp;thro&nbsp;<BR>ugh&nbsp;the&nbsp;pagecache,&nbsp;provides&nbsp;a&nbsp;good&nbsp;way&nbsp;of&nbsp;understanding&nbsp;them.&nbsp;Unlike&nbsp;most&nbsp;ot&nbsp;<BR>her&nbsp;UNIX-like&nbsp;operating&nbsp;systems,&nbsp;Linux&nbsp;has&nbsp;generic&nbsp;file&nbsp;operations&nbsp;(a&nbsp;subset&nbsp;<BR>&nbsp;of&nbsp;the&nbsp;SYSVish&nbsp;vnode&nbsp;operations)&nbsp;for&nbsp;data&nbsp;IO&nbsp;through&nbsp;the&nbsp;pagecache.&nbsp;This&nbsp;me&nbsp;<BR>ans&nbsp;that&nbsp;the&nbsp;data&nbsp;will&nbsp;not&nbsp;directly&nbsp;interact&nbsp;with&nbsp;the&nbsp;file-&nbsp;system&nbsp;on&nbsp;read/w&nbsp;<BR>rite/mmap,&nbsp;but&nbsp;will&nbsp;be&nbsp;read/written&nbsp;from/to&nbsp;the&nbsp;pagecache&nbsp;whenever&nbsp;possible.&nbsp;<BR>&nbsp;The&nbsp;pagecache&nbsp;has&nbsp;to&nbsp;get&nbsp;data&nbsp;from&nbsp;the&nbsp;actual&nbsp;low-level&nbsp;filesystem&nbsp;in&nbsp;case&nbsp;&nbsp;<BR>the&nbsp;user&nbsp;wants&nbsp;to&nbsp;read&nbsp;from&nbsp;a&nbsp;page&nbsp;not&nbsp;yet&nbsp;in&nbsp;memory,&nbsp;or&nbsp;write&nbsp;data&nbsp;to&nbsp;disk&nbsp;&nbsp;<BR>in&nbsp;case&nbsp;memory&nbsp;gets&nbsp;low.&nbsp;<BR>In&nbsp;the&nbsp;read&nbsp;path&nbsp;the&nbsp;generic&nbsp;methods&nbsp;will&nbsp;first&nbsp;try&nbsp;to&nbsp;find&nbsp;a&nbsp;page&nbsp;that&nbsp;matc&nbsp;<BR>hes&nbsp;the&nbsp;wanted&nbsp;inode/index&nbsp;tuple.&nbsp;<BR>hash&nbsp;=&nbsp;page_hash(inode-&gt;i_mapping,&nbsp;index);&nbsp;<BR>Then&nbsp;we&nbsp;test&nbsp;whether&nbsp;the&nbsp;page&nbsp;actually&nbsp;exists.&nbsp;<BR>hash&nbsp;=&nbsp;page_hash(inode-&gt;i_mapping,&nbsp;index);&nbsp;page&nbsp;=&nbsp;__find_page_nolock(inode-&gt;&nbsp;<BR>i_mapping,&nbsp;index,&nbsp;*hash);&nbsp;<BR>When&nbsp;it&nbsp;does&nbsp;not&nbsp;exist,&nbsp;we&nbsp;allocate&nbsp;a&nbsp;new&nbsp;free&nbsp;page,&nbsp;and&nbsp;add&nbsp;it&nbsp;to&nbsp;the&nbsp;page-&nbsp;<BR>&nbsp;cache&nbsp;hash.&nbsp;<BR>page&nbsp;=&nbsp;page_cache_alloc();&nbsp;__add_to_page_cache(page,&nbsp;mapping,&nbsp;index,&nbsp;hash);&nbsp;<BR>After&nbsp;the&nbsp;page&nbsp;is&nbsp;hashed&nbsp;we&nbsp;use&nbsp;the&nbsp;-&gt;readpage&nbsp;address_space&nbsp;operation&nbsp;to&nbsp;ac&nbsp;<BR>tually&nbsp;fill&nbsp;the&nbsp;page&nbsp;with&nbsp;data.&nbsp;(file&nbsp;is&nbsp;an&nbsp;open&nbsp;instance&nbsp;of&nbsp;inode).&nbsp;<BR>error&nbsp;=&nbsp;mapping-&gt;a_ops-&gt;readpage(file,&nbsp;page);&nbsp;<BR>Finally&nbsp;we&nbsp;can&nbsp;copy&nbsp;the&nbsp;data&nbsp;to&nbsp;userspace.&nbsp;<BR>For&nbsp;writing&nbsp;to&nbsp;the&nbsp;filesystem&nbsp;two&nbsp;pathes&nbsp;exist:&nbsp;one&nbsp;for&nbsp;writable&nbsp;mappings&nbsp;(m&nbsp;<BR>map)&nbsp;and&nbsp;one&nbsp;for&nbsp;the&nbsp;write(2)&nbsp;family&nbsp;of&nbsp;syscalls.&nbsp;The&nbsp;mmap&nbsp;case&nbsp;is&nbsp;very&nbsp;simp&nbsp;<BR>le,&nbsp;so&nbsp;it&nbsp;will&nbsp;be&nbsp;discussed&nbsp;first.&nbsp;When&nbsp;a&nbsp;user&nbsp;modifies&nbsp;mappings,&nbsp;the&nbsp;VM&nbsp;sub&nbsp;<BR>system&nbsp;marks&nbsp;the&nbsp;page&nbsp;dirty.&nbsp;<BR>SetPageDirty(page);&nbsp;<BR>The&nbsp;bdflush&nbsp;kernel&nbsp;thread&nbsp;that&nbsp;is&nbsp;trying&nbsp;to&nbsp;free&nbsp;pages,&nbsp;either&nbsp;as&nbsp;background&nbsp;<BR>&nbsp;activity&nbsp;or&nbsp;because&nbsp;memory&nbsp;gets&nbsp;low&nbsp;will&nbsp;try&nbsp;to&nbsp;call&nbsp;-&gt;writepage&nbsp;on&nbsp;the&nbsp;pag&nbsp;<BR>es&nbsp;that&nbsp;are&nbsp;explicitly&nbsp;marked&nbsp;dirty.&nbsp;The&nbsp;-&gt;writepage&nbsp;method&nbsp;does&nbsp;now&nbsp;have&nbsp;to&nbsp;<BR>&nbsp;write&nbsp;the&nbsp;pages&nbsp;content&nbsp;back&nbsp;to&nbsp;disk&nbsp;and&nbsp;free&nbsp;the&nbsp;page.&nbsp;<BR>The&nbsp;second&nbsp;write&nbsp;path&nbsp;is&nbsp;_much_&nbsp;more&nbsp;complicated.&nbsp;For&nbsp;each&nbsp;page&nbsp;the&nbsp;user&nbsp;wri&nbsp;<BR>tes&nbsp;to,&nbsp;we&nbsp;are&nbsp;basically&nbsp;doing&nbsp;the&nbsp;following:&nbsp;(for&nbsp;the&nbsp;full&nbsp;code&nbsp;see&nbsp;mm/file&nbsp;<BR>map.c:generic_file_write()).&nbsp;<BR>page&nbsp;=&nbsp;__grab_cache_page(mapping,&nbsp;index,&nbsp;&amp;cached_page);&nbsp;mapping-&gt;a_ops-&gt;prep&nbsp;<BR>are_write(file,&nbsp;page,&nbsp;offset,&nbsp;offset+bytes);&nbsp;copy_from_user(kaddr+offset,&nbsp;bu&nbsp;<BR>f,&nbsp;bytes);&nbsp;mapping-&gt;a_ops-&gt;commit_write(file,&nbsp;page,&nbsp;offset,&nbsp;offset+bytes);&nbsp;<BR>So&nbsp;first&nbsp;we&nbsp;try&nbsp;to&nbsp;find&nbsp;the&nbsp;hashed&nbsp;page&nbsp;or&nbsp;allocate&nbsp;a&nbsp;new&nbsp;one,&nbsp;then&nbsp;we&nbsp;call&nbsp;&nbsp;<BR>the&nbsp;-&gt;prepare_write&nbsp;address_space&nbsp;method,&nbsp;copy&nbsp;the&nbsp;user&nbsp;buffer&nbsp;to&nbsp;kernel&nbsp;mem&nbsp;<BR>ory&nbsp;and&nbsp;finally&nbsp;call&nbsp;the&nbsp;-&gt;commit_write&nbsp;method.&nbsp;As&nbsp;you&nbsp;probably&nbsp;have&nbsp;seen&nbsp;-&gt;&nbsp;<BR>prepare_write&nbsp;and&nbsp;-&gt;commit_write&nbsp;are&nbsp;fundamentally&nbsp;different&nbsp;from&nbsp;-&gt;readpage&nbsp;<BR>&nbsp;and&nbsp;-&gt;writepage,&nbsp;because&nbsp;they&nbsp;are&nbsp;not&nbsp;only&nbsp;called&nbsp;when&nbsp;physical&nbsp;IO&nbsp;is&nbsp;actua&nbsp;<BR>lly&nbsp;wanted&nbsp;but&nbsp;everytime&nbsp;the&nbsp;user&nbsp;modifies&nbsp;the&nbsp;file.&nbsp;There&nbsp;are&nbsp;two&nbsp;(or&nbsp;more?&nbsp;<BR>)&nbsp;ways&nbsp;to&nbsp;handle&nbsp;this,&nbsp;the&nbsp;first&nbsp;one&nbsp;uses&nbsp;the&nbsp;Linux&nbsp;buffercache&nbsp;to&nbsp;delay&nbsp;the&nbsp;<BR>&nbsp;physical&nbsp;IO,&nbsp;by&nbsp;filling&nbsp;a&nbsp;page-&gt;buffers&nbsp;pointer&nbsp;with&nbsp;buffer_heads,&nbsp;that&nbsp;wil&nbsp;<BR>l&nbsp;be&nbsp;used&nbsp;in&nbsp;try_to_free_buffers&nbsp;(fs/buffers.c)&nbsp;to&nbsp;request&nbsp;IO&nbsp;once&nbsp;memory&nbsp;ge&nbsp;<BR>ts&nbsp;low,&nbsp;and&nbsp;is&nbsp;used&nbsp;very&nbsp;widespread&nbsp;in&nbsp;the&nbsp;current&nbsp;kernel.&nbsp;The&nbsp;other&nbsp;way&nbsp;jus&nbsp;<BR>t&nbsp;sets&nbsp;the&nbsp;page&nbsp;dirty&nbsp;and&nbsp;relies&nbsp;on&nbsp;-&gt;writepage&nbsp;to&nbsp;do&nbsp;all&nbsp;the&nbsp;work.&nbsp;Due&nbsp;to&nbsp;t&nbsp;<BR>he&nbsp;lack&nbsp;of&nbsp;a&nbsp;validitity&nbsp;bitmap&nbsp;in&nbsp;struct&nbsp;page&nbsp;this&nbsp;does&nbsp;not&nbsp;work&nbsp;with&nbsp;filesy&nbsp;<BR>stem&nbsp;that&nbsp;have&nbsp;a&nbsp;smaller&nbsp;granuality&nbsp;then&nbsp;PAGE_SIZE.&nbsp;<BR>&nbsp;<BR>--&nbsp;<BR>WORLD&nbsp;IS&nbsp;NOT&nbsp;YOURS&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>※&nbsp;来源:·BBS&nbsp;水木清华站&nbsp;smth.org·[FROM:&nbsp;162.105.53.152]&nbsp;<BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -