17.01.2014 Views

The holy bible of SWEB - Institute of Applied Information Processing ...

The holy bible of SWEB - Institute of Applied Information Processing ...

The holy bible of SWEB - Institute of Applied Information Processing ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

3.4. INTERFACE & CLASSES CHAPTER 3. VM, PROTECTION AND PAGING<br />

138 }<br />

139 else<br />

140 {<br />

141 page_table_entry ∗pte_base =<br />

142 ( page_table_entry ∗) get3GBAdressOfPPN (<br />

143 page_directory [ pde_lpn ] . pde4k . page_table_base_address<br />

144 ) ;<br />

145 for ( uint32 pte_lpn =0; pte_lpn < PAGE_TABLE_ENTRIES; ++pte_lpn )<br />

146 {<br />

147 i f ( pte_base [ pte_lpn ] . present )<br />

148 {<br />

149 pte_base [ pte_lpn ] . present = 0;<br />

150 PageManager : : instance ()−> freePage ( pte_base [ pte_lpn ] . page_base_address ) ;<br />

151 }<br />

152 }<br />

153 page_directory [ pde_lpn ] . pde4k . present =0;<br />

154 PageManager : : instance ()−> freePage ( page_directory [ pde_lpn ] . pde4k . page_table_base_address ) ;<br />

155 }<br />

156 }<br />

157 }<br />

158 PageManager : : instance ()−> freePage ( physical_page_directory_page ) ;<br />

159 }<br />

160<br />

161 bool ArchMemory : : checkAddressValid ( uint32 physical_page_directory_page , uint32 laddress_to_check )<br />

162 {<br />

163 page_directory_entry ∗page_directory =<br />

164 ( page_directory_entry ∗) get3GBAdressOfPPN ( physical_page_directory_page ) ;<br />

165 uint32 linear_page = laddress_to_check / PAGE_SIZE;<br />

166 uint32 pde_lpn = linear_page / PAGE_TABLE_ENTRIES;<br />

167 uint32 pte_lpn = linear_page % PAGE_TABLE_ENTRIES;<br />

168 i f ( page_directory [ pde_lpn ] . pde4k . present )<br />

169 {<br />

170 i f ( page_directory [ pde_lpn ] . pde4m. use_4_m_pages )<br />

171 return true ;<br />

172<br />

173 page_table_entry ∗pte_base =<br />

174 ( page_table_entry ∗) get3GBAdressOfPPN (<br />

175 page_directory [ pde_lpn ] . pde4k . page_table_base_address<br />

176 ) ;<br />

177 i f ( pte_base [ pte_lpn ] . present )<br />

178 return true ;<br />

179 else<br />

180 return false ;<br />

181 }<br />

182 else<br />

183 return false ;<br />

184 }<br />

185<br />

186 uint32 ArchMemory : : getPhysicalPageOfVirtualPageInKernelMapping ( uint32 linear_page ,<br />

187<br />

188 {<br />

189 page_directory_entry ∗page_directory =<br />

190 ( page_directory_entry ∗) &kernel_page_directory_start ;<br />

191 uint32 pde_lpn = linear_page / PAGE_TABLE_ENTRIES;<br />

192 uint32 pte_lpn = linear_page % PAGE_TABLE_ENTRIES;<br />

193 i f ( page_directory [ pde_lpn ] . pde4k . present ) //the present b i t i s the same f o r 4k and 4m<br />

194 {<br />

195 i f ( page_directory [ pde_lpn ] . pde4m. use_4_m_pages )<br />

196 {<br />

197 ∗physical_page = page_directory [ pde_lpn ] . pde4m. page_base_address ;<br />

198 return (PAGE_SIZE∗1024U) ;<br />

199 }<br />

38 <strong>of</strong> 151

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!