乱我心者贝者 發表於 2023-6-4 00:00:00

Linux 块设备驱动代码编写

<p>
        按照ldd的说法,linux的设备驱动包括了char,block,net三种设备。char设备是比较简单的,只要分配了major、minor号,就可以进行读写处理了。相对而言,block和net要稍微复杂些。net设备姑且按下不谈,我们在以后的博文中会有涉及。今天,我们可以看看一个简单的block是怎么设计的。</p>
<p>
        为了将block和fs分开,kernel的设计者定义了request queue这一种形式。换一句话说,所有fs对block设备的请求,最终都会转变为request的形式。所以,对于block设备驱动开发的朋友来说,处理好了request queue就掌握了block设备的一半。当然,block设备很多,hd、floppy、ram都可以这么来定义,有兴趣的朋友可以在drivers/block寻找相关的代码来阅读。兴趣没有那么强的同学,可以看看我们这篇博文,基本上也能学个大概。有个基本的概念,再加上一个简单浅显的范例,对于一般的朋友来说,已经足够了。</p>
<p>
        闲话不多说,我们看看一个ramdisk代码驱动是怎么写的,代码来自《深入linux 设备驱动程序内核机制》,</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_935377">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                        <div class="line number28 index27 alt1">
                                                                28</div>
                                                        <div class="line number29 index28 alt2">
                                                                29</div>
                                                        <div class="line number30 index29 alt1">
                                                                30</div>
                                                        <div class="line number31 index30 alt2">
                                                                31</div>
                                                        <div class="line number32 index31 alt1">
                                                                32</div>
                                                        <div class="line number33 index32 alt2">
                                                                33</div>
                                                        <div class="line number34 index33 alt1">
                                                                34</div>
                                                        <div class="line number35 index34 alt2">
                                                                35</div>
                                                        <div class="line number36 index35 alt1">
                                                                36</div>
                                                        <div class="line number37 index36 alt2">
                                                                37</div>
                                                        <div class="line number38 index37 alt1">
                                                                38</div>
                                                        <div class="line number39 index38 alt2">
                                                                39</div>
                                                        <div class="line number40 index39 alt1">
                                                                40</div>
                                                        <div class="line number41 index40 alt2">
                                                                41</div>
                                                        <div class="line number42 index41 alt1">
                                                                42</div>
                                                        <div class="line number43 index42 alt2">
                                                                43</div>
                                                        <div class="line number44 index43 alt1">
                                                                44</div>
                                                        <div class="line number45 index44 alt2">
                                                                45</div>
                                                        <div class="line number46 index45 alt1">
                                                                46</div>
                                                        <div class="line number47 index46 alt2">
                                                                47</div>
                                                        <div class="line number48 index47 alt1">
                                                                48</div>
                                                        <div class="line number49 index48 alt2">
                                                                49</div>
                                                        <div class="line number50 index49 alt1">
                                                                50</div>
                                                        <div class="line number51 index50 alt2">
                                                                51</div>
                                                        <div class="line number52 index51 alt1">
                                                                52</div>
                                                        <div class="line number53 index52 alt2">
                                                                53</div>
                                                        <div class="line number54 index53 alt1">
                                                                54</div>
                                                        <div class="line number55 index54 alt2">
                                                                55</div>
                                                        <div class="line number56 index55 alt1">
                                                                56</div>
                                                        <div class="line number57 index56 alt2">
                                                                57</div>
                                                        <div class="line number58 index57 alt1">
                                                                58</div>
                                                        <div class="line number59 index58 alt2">
                                                                59</div>
                                                        <div class="line number60 index59 alt1">
                                                                60</div>
                                                        <div class="line number61 index60 alt2">
                                                                61</div>
                                                        <div class="line number62 index61 alt1">
                                                                62</div>
                                                        <div class="line number63 index62 alt2">
                                                                63</div>
                                                        <div class="line number64 index63 alt1">
                                                                64</div>
                                                        <div class="line number65 index64 alt2">
                                                                65</div>
                                                        <div class="line number66 index65 alt1">
                                                                66</div>
                                                        <div class="line number67 index66 alt2">
                                                                67</div>
                                                        <div class="line number68 index67 alt1">
                                                                68</div>
                                                        <div class="line number69 index68 alt2">
                                                                69</div>
                                                        <div class="line number70 index69 alt1">
                                                                70</div>
                                                        <div class="line number71 index70 alt2">
                                                                71</div>
                                                        <div class="line number72 index71 alt1">
                                                                72</div>
                                                        <div class="line number73 index72 alt2">
                                                                73</div>
                                                        <div class="line number74 index73 alt1">
                                                                74</div>
                                                        <div class="line number75 index74 alt2">
                                                                75</div>
                                                        <div class="line number76 index75 alt1">
                                                                76</div>
                                                        <div class="line number77 index76 alt2">
                                                                77</div>
                                                        <div class="line number78 index77 alt1">
                                                                78</div>
                                                        <div class="line number79 index78 alt2">
                                                                79</div>
                                                        <div class="line number80 index79 alt1">
                                                                80</div>
                                                        <div class="line number81 index80 alt2">
                                                                81</div>
                                                        <div class="line number82 index81 alt1">
                                                                82</div>
                                                        <div class="line number83 index82 alt2">
                                                                83</div>
                                                        <div class="line number84 index83 alt1">
                                                                84</div>
                                                        <div class="line number85 index84 alt2">
                                                                85</div>
                                                        <div class="line number86 index85 alt1">
                                                                86</div>
                                                        <div class="line number87 index86 alt2">
                                                                87</div>
                                                        <div class="line number88 index87 alt1">
                                                                88</div>
                                                        <div class="line number89 index88 alt2">
                                                                89</div>
                                                        <div class="line number90 index89 alt1">
                                                                90</div>
                                                        <div class="line number91 index90 alt2">
                                                                91</div>
                                                        <div class="line number92 index91 alt1">
                                                                92</div>
                                                        <div class="line number93 index92 alt2">
                                                                93</div>
                                                        <div class="line number94 index93 alt1">
                                                                94</div>
                                                        <div class="line number95 index94 alt2">
                                                                95</div>
                                                        <div class="line number96 index95 alt1">
                                                                96</div>
                                                        <div class="line number97 index96 alt2">
                                                                97</div>
                                                        <div class="line number98 index97 alt1">
                                                                98</div>
                                                        <div class="line number99 index98 alt2">
                                                                99</div>
                                                        <div class="line number100 index99 alt1">
                                                                100</div>
                                                        <div class="line number101 index100 alt2">
                                                                101</div>
                                                        <div class="line number102 index101 alt1">
                                                                102</div>
                                                        <div class="line number103 index102 alt2">
                                                                103</div>
                                                        <div class="line number104 index103 alt1">
                                                                104</div>
                                                        <div class="line number105 index104 alt2">
                                                                105</div>
                                                        <div class="line number106 index105 alt1">
                                                                106</div>
                                                        <div class="line number107 index106 alt2">
                                                                107</div>
                                                        <div class="line number108 index107 alt1">
                                                                108</div>
                                                        <div class="line number109 index108 alt2">
                                                                109</div>
                                                        <div class="line number110 index109 alt1">
                                                                110</div>
                                                        <div class="line number111 index110 alt2">
                                                                111</div>
                                                        <div class="line number112 index111 alt1">
                                                                112</div>
                                                        <div class="line number113 index112 alt2">
                                                                113</div>
                                                        <div class="line number114 index113 alt1">
                                                                114</div>
                                                        <div class="line number115 index114 alt2">
                                                                115</div>
                                                        <div class="line number116 index115 alt1">
                                                                116</div>
                                                        <div class="line number117 index116 alt2">
                                                                117</div>
                                                        <div class="line number118 index117 alt1">
                                                                118</div>
                                                        <div class="line number119 index118 alt2">
                                                                119</div>
                                                        <div class="line number120 index119 alt1">
                                                                120</div>
                                                        <div class="line number121 index120 alt2">
                                                                121</div>
                                                        <div class="line number122 index121 alt1">
                                                                122</div>
                                                        <div class="line number123 index122 alt2">
                                                                123</div>
                                                        <div class="line number124 index123 alt1">
                                                                124</div>
                                                        <div class="line number125 index124 alt2">
                                                                125</div>
                                                        <div class="line number126 index125 alt1">
                                                                126</div>
                                                        <div class="line number127 index126 alt2">
                                                                127</div>
                                                        <div class="line number128 index127 alt1">
                                                                128</div>
                                                        <div class="line number129 index128 alt2">
                                                                129</div>
                                                        <div class="line number130 index129 alt1">
                                                                130</div>
                                                        <div class="line number131 index130 alt2">
                                                                131</div>
                                                        <div class="line number132 index131 alt1">
                                                                132</div>
                                                        <div class="line number133 index132 alt2">
                                                                133</div>
                                                        <div class="line number134 index133 alt1">
                                                                134</div>
                                                        <div class="line number135 index134 alt2">
                                                                135</div>
                                                        <div class="line number136 index135 alt1">
                                                                136</div>
                                                        <div class="line number137 index136 alt2">
                                                                137</div>
                                                        <div class="line number138 index137 alt1">
                                                                138</div>
                                                        <div class="line number139 index138 alt2">
                                                                139</div>
                                                        <div class="line number140 index139 alt1">
                                                                140</div>
                                                        <div class="line number141 index140 alt2">
                                                                141</div>
                                                        <div class="line number142 index141 alt1">
                                                                142</div>
                                                        <div class="line number143 index142 alt2">
                                                                143</div>
                                                        <div class="line number144 index143 alt1">
                                                                144</div>
                                                        <div class="line number145 index144 alt2">
                                                                145</div>
                                                        <div class="line number146 index145 alt1">
                                                                146</div>
                                                        <div class="line number147 index146 alt2">
                                                                147</div>
                                                        <div class="line number148 index147 alt1">
                                                                148</div>
                                                        <div class="line number149 index148 alt2">
                                                                149</div>
                                                        <div class="line number150 index149 alt1">
                                                                150</div>
                                                        <div class="line number151 index150 alt2">
                                                                151</div>
                                                        <div class="line number152 index151 alt1">
                                                                152</div>
                                                        <div class="line number153 index152 alt2">
                                                                153</div>
                                                        <div class="line number154 index153 alt1">
                                                                154</div>
                                                        <div class="line number155 index154 alt2">
                                                                155</div>
                                                        <div class="line number156 index155 alt1">
                                                                156</div>
                                                        <div class="line number157 index156 alt2">
                                                                157</div>
                                                        <div class="line number158 index157 alt1">
                                                                158</div>
                                                        <div class="line number159 index158 alt2">
                                                                159</div>
                                                        <div class="line number160 index159 alt1">
                                                                160</div>
                                                        <div class="line number161 index160 alt2">
                                                                161</div>
                                                        <div class="line number162 index161 alt1">
                                                                162</div>
                                                        <div class="line number163 index162 alt2">
                                                                163</div>
                                                        <div class="line number164 index163 alt1">
                                                                164</div>
                                                        <div class="line number165 index164 alt2">
                                                                165</div>
                                                        <div class="line number166 index165 alt1">
                                                                166</div>
                                                        <div class="line number167 index166 alt2">
                                                                167</div>
                                                        <div class="line number168 index167 alt1">
                                                                168</div>
                                                        <div class="line number169 index168 alt2">
                                                                169</div>
                                                        <div class="line number170 index169 alt1">
                                                                170</div>
                                                        <div class="line number171 index170 alt2">
                                                                171</div>
                                                        <div class="line number172 index171 alt1">
                                                                172</div>
                                                        <div class="line number173 index172 alt2">
                                                                173</div>
                                                        <div class="line number174 index173 alt1">
                                                                174</div>
                                                        <div class="line number175 index174 alt2">
                                                                175</div>
                                                        <div class="line number176 index175 alt1">
                                                                176</div>
                                                        <div class="line number177 index176 alt2">
                                                                177</div>
                                                        <div class="line number178 index177 alt1">
                                                                178</div>
                                                        <div class="line number179 index178 alt2">
                                                                179</div>
                                                        <div class="line number180 index179 alt1">
                                                                180</div>
                                                        <div class="line number181 index180 alt2">
                                                                181</div>
                                                        <div class="line number182 index181 alt1">
                                                                182</div>
                                                        <div class="line number183 index182 alt2">
                                                                183</div>
                                                        <div class="line number184 index183 alt1">
                                                                184</div>
                                                        <div class="line number185 index184 alt2">
                                                                185</div>
                                                        <div class="line number186 index185 alt1">
                                                                186</div>
                                                        <div class="line number187 index186 alt2">
                                                                187</div>
                                                        <div class="line number188 index187 alt1">
                                                                188</div>
                                                        <div class="line number189 index188 alt2">
                                                                189</div>
                                                        <div class="line number190 index189 alt1">
                                                                190</div>
                                                        <div class="line number191 index190 alt2">
                                                                191</div>
                                                        <div class="line number192 index191 alt1">
                                                                192</div>
                                                        <div class="line number193 index192 alt2">
                                                                193</div>
                                                        <div class="line number194 index193 alt1">
                                                                194</div>
                                                        <div class="line number195 index194 alt2">
                                                                195</div>
                                                        <div class="line number196 index195 alt1">
                                                                196</div>
                                                        <div class="line number197 index196 alt2">
                                                                197</div>
                                                        <div class="line number198 index197 alt1">
                                                                198</div>
                                                        <div class="line number199 index198 alt2">
                                                                199</div>
                                                        <div class="line number200 index199 alt1">
                                                                200</div>
                                                        <div class="line number201 index200 alt2">
                                                                201</div>
                                                        <div class="line number202 index201 alt1">
                                                                202</div>
                                                        <div class="line number203 index202 alt2">
                                                                203</div>
                                                        <div class="line number204 index203 alt1">
                                                                204</div>
                                                        <div class="line number205 index204 alt2">
                                                                205</div>
                                                        <div class="line number206 index205 alt1">
                                                                206</div>
                                                        <div class="line number207 index206 alt2">
                                                                207</div>
                                                        <div class="line number208 index207 alt1">
                                                                208</div>
                                                        <div class="line number209 index208 alt2">
                                                                209</div>
                                                        <div class="line number210 index209 alt1">
                                                                210</div>
                                                        <div class="line number211 index210 alt2">
                                                                211</div>
                                                        <div class="line number212 index211 alt1">
                                                                212</div>
                                                        <div class="line number213 index212 alt2">
                                                                213</div>
                                                        <div class="line number214 index213 alt1">
                                                                214</div>
                                                        <div class="line number215 index214 alt2">
                                                                215</div>
                                                        <div class="line number216 index215 alt1">
                                                                216</div>
                                                        <div class="line number217 index216 alt2">
                                                                217</div>
                                                        <div class="line number218 index217 alt1">
                                                                218</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;linux/module.h&gt; </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;linux/kernel.h&gt; </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;linux/init.h&gt; </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;linux/fs.h&gt; </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;linux/types.h&gt; </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;linux/fcntl.h&gt; </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;linux/vmalloc.h&gt; </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;linux/blkdev.h&gt; </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;linux/hdreg.h&gt; </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp preprocessor">#define RAMHD_NAME "ramhd" </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp preprocessor">#define RAMHD_MAX_DEVICE 2 </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp preprocessor">#define RAMHD_MAX_PARTITIONS 4 </code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp preprocessor">#define RAMHD_SECTOR_SIZE 512 </code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp preprocessor">#define RAMHD_SECTORS 16 </code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp preprocessor">#define RAMHD_HEADS 4 </code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="cpp preprocessor">#define RAMHD_CYLINDERS 256 </code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp preprocessor">#define RAMHD_SECTOR_TOTAL (RAMHD_SECTORS * RAMHD_HEADS *RAMHD_CYLINDERS) </code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="cpp preprocessor">#define RAMHD_SIZE (RAMHD_SECTOR_SIZE * RAMHD_SECTOR_TOTAL) //8mb </code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="cpp keyword bold">typedef</code> <code class="cpp keyword bold">struct</code> <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">unsigned </code><code class="cpp color1 bold">char</code><code class="cpp plain">* data; </code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">request_queue* queue; </code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">gendisk* gd; </code>
