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

📄 head.s

📁 linux0.11 version(301k)
💻 S
📖 第 1 页 / 共 2 页
字号:
<a name=L110 href="source/boot/head.s#L110">110</a>  * I put the kernel page tables right after the page directory,<a name=L111 href="source/boot/head.s#L111">111</a>  * using 4 of them to span 16 Mb of physical memory. People with<a name=L112 href="source/boot/head.s#L112">112</a>  * more than 16MB will have to expand this.<a name=L113 href="source/boot/head.s#L113">113</a>  */<a name=L114 href="source/boot/head.s#L114">114</a> .org 0x1000<a name=L115 href="source/boot/head.s#L115">115</a> pg0:<a name=L116 href="source/boot/head.s#L116">116</a> <a name=L117 href="source/boot/head.s#L117">117</a> .org 0x2000<a name=L118 href="source/boot/head.s#L118">118</a> pg1:<a name=L119 href="source/boot/head.s#L119">119</a> <a name=L120 href="source/boot/head.s#L120">120</a> .org 0x3000<a name=L121 href="source/boot/head.s#L121">121</a> pg2:<a name=L122 href="source/boot/head.s#L122">122</a> <a name=L123 href="source/boot/head.s#L123">123</a> .org 0x4000<a name=L124 href="source/boot/head.s#L124">124</a> pg3:<a name=L125 href="source/boot/head.s#L125">125</a> <a name=L126 href="source/boot/head.s#L126">126</a> .org 0x5000<a name=L127 href="source/boot/head.s#L127">127</a> /*<a name=L128 href="source/boot/head.s#L128">128</a>  * tmp_floppy_area is used by the floppy-driver when DMA cannot<a name=L129 href="source/boot/head.s#L129">129</a>  * reach to a buffer-block. It needs to be aligned, so that it isn't<a name=L130 href="source/boot/head.s#L130">130</a>  * on a 64kB border.<a name=L131 href="source/boot/head.s#L131">131</a>  */<a name=L132 href="source/boot/head.s#L132">132</a> _tmp_floppy_area:<a name=L133 href="source/boot/head.s#L133">133</a>         .fill 1024,1,0<a name=L134 href="source/boot/head.s#L134">134</a> <a name=L135 href="source/boot/head.s#L135">135</a> after_page_tables:<a name=L136 href="source/boot/head.s#L136">136</a>         pushl $0                # These are the parameters to main :-)<a name=L137 href="source/boot/head.s#L137">137</a>         pushl $0<a name=L138 href="source/boot/head.s#L138">138</a>         pushl $0<a name=L139 href="source/boot/head.s#L139">139</a>         pushl $L6               # return address for main, if it decides to.<a name=L140 href="source/boot/head.s#L140">140</a>         pushl $_main<a name=L141 href="source/boot/head.s#L141">141</a>         jmp setup_paging<a name=L142 href="source/boot/head.s#L142">142</a> L6:<a name=L143 href="source/boot/head.s#L143">143</a>         jmp L6                  # main should never return here, but<a name=L144 href="source/boot/head.s#L144">144</a>                                 # just in case, we know what happens.<a name=L145 href="source/boot/head.s#L145">145</a> <a name=L146 href="source/boot/head.s#L146">146</a> /* This is the default interrupt "handler" :-) */<a name=L147 href="source/boot/head.s#L147">147</a> int_msg:<a name=L148 href="source/boot/head.s#L148">148</a>         .asciz "Unknown interrupt\n\r"<a name=L149 href="source/boot/head.s#L149">149</a> .align 2<a name=L150 href="source/boot/head.s#L150">150</a> ignore_int:<a name=L151 href="source/boot/head.s#L151">151</a>         pushl %eax<a name=L152 href="source/boot/head.s#L152">152</a>         pushl %ecx<a name=L153 href="source/boot/head.s#L153">153</a>         pushl %edx<a name=L154 href="source/boot/head.s#L154">154</a>         push %ds<a name=L155 href="source/boot/head.s#L155">155</a>         push %es<a name=L156 href="source/boot/head.s#L156">156</a>         push %fs<a name=L157 href="source/boot/head.s#L157">157</a>         movl $0x10,%eax<a name=L158 href="source/boot/head.s#L158">158</a>         mov %ax,%ds<a name=L159 href="source/boot/head.s#L159">159</a>         mov %ax,%es<a name=L160 href="source/boot/head.s#L160">160</a>         mov %ax,%fs<a name=L161 href="source/boot/head.s#L161">161</a>         pushl $int_msg<a name=L162 href="source/boot/head.s#L162">162</a>         call _printk<a name=L163 href="source/boot/head.s#L163">163</a>         popl %eax<a name=L164 href="source/boot/head.s#L164">164</a>         pop %fs<a name=L165 href="source/boot/head.s#L165">165</a>         pop %es<a name=L166 href="source/boot/head.s#L166">166</a>         pop %ds<a name=L167 href="source/boot/head.s#L167">167</a>         popl %edx<a name=L168 href="source/boot/head.s#L168">168</a>         popl %ecx<a name=L169 href="source/boot/head.s#L169">169</a>         popl %eax<a name=L170 href="source/boot/head.s#L170">170</a>         iret<a name=L171 href="source/boot/head.s#L171">171</a> <a name=L172 href="source/boot/head.s#L172">172</a> <a name=L173 href="source/boot/head.s#L173">173</a> /*<a name=L174 href="source/boot/head.s#L174">174</a>  * Setup_paging<a name=L175 href="source/boot/head.s#L175">175</a>  *<a name=L176 href="source/boot/head.s#L176">176</a>  * This routine sets up paging by setting the page bit<a name=L177 href="source/boot/head.s#L177">177</a>  * in cr0. The page tables are set up, identity-mapping<a name=L178 href="source/boot/head.s#L178">178</a>  * the first 16MB. The pager assumes that no illegal<a name=L179 href="source/boot/head.s#L179">179</a>  * addresses are produced (ie &gt;4Mb on a 4Mb machine).<a name=L180 href="source/boot/head.s#L180">180</a>  *<a name=L181 href="source/boot/head.s#L181">181</a>  * NOTE! Although all physical memory should be identity<a name=L182 href="source/boot/head.s#L182">182</a>  * mapped by this routine, only the kernel page functions<a name=L183 href="source/boot/head.s#L183">183</a>  * use the &gt;1Mb addresses directly. All "normal" functions<a name=L184 href="source/boot/head.s#L184">184</a>  * use just the lower 1Mb, or the local data space, which<a name=L185 href="source/boot/head.s#L185">185</a>  * will be mapped to some other place - mm keeps track of<a name=L186 href="source/boot/head.s#L186">186</a>  * that.<a name=L187 href="source/boot/head.s#L187">187</a>  *<a name=L188 href="source/boot/head.s#L188">188</a>  * For those with more memory than 16 Mb - tough luck. I've<a name=L189 href="source/boot/head.s#L189">189</a>  * not got it, why should you :-) The source is here. Change<a name=L190 href="source/boot/head.s#L190">190</a>  * it. (Seriously - it shouldn't be too difficult. Mostly<a name=L191 href="source/boot/head.s#L191">191</a>  * change some constants etc. I left it at 16Mb, as my machine<a name=L192 href="source/boot/head.s#L192">192</a>  * even cannot be extended past that (ok, but it was cheap :-)<a name=L193 href="source/boot/head.s#L193">193</a>  * I've tried to show which constants to change by having<a name=L194 href="source/boot/head.s#L194">194</a>  * some kind of marker at them (search for "16Mb"), but I<a name=L195 href="source/boot/head.s#L195">195</a>  * won't guarantee that's all :-( )<a name=L196 href="source/boot/head.s#L196">196</a>  */<a name=L197 href="source/boot/head.s#L197">197</a> .align 2<a name=L198 href="source/boot/head.s#L198">198</a> setup_paging:<a name=L199 href="source/boot/head.s#L199">199</a>         movl $1024*5,%ecx               /* 5 pages - pg_dir+4 page tables */<a name=L200 href="source/boot/head.s#L200">200</a>         xorl %eax,%eax<a name=L201 href="source/boot/head.s#L201">201</a>         xorl %edi,%edi                  /* pg_dir is at 0x000 */<a name=L202 href="source/boot/head.s#L202">202</a>         cld;rep;stosl<a name=L203 href="source/boot/head.s#L203">203</a>         movl $pg0+7,_pg_dir             /* set present bit/user r/w */<a name=L204 href="source/boot/head.s#L204">204</a>         movl $pg1+7,_pg_dir+4           /*  --------- " " --------- */<a name=L205 href="source/boot/head.s#L205">205</a>         movl $pg2+7,_pg_dir+8           /*  --------- " " --------- */<a name=L206 href="source/boot/head.s#L206">206</a>         movl $pg3+7,_pg_dir+12          /*  --------- " " --------- */<a name=L207 href="source/boot/head.s#L207">207</a>         movl $pg3+4092,%edi<a name=L208 href="source/boot/head.s#L208">208</a>         movl $0xfff007,%eax             /*  16Mb - 4096 + 7 (r/w user,p) */<a name=L209 href="source/boot/head.s#L209">209</a>         std<a name=L210 href="source/boot/head.s#L210">210</a> 1:      stosl                   /* fill pages backwards - more efficient :-) */<a name=L211 href="source/boot/head.s#L211">211</a>         subl $0x1000,%eax<a name=L212 href="source/boot/head.s#L212">212</a>         jge 1b<a name=L213 href="source/boot/head.s#L213">213</a>         xorl %eax,%eax          /* pg_dir is at 0x0000 */<a name=L214 href="source/boot/head.s#L214">214</a>         movl %eax,%cr3          /* cr3 - page directory start */<a name=L215 href="source/boot/head.s#L215">215</a>         movl %cr0,%eax<a name=L216 href="source/boot/head.s#L216">216</a>         orl $0x80000000,%eax<a name=L217 href="source/boot/head.s#L217">217</a>         movl %eax,%cr0          /* set paging (PG) bit */<a name=L218 href="source/boot/head.s#L218">218</a>         ret                     /* this also flushes prefetch-queue */<a name=L219 href="source/boot/head.s#L219">219</a> <a name=L220 href="source/boot/head.s#L220">220</a> .align 2<a name=L221 href="source/boot/head.s#L221">221</a> .word 0<a name=L222 href="source/boot/head.s#L222">222</a> idt_descr:<a name=L223 href="source/boot/head.s#L223">223</a>         .word 256*8-1           # idt contains 256 entries<a name=L224 href="source/boot/head.s#L224">224</a>         .long _idt<a name=L225 href="source/boot/head.s#L225">225</a> .align 2<a name=L226 href="source/boot/head.s#L226">226</a> .word 0<a name=L227 href="source/boot/head.s#L227">227</a> gdt_descr:<a name=L228 href="source/boot/head.s#L228">228</a>         .word 256*8-1           # so does gdt (not that that's any<a name=L229 href="source/boot/head.s#L229">229</a>         .long _gdt              # magic number, but it works for me :^)<a name=L230 href="source/boot/head.s#L230">230</a> <a name=L231 href="source/boot/head.s#L231">231</a>         .align 3<a name=L232 href="source/boot/head.s#L232">232</a> _idt:   .fill 256,8,0           # idt is uninitialized<a name=L233 href="source/boot/head.s#L233">233</a> <a name=L234 href="source/boot/head.s#L234">234</a> _gdt:   .quad 0x0000000000000000        /* NULL descriptor */<a name=L235 href="source/boot/head.s#L235">235</a>         .quad 0x00c09a0000000fff        /* 16Mb */<a name=L236 href="source/boot/head.s#L236">236</a>         .quad 0x00c0920000000fff        /* 16Mb */<a name=L237 href="source/boot/head.s#L237">237</a>         .quad 0x0000000000000000        /* TEMPORARY - don't use */<a name=L238 href="source/boot/head.s#L238">238</a>         .fill 252,8,0                   /* space for LDT's and TSS's etc */</pre><hr><div align=center>   [<b><i>源代码浏览</i></b>] [<a href="diff/boot/head.s">区别标定</a>] [<a href="ident">标识符搜索</a>] [<a href="search">文本搜索</a>] [<a href="find">文件搜索</a>] </div><hr>本网页由 <a href="http:blurb.html">LXR引擎</a> 自动生成.<br></html>

⌨️ 快捷键说明

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