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

📄 mem.c

📁 linux字符驱动源码
💻 C
📖 第 1 页 / 共 3 页
字号:
<a name=L175 href="source/kernel/chr_drv/mem.c?v=0.97#L175">175</a>         return <a href="ident?v=0.97;i=count">count</a>;<a name=L176 href="source/kernel/chr_drv/mem.c?v=0.97#L176">176</a> }<a name=L177 href="source/kernel/chr_drv/mem.c?v=0.97#L177">177</a> <a name=L178 href="source/kernel/chr_drv/mem.c?v=0.97#L178">178</a> <b><i>/*</i></b><a name=L179 href="source/kernel/chr_drv/mem.c?v=0.97#L179">179</a> <b><i> * The memory devices use the full 32 bits of the offset, and so we cannot</i></b><a name=L180 href="source/kernel/chr_drv/mem.c?v=0.97#L180">180</a> <b><i> * check against negative addresses: they are ok. The return value is weird,</i></b><a name=L181 href="source/kernel/chr_drv/mem.c?v=0.97#L181">181</a> <b><i> * though, in that case (0).</i></b><a name=L182 href="source/kernel/chr_drv/mem.c?v=0.97#L182">182</a> <b><i> *</i></b><a name=L183 href="source/kernel/chr_drv/mem.c?v=0.97#L183">183</a> <b><i> * also note that seeking relative to the "end of file" isn't supported:</i></b><a name=L184 href="source/kernel/chr_drv/mem.c?v=0.97#L184">184</a> <b><i> * it has no meaning, so it returns -EINVAL.</i></b><a name=L185 href="source/kernel/chr_drv/mem.c?v=0.97#L185">185</a> <b><i> */</i></b><a name=L186 href="source/kernel/chr_drv/mem.c?v=0.97#L186">186</a> static int <a href="ident?v=0.97;i=mem_lseek">mem_lseek</a>(struct <a href="ident?v=0.97;i=inode">inode</a> * <a href="ident?v=0.97;i=inode">inode</a>, struct <a href="ident?v=0.97;i=file">file</a> * <a href="ident?v=0.97;i=file">file</a>, <a href="ident?v=0.97;i=off_t">off_t</a> offset, int orig)<a name=L187 href="source/kernel/chr_drv/mem.c?v=0.97#L187">187</a> {<a name=L188 href="source/kernel/chr_drv/mem.c?v=0.97#L188">188</a>         switch (orig) {<a name=L189 href="source/kernel/chr_drv/mem.c?v=0.97#L189">189</a>                 case 0:<a name=L190 href="source/kernel/chr_drv/mem.c?v=0.97#L190">190</a>                         <a href="ident?v=0.97;i=file">file</a>-&gt;f_pos = offset;<a name=L191 href="source/kernel/chr_drv/mem.c?v=0.97#L191">191</a>                         return <a href="ident?v=0.97;i=file">file</a>-&gt;f_pos;<a name=L192 href="source/kernel/chr_drv/mem.c?v=0.97#L192">192</a>                 case 1:<a name=L193 href="source/kernel/chr_drv/mem.c?v=0.97#L193">193</a>                         <a href="ident?v=0.97;i=file">file</a>-&gt;f_pos += offset;<a name=L194 href="source/kernel/chr_drv/mem.c?v=0.97#L194">194</a>                         return <a href="ident?v=0.97;i=file">file</a>-&gt;f_pos;<a name=L195 href="source/kernel/chr_drv/mem.c?v=0.97#L195">195</a>                 default:<a name=L196 href="source/kernel/chr_drv/mem.c?v=0.97#L196">196</a>                         return -<a href="ident?v=0.97;i=EINVAL">EINVAL</a>;<a name=L197 href="source/kernel/chr_drv/mem.c?v=0.97#L197">197</a>         }<a name=L198 href="source/kernel/chr_drv/mem.c?v=0.97#L198">198</a>         if (<a href="ident?v=0.97;i=file">file</a>-&gt;f_pos &lt; 0)<a name=L199 href="source/kernel/chr_drv/mem.c?v=0.97#L199">199</a>                 return 0;<a name=L200 href="source/kernel/chr_drv/mem.c?v=0.97#L200">200</a>         return <a href="ident?v=0.97;i=file">file</a>-&gt;f_pos;<a name=L201 href="source/kernel/chr_drv/mem.c?v=0.97#L201">201</a> }<a name=L202 href="source/kernel/chr_drv/mem.c?v=0.97#L202">202</a> <a name=L203 href="source/kernel/chr_drv/mem.c?v=0.97#L203">203</a> static int <a href="ident?v=0.97;i=mem_read">mem_read</a>(struct <a href="ident?v=0.97;i=inode">inode</a> * <a href="ident?v=0.97;i=inode">inode</a>, struct <a href="ident?v=0.97;i=file">file</a> * <a href="ident?v=0.97;i=file">file</a>, char * <a href="ident?v=0.97;i=buf">buf</a>, int <a href="ident?v=0.97;i=count">count</a>)<a name=L204 href="source/kernel/chr_drv/mem.c?v=0.97#L204">204</a> {<a name=L205 href="source/kernel/chr_drv/mem.c?v=0.97#L205">205</a>         switch (<a href="ident?v=0.97;i=MINOR">MINOR</a>(<a href="ident?v=0.97;i=inode">inode</a>-&gt;i_rdev)) {<a name=L206 href="source/kernel/chr_drv/mem.c?v=0.97#L206">206</a>                 case 0:<a name=L207 href="source/kernel/chr_drv/mem.c?v=0.97#L207">207</a>                         return <a href="ident?v=0.97;i=read_ram">read_ram</a>(<a href="ident?v=0.97;i=inode">inode</a>,<a href="ident?v=0.97;i=file">file</a>,<a href="ident?v=0.97;i=buf">buf</a>,<a href="ident?v=0.97;i=count">count</a>);<a name=L208 href="source/kernel/chr_drv/mem.c?v=0.97#L208">208</a>                 case 1:<a name=L209 href="source/kernel/chr_drv/mem.c?v=0.97#L209">209</a>                         return <a href="ident?v=0.97;i=read_mem">read_mem</a>(<a href="ident?v=0.97;i=inode">inode</a>,<a href="ident?v=0.97;i=file">file</a>,<a href="ident?v=0.97;i=buf">buf</a>,<a href="ident?v=0.97;i=count">count</a>);<a name=L210 href="source/kernel/chr_drv/mem.c?v=0.97#L210">210</a>                 case 2:<a name=L211 href="source/kernel/chr_drv/mem.c?v=0.97#L211">211</a>                         return <a href="ident?v=0.97;i=read_kmem">read_kmem</a>(<a href="ident?v=0.97;i=inode">inode</a>,<a href="ident?v=0.97;i=file">file</a>,<a href="ident?v=0.97;i=buf">buf</a>,<a href="ident?v=0.97;i=count">count</a>);<a name=L212 href="source/kernel/chr_drv/mem.c?v=0.97#L212">212</a>                 case 3:<a name=L213 href="source/kernel/chr_drv/mem.c?v=0.97#L213">213</a>                         return 0;       <b><i>/* /dev/null */</i></b><a name=L214 href="source/kernel/chr_drv/mem.c?v=0.97#L214">214</a>                 case 4:<a name=L215 href="source/kernel/chr_drv/mem.c?v=0.97#L215">215</a>                         return <a href="ident?v=0.97;i=read_port">read_port</a>(<a href="ident?v=0.97;i=inode">inode</a>,<a href="ident?v=0.97;i=file">file</a>,<a href="ident?v=0.97;i=buf">buf</a>,<a href="ident?v=0.97;i=count">count</a>);<a name=L216 href="source/kernel/chr_drv/mem.c?v=0.97#L216">216</a>                 case 5:<a name=L217 href="source/kernel/chr_drv/mem.c?v=0.97#L217">217</a>                         return <a href="ident?v=0.97;i=read_zero">read_zero</a>(<a href="ident?v=0.97;i=inode">inode</a>,<a href="ident?v=0.97;i=file">file</a>,<a href="ident?v=0.97;i=buf">buf</a>,<a href="ident?v=0.97;i=count">count</a>);<a name=L218 href="source/kernel/chr_drv/mem.c?v=0.97#L218">218</a>                 default:<a name=L219 href="source/kernel/chr_drv/mem.c?v=0.97#L219">219</a>                         return -<a href="ident?v=0.97;i=ENODEV">ENODEV</a>;<a name=L220 href="source/kernel/chr_drv/mem.c?v=0.97#L220">220</a>         }<a name=L221 href="source/kernel/chr_drv/mem.c?v=0.97#L221">221</a> }<a name=L222 href="source/kernel/chr_drv/mem.c?v=0.97#L222">222</a> <a name=L223 href="source/kernel/chr_drv/mem.c?v=0.97#L223">223</a> static int <a href="ident?v=0.97;i=mem_write">mem_write</a>(struct <a href="ident?v=0.97;i=inode">inode</a> * <a href="ident?v=0.97;i=inode">inode</a>, struct <a href="ident?v=0.97;i=file">file</a> * <a href="ident?v=0.97;i=file">file</a>, char * <a href="ident?v=0.97;i=buf">buf</a>, int <a href="ident?v=0.97;i=count">count</a>)<a name=L224 href="source/kernel/chr_drv/mem.c?v=0.97#L224">224</a> {<a name=L225 href="source/kernel/chr_drv/mem.c?v=0.97#L225">225</a>         switch (<a href="ident?v=0.97;i=MINOR">MINOR</a>(<a href="ident?v=0.97;i=inode">inode</a>-&gt;i_rdev)) {<a name=L226 href="source/kernel/chr_drv/mem.c?v=0.97#L226">226</a>                 case 0:<a name=L227 href="source/kernel/chr_drv/mem.c?v=0.97#L227">227</a>                         return <a href="ident?v=0.97;i=write_ram">write_ram</a>(<a href="ident?v=0.97;i=inode">inode</a>,<a href="ident?v=0.97;i=file">file</a>,<a href="ident?v=0.97;i=buf">buf</a>,<a href="ident?v=0.97;i=count">count</a>);<a name=L228 href="source/kernel/chr_drv/mem.c?v=0.97#L228">228</a>                 case 1:<a name=L229 href="source/kernel/chr_drv/mem.c?v=0.97#L229">229</a>                         return <a href="ident?v=0.97;i=write_mem">write_mem</a>(<a href="ident?v=0.97;i=inode">inode</a>,<a href="ident?v=0.97;i=file">file</a>,<a href="ident?v=0.97;i=buf">buf</a>,<a href="ident?v=0.97;i=count">count</a>);<a name=L230 href="source/kernel/chr_drv/mem.c?v=0.97#L230">230</a>                 case 2:<a name=L231 href="source/kernel/chr_drv/mem.c?v=0.97#L231">231</a>                         return <a href="ident?v=0.97;i=write_kmem">write_kmem</a>(<a href="ident?v=0.97;i=inode">inode</a>,<a href="ident?v=0.97;i=file">file</a>,<a href="ident?v=0.97;i=buf">buf</a>,<a href="ident?v=0.97;i=count">count</a>);<a name=L232 href="source/kernel/chr_drv/mem.c?v=0.97#L232">232</a>                 case 3:<a name=L233 href="source/kernel/chr_drv/mem.c?v=0.97#L233">233</a>                         return <a href="ident?v=0.97;i=count">count</a>;   <b><i>/* /dev/null */</i></b><a name=L234 href="source/kernel/chr_drv/mem.c?v=0.97#L234">234</a>                 case 4:<a name=L235 href="source/kernel/chr_drv/mem.c?v=0.97#L235">235</a>                         return <a href="ident?v=0.97;i=write_port">write_port</a>(<a href="ident?v=0.97;i=inode">inode</a>,<a href="ident?v=0.97;i=file">file</a>,<a href="ident?v=0.97;i=buf">buf</a>,<a href="ident?v=0.97;i=count">count</a>);<a name=L236 href="source/kernel/chr_drv/mem.c?v=0.97#L236">236</a>                 case 5:<a name=L237 href="source/kernel/chr_drv/mem.c?v=0.97#L237">237</a>                         return <a href="ident?v=0.97;i=count">count</a>; <b><i>/* /dev/zero */</i></b><a name=L238 href="source/kernel/chr_drv/mem.c?v=0.97#L238">238</a>                 default:<a name=L239 href="source/kernel/chr_drv/mem.c?v=0.97#L239">239</a>                         return -<a href="ident?v=0.97;i=ENODEV">ENODEV</a>;<a name=L240 href="source/kernel/chr_drv/mem.c?v=0.97#L240">240</a>         }<a name=L241 href="source/kernel/chr_drv/mem.c?v=0.97#L241">241</a> }<a name=L242 href="source/kernel/chr_drv/mem.c?v=0.97#L242">242</a> <a name=L243 href="source/kernel/chr_drv/mem.c?v=0.97#L243">243</a> static struct <a href="ident?v=0.97;i=file_operations">file_operations</a> <a href="ident?v=0.97;i=mem_fops">mem_fops</a> = {<a name=L244 href="source/kernel/chr_drv/mem.c?v=0.97#L244">244</a>         <a href="ident?v=0.97;i=mem_lseek">mem_lseek</a>,<a name=L245 href="source/kernel/chr_drv/mem.c?v=0.97#L245">245</a>         <a href="ident?v=0.97;i=mem_read">mem_read</a>,<a name=L246 href="source/kernel/chr_drv/mem.c?v=0.97#L246">246</a>         <a href="ident?v=0.97;i=mem_write">mem_write</a>,<a name=L247 href="source/kernel/chr_drv/mem.c?v=0.97#L247">247</a>         <a href="ident?v=0.97;i=NULL">NULL</a>,           <b><i>/* mem_readdir */</i></b><a name=L248 href="source/kernel/chr_drv/mem.c?v=0.97#L248">248</a>         <a href="ident?v=0.97;i=NULL">NULL</a>,           <b><i>/* mem_select */</i></b><a name=L249 href="source/kernel/chr_drv/mem.c?v=0.97#L249">249</a>         <a href="ident?v=0.97;i=NULL">NULL</a>,           <b><i>/* mem_ioctl */</i></b><a name=L250 href="source/kernel/chr_drv/mem.c?v=0.97#L250">250</a>         <a href="ident?v=0.97;i=NULL">NULL</a>,           <b><i>/* no special open code */</i></b><a name=L251 href="source/kernel/chr_drv/mem.c?v=0.97#L251">251</a>         <a href="ident?v=0.97;i=NULL">NULL</a>            <b><i>/* no special release code */</i></b><a name=L252 href="source/kernel/chr_drv/mem.c?v=0.97#L252">252</a> };<a name=L253 href="source/kernel/chr_drv/mem.c?v=0.97#L253">253</a> <a name=L254 href="source/kernel/chr_drv/mem.c?v=0.97#L254">254</a> long <a href="ident?v=0.97;i=chr_dev_init">chr_dev_init</a>(long mem_start, long mem_end)<a name=L255 href="source/kernel/chr_drv/mem.c?v=0.97#L255">255</a> {<a name=L256 href="source/kernel/chr_drv/mem.c?v=0.97#L256">256</a>         <a href="ident?v=0.97;i=chrdev_fops">chrdev_fops</a>[1] = &amp;<a href="ident?v=0.97;i=mem_fops">mem_fops</a>;<a name=L257 href="source/kernel/chr_drv/mem.c?v=0.97#L257">257</a>         mem_start = <a href="ident?v=0.97;i=tty_init">tty_init</a>(mem_start);<a name=L258 href="source/kernel/chr_drv/mem.c?v=0.97#L258">258</a>         mem_start = <a href="ident?v=0.97;i=lp_init">lp_init</a>(mem_start);<a name=L259 href="source/kernel/chr_drv/mem.c?v=0.97#L259">259</a>         mem_start = <a href="ident?v=0.97;i=mouse_init">mouse_init</a>(mem_start);<a name=L260 href="source/kernel/chr_drv/mem.c?v=0.97#L260">260</a>         return mem_start;<a name=L261 href="source/kernel/chr_drv/mem.c?v=0.97#L261">261</a> }<a name=L262 href="source/kernel/chr_drv/mem.c?v=0.97#L262">262</a> </pre><hr><div align=center>   [<b><i>source navigation</i></b>] [<a href="diff/kernel/chr_drv/mem.c?v=0.97">diff markup</a>] [<a href="ident?v=0.97">identifier search</a>] [<a href="search?v=0.97">freetext search</a>] [<a href="find?v=0.97">file search</a>] </div><hr>This page was automatically generated by the <a href="http:blurb.html">LXR engine</a>.<br>Visit the <a href="http://lxr.linux.no/">LXR main site</a> for moreinformation.</html>

⌨️ 快捷键说明

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