</div>
                                                                <div class="line number28 index27 alt1">
                                                                        <code class="cpp plain">}RAMHD_DEV; </code>
</div>
                                                                <div class="line number29 index28 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp color1 bold">char</code><code class="cpp plain">* sdisk = {NULL}; </code>
</div>
                                                                <div class="line number31 index30 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp plain">RAMHD_DEV* rdev = {NULL}; </code>
</div>
                                                                <div class="line number32 index31 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp plain">dev_t ramhd_major; </code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp color1 bold">int</code> <code class="cpp plain">ramhd_space_init(</code><code class="cpp keyword bold">void</code><code class="cpp plain">) </code>
</div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i; </code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">err = 0; </code>
</div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">for</code><code class="cpp plain">(i = 0; i &lt; RAMHD_MAX_DEVICE; i++){ </code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">sdisk = vmalloc(RAMHD_SIZE); </code>
</div>
                                                                <div class="line number41 index40 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">if</code><code class="cpp plain">(!sdisk){ </code>
</div>
                                                                <div class="line number42 index41 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">err = -ENOMEM; </code>
</div>
                                                                <div class="line number43 index42 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">return</code> <code class="cpp plain">err; </code>
</div>
                                                                <div class="line number44 index43 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number45 index44 alt2">
                                                                        <code class="cpp spaces">     </code>
</div>
                                                                <div class="line number46 index45 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp functions bold">memset</code><code class="cpp plain">(sdisk, 0, RAMHD_SIZE); </code>
</div>
                                                                <div class="line number47 index46 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number48 index47 alt1">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number49 index48 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">err; </code>
</div>
                                                                <div class="line number50 index49 alt1">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number51 index50 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number52 index51 alt1">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp keyword bold">void</code> <code class="cpp plain">ramhd_space_clean(</code><code class="cpp keyword bold">void</code><code class="cpp plain">) </code>
</div>
                                                                <div class="line number53 index52 alt2">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number54 index53 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i; </code>
</div>
                                                                <div class="line number55 index54 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">for</code><code class="cpp plain">(i = 0; i &lt; RAMHD_MAX_DEVICE; i++){ </code>
</div>
                                                                <div class="line number56 index55 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">vfree(sdisk); </code>
</div>
                                                                <div class="line number57 index56 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number58 index57 alt1">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number59 index58 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number60 index59 alt1">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp color1 bold">int</code> <code class="cpp plain">ramhd_open(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">block_device* bdev, fmode_t mode) </code>
</div>
                                                                <div class="line number61 index60 alt2">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number62 index61 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0; </code>
</div>
                                                                <div class="line number63 index62 alt2">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number64 index63 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number65 index64 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp color1 bold">int</code> <code class="cpp plain">ramhd_release(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">gendisk*gd, fmode_t mode) </code>
</div>
                                                                <div class="line number66 index65 alt1">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number67 index66 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0; </code>
</div>
                                                                <div class="line number68 index67 alt1">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number69 index68 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number70 index69 alt1">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp color1 bold">int</code> <code class="cpp plain">ramhd_ioctl(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">block_device* bdev, fmode_t mode, unsigned </code><code class="cpp color1 bold">int</code> <code class="cpp plain">cmd, unsigned </code><code class="cpp color1 bold">long</code> <code class="cpp plain">arg) </code>
</div>
                                                                <div class="line number71 index70 alt2">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number72 index71 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">err; </code>
</div>
                                                                <div class="line number73 index72 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">hd_geometry geo; </code>
</div>
                                                                <div class="line number74 index73 alt1">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number75 index74 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">switch</code><code class="cpp plain">(cmd) </code>
</div>
                                                                <div class="line number76 index75 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number77 index76 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">case</code> <code class="cpp plain">HDIO_GETGEO: </code>
</div>
                                                                <div class="line number78 index77 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">err = !access_ok(VERIFY_WRITE, arg, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(geo)); </code>
</div>
                                                                <div class="line number79 index78 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">if</code><code class="cpp plain">(err) </code>
</div>
                                                                <div class="line number80 index79 alt1">
                                                                        <code class="cpp spaces">        </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-EFAULT; </code>
</div>
                                                                <div class="line number81 index80 alt2">
                                                                        <code class="cpp spaces">         </code>
</div>
                                                                <div class="line number82 index81 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">geo.cylinders = RAMHD_CYLINDERS; </code>
</div>
                                                                <div class="line number83 index82 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">geo.heads = RAMHD_HEADS; </code>
</div>
                                                                <div class="line number84 index83 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">geo.sectors = RAMHD_SECTORS; </code>
</div>
                                                                <div class="line number85 index84 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">geo.start = get_start_sect(bdev); </code>
</div>
                                                                <div class="line number86 index85 alt1">
                                                                        <code class="cpp spaces">       </code>
</div>
                                                                <div class="line number87 index86 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">if</code><code class="cpp plain">(copy_to_user((</code><code class="cpp keyword bold">void</code><code class="cpp plain">*)arg, &amp;geo, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(geo))) </code>
</div>
                                                                <div class="line number88 index87 alt1">
                                                                        <code class="cpp spaces">        </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-EFAULT; </code>
</div>
                                                                <div class="line number89 index88 alt2">
                                                                        <code class="cpp spaces">       </code>
</div>
                                                                <div class="line number90 index89 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0; </code>
</div>
                                                                <div class="line number91 index90 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number92 index91 alt1">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number93 index92 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-ENOTTY; </code>
</div>
                                                                <div class="line number94 index93 alt1">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number95 index94 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number96 index95 alt1">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp keyword bold">struct</code> <code class="cpp plain">block_device_operations ramhd_fops = { </code>
</div>
                                                                <div class="line number97 index96 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">.owner = THIS_MODULE, </code>
</div>
                                                                <div class="line number98 index97 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">.open = ramhd_open, </code>
</div>
                                                                <div class="line number99 index98 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">.release = ramhd_release, </code>
</div>
                                                                <div class="line number100 index99 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">.ioctl = ramhd_ioctl, </code>
</div>
                                                                <div class="line number101 index100 alt2">
                                                                        <code class="cpp plain">}; </code>
</div>
                                                                <div class="line number102 index101 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number103 index102 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp color1 bold">int</code> <code class="cpp plain">ramhd_make_request(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">request_queue* q, </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">bio* bio) </code>
</div>
                                                                <div class="line number104 index103 alt1">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number105 index104 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">char</code><code class="cpp plain">* pRHdata; </code>
</div>
                                                                <div class="line number106 index105 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">char</code><code class="cpp plain">* pBuffer; </code>
</div>
                                                                <div class="line number107 index106 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">bio_vec* bvec; </code>
</div>
                                                                <div class="line number108 index107 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i; </code>
</div>
                                                                <div class="line number109 index108 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">err = 0; </code>
</div>
                                                                <div class="line number110 index109 alt1">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number111 index110 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">block_device* bdev = bio-&gt;bi_bdev; </code>
</div>
                                                                <div class="line number112 index111 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">RAMHD_DEV* pdev = bdev-&gt;bd_disk-&gt;private_data; </code>
</div>
                                                                <div class="line number113 index112 alt2">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number114 index113 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">if</code><code class="cpp plain">(((bio-&gt;bi_sector * RAMHD_SECTOR_SIZE) + bio-&gt;bi_size) &gt; RAMHD_SIZE){ </code>
</div>
                                                                <div class="line number115 index114 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">err = -EIO; </code>
</div>
                                                                <div class="line number116 index115 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">return</code> <code class="cpp plain">err; </code>
</div>
                                                                <div class="line number117 index116 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number118 index117 alt1">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number119 index118 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">pRHdata = pdev-&gt;data + (bio-&gt;bi_sector * RAMHD_SECTOR_SIZE); </code>
</div>
                                                                <div class="line number120 index119 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">bio_for_each_segment(bvec, bio, i){ </code>
</div>
                                                                <div class="line number121 index120 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">pBuffer = kmap(bvec-&gt;bv_page) + bvec-&gt;bv_offset; </code>
</div>
                                                                <div class="line number122 index121 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">switch</code><code class="cpp plain">(bio_data_dir(bio)){ </code>
</div>
                                                                <div class="line number123 index122 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">case</code> <code class="cpp plain">READ: </code>
</div>
                                                                <div class="line number124 index123 alt1">
                                                                        <code class="cpp spaces">        </code><code class="cpp functions bold">memcpy</code><code class="cpp plain">(pBuffer, pRHdata, bvec-&gt;bv_len); </code>
</div>
                                                                <div class="line number125 index124 alt2">
                                                                        <code class="cpp spaces">        </code><code class="cpp plain">flush_dcache_page(bvec-&gt;bv_page); </code>
</div>
                                                                <div class="line number126 index125 alt1">
                                                                        <code class="cpp spaces">        </code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number127 index126 alt2">
                                                                        <code class="cpp spaces">         </code>
</div>
                                                                <div class="line number128 index127 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">case</code> <code class="cpp plain">WRITE: </code>
</div>
                                                                <div class="line number129 index128 alt2">
                                                                        <code class="cpp spaces">        </code><code class="cpp plain">flush_dcache_page(bvec-&gt;bv_page); </code>
</div>
                                                                <div class="line number130 index129 alt1">
                                                                        <code class="cpp spaces">        </code><code class="cpp functions bold">memcpy</code><code class="cpp plain">(pRHdata, pBuffer, bvec-&gt;bv_len); </code>
</div>
                                                                <div class="line number131 index130 alt2">
                                                                        <code class="cpp spaces">        </code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number132 index131 alt1">
                                                                        <code class="cpp spaces">         </code>
</div>
                                                                <div class="line number133 index132 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">default</code><code class="cpp plain">: </code>
</div>
                                                                <div class="line number134 index133 alt1">
                                                                        <code class="cpp spaces">        </code><code class="cpp plain">kunmap(bvec-&gt;bv_page); </code>
</div>
                                                                <div class="line number135 index134 alt2">
                                                                        <code class="cpp spaces">        </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">out; </code>
</div>
                                                                <div class="line number136 index135 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number137 index136 alt2">
                                                                        <code class="cpp spaces">     </code>
</div>
                                                                <div class="line number138 index137 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">kunmap(bvec-&gt;bv_page); </code>
</div>
                                                                <div class="line number139 index138 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">pRHdata += bvec-&gt;bv_len; </code>
</div>
                                                                <div class="line number140 index139 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number141 index140 alt2">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number142 index141 alt1">
                                                                        <code class="cpp plain">out: </code>
</div>
                                                                <div class="line number143 index142 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">bio_endio(bio, err); </code>
</div>
                                                                <div class="line number144 index143 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0; </code>
</div>
                                                                <div class="line number145 index144 alt2">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number146 index145 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number147 index146 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp color1 bold">int</code> <code class="cpp plain">alloc_ramdev(</code><code class="cpp keyword bold">void</code><code class="cpp plain">) </code>
</div>
                                                                <div class="line number148 index147 alt1">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number149 index148 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i; </code>
</div>
                                                                <div class="line number150 index149 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">for</code><code class="cpp plain">(i = 0; i &lt; RAMHD_MAX_DEVICE; i++){ </code>
</div>
                                                                <div class="line number151 index150 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">rdev = kzalloc(</code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(RAMHD_DEV), GFP_KERNEL); </code>
</div>
                                                                <div class="line number152 index151 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">if</code><code class="cpp plain">(!rdev){ </code>
</div>
                                                                <div class="line number153 index152 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-ENOMEM; </code>
</div>
                                                                <div class="line number154 index153 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number155 index154 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number156 index155 alt1">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number157 index156 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0; </code>
</div>
                                                                <div class="line number158 index157 alt1">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number159 index158 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number160 index159 alt1">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp keyword bold">void</code> <code class="cpp plain">clean_ramdev(</code><code class="cpp keyword bold">void</code><code class="cpp plain">) </code>
</div>
                                                                <div class="line number161 index160 alt2">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number162 index161 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i; </code>
</div>
                                                                <div class="line number163 index162 alt2">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number164 index163 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">for</code><code class="cpp plain">(i = 0; i &lt; RAMHD_MAX_DEVICE; i++){ </code>
</div>
                                                                <div class="line number165 index164 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">if</code><code class="cpp plain">(rdev) </code>
</div>
                                                                <div class="line number166 index165 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">kfree(rdev); </code>
</div>
                                                                <div class="line number167 index166 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number168 index167 alt1">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number169 index168 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number170 index169 alt1">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp color1 bold">int</code> <code class="cpp plain">__init ramhd_init(</code><code class="cpp keyword bold">void</code><code class="cpp plain">) </code>
</div>
                                                                <div class="line number171 index170 alt2">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number172 index171 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i; </code>
</div>
                                                                <div class="line number173 index172 alt2">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number174 index173 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">ramhd_space_init(); </code>
</div>
                                                                <div class="line number175 index174 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">alloc_ramdev(); </code>
</div>
                                                                <div class="line number176 index175 alt1">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number177 index176 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">ramhd_major = register_blkdev(0, RAMHD_NAME); </code>
</div>
                                                                <div class="line number178 index177 alt1">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number179 index178 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">for</code><code class="cpp plain">(i = 0; i &lt; RAMHD_MAX_DEVICE; i++){ </code>
</div>
                                                                <div class="line number180 index179 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">rdev-&gt;data = sdisk; </code>
</div>
                                                                <div class="line number181 index180 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">rdev-&gt;queue = blk_alloc_queue(GFP_KERNEL); </code>
</div>
                                                                <div class="line number182 index181 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">blk_queue_make_request(rdev-&gt;queue, ramhd_make_request); </code>
</div>
                                                                <div class="line number183 index182 alt2">
                                                                        <code class="cpp spaces">     </code>
</div>
                                                                <div class="line number184 index183 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">rdev-&gt;gd = alloc_disk(RAMHD_MAX_PARTITIONS); </code>
</div>
                                                                <div class="line number185 index184 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">rdev-&gt;gd-&gt;major = ramhd_major; </code>
</div>
                                                                <div class="line number186 index185 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">rdev-&gt;gd-&gt;first_minor = i * RAMHD_MAX_PARTITIONS; </code>
</div>
                                                                <div class="line number187 index186 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">rdev-&gt;gd-&gt;fops = &amp;ramhd_fops; </code>
</div>
                                                                <div class="line number188 index187 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">rdev-&gt;gd-&gt;queue = rdev-&gt;queue; </code>
</div>
                                                                <div class="line number189 index188 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">rdev-&gt;gd-&gt;private_data = rdev; </code>
</div>
                                                                <div class="line number190 index189 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp functions bold">sprintf</code><code class="cpp plain">(rdev-&gt;gd-&gt;disk_name, </code><code class="cpp string">"ramhd%c"</code><code class="cpp plain">, </code><code class="cpp string">'a'</code> <code class="cpp plain">+i); </code>
</div>
                                                                <div class="line number191 index190 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">rdev-&gt;gd-&gt;flags |= GENHD_FL_SUPPRESS_PARTITION_INFO; </code>
</div>
                                                                <div class="line number192 index191 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">set_capacity(rdev-&gt;gd, RAMHD_SECTOR_TOTAL); </code>
</div>
                                                                <div class="line number193 index192 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">add_disk(rdev-&gt;gd); </code>
</div>
                                                                <div class="line number194 index193 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number195 index194 alt2">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number196 index195 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0; </code>
</div>
                                                                <div class="line number197 index196 alt2">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number198 index197 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number199 index198 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp keyword bold">void</code> <code class="cpp plain">__exit ramhd_exit(</code><code class="cpp keyword bold">void</code><code class="cpp plain">) </code>
</div>
                                                                <div class="line number200 index199 alt1">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number201 index200 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i; </code>
</div>
                                                                <div class="line number202 index201 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">for</code><code class="cpp plain">(i = 0; i &lt; RAMHD_MAX_DEVICE; i++){ </code>
</div>
                                                                <div class="line number203 index202 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">del_gendisk(rdev-&gt;gd); </code>
</div>
                                                                <div class="line number204 index203 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">put_disk(rdev-&gt;gd); </code>
</div>
                                                                <div class="line number205 index204 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">blk_cleanup_queue(rdev-&gt;queue); </code>
</div>
                                                                <div class="line number206 index205 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number207 index206 alt2">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number208 index207 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">clean_ramdev(); </code>
</div>
                                                                <div class="line number209 index208 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">ramhd_space_clean(); </code>
</div>
                                                                <div class="line number210 index209 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">unregister_blkdev(ramhd_major, RAMHD_NAME); </code>
</div>
                                                                <div class="line number211 index210 alt2">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number212 index211 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number213 index212 alt2">
                                                                        <code class="cpp plain">module_init(ramhd_init); </code>
</div>
                                                                <div class="line number214 index213 alt1">
                                                                        <code class="cpp plain">module_exit(ramhd_exit); </code>
</div>
                                                                <div class="line number215 index214 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number216 index215 alt1">
                                                                        <code class="cpp plain">MODULE_AUTHOR(</code><code class="cpp string">"dennis__chen@ AMDLinuxFGL"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number217 index216 alt2">
                                                                        <code class="cpp plain">MODULE_DESCRIPTION(</code><code class="cpp string">"The ramdisk implementation with request function"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number218 index217 alt1">
                                                                        <code class="cpp plain">MODULE_LICENSE(</code><code class="cpp string">"GPL"</code><code class="cpp plain">);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        为了大家方便,顺便也把Makefile放出来,看过前面blog的朋友都知道,这其实很简单,</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_314294">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp plain">ifneq ($(KERNELRELEASE),) </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp plain">obj-m := ramdisk.o </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp keyword bold">else</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp plain">PWD := $(shell pwd) </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp plain">KVER := $(shell uname -r) </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp plain">KDIR := /lib/modules/$(KVER)/build </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp plain">all: </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">$(MAKE) -C $(KDIR) M=$(PWD) modules </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp plain">clean: </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions modules.* Module.* </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp plain">endif </code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        这段代码究竟有没有用呢?可以按照下面的步骤来做,</p>
<p>
            a)make 一下,生成ramdisk.ko;</p>
<p>
            b)编译好了之后,就可以安装驱动了,在linux下是这么做的,sudo insmod ramdisk.ko;</p>
<p>
            c)安装好了,利用ls /dev/ramhd*, 就会发现在/dev下新增两个结点,即/dev/ramhda和/dev/ramhdb;</p>
<p>
            d)不妨选择其中一个节点进行分区处理, sudo fdisk /dev/ramhda,简单处理的话就建立一个分区, 生成/dev/ramhda1;</p>
<p>
            e)创建文件系统,sudo mkfs.ext3 /dev/ramhda1;</p>
<p>
            f)有了上面的文件系统,就可以进行mount处理,不妨sudo mount /dev/ramhda1 /mnt;</p>
<p>
            g)上面都弄好了,大家就可以copy、delete文件试试了,是不是很简单。</p>
<p>
        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
        原文链接:https://blog.csdn.net/feixiaoxing/article/details/11701797</p>
頁: [1]
查看完整版本: Linux 块设备驱动代码编写