@@ -48,19 +48,18 @@ pub trait LegacyMemoryRegion: Copy + core::fmt::Debug {
4848}
4949
5050/// A physical frame allocator based on a BIOS or UEFI provided memory map.
51- pub struct LegacyFrameAllocator < I , D , S > {
51+ pub struct LegacyFrameAllocator < I , D > {
5252 original : I ,
5353 memory_map : I ,
5454 current_descriptor : Option < D > ,
5555 next_frame : PhysFrame ,
5656 min_frame : PhysFrame ,
57- used_slices : S ,
5857}
5958
6059/// Start address of the first frame that is not part of the lower 1MB of frames
6160const LOWER_MEMORY_END_PAGE : u64 = 0x10_0000 ;
6261
63- impl < I , D > LegacyFrameAllocator < I , D , Empty < UsedMemorySlice > >
62+ impl < I , D > LegacyFrameAllocator < I , D >
6463where
6564 I : ExactSizeIterator < Item = D > + Clone ,
6665 I :: Item : LegacyMemoryRegion ,
@@ -82,28 +81,16 @@ where
8281 /// before the given `frame` or `0x10000`(1MB) whichever is higher, there are use cases that require
8382 /// lower conventional memory access (Such as SMP SIPI).
8483 pub fn new_starting_at ( frame : PhysFrame , memory_map : I ) -> Self {
85- Self :: new_with_used_slices ( frame, memory_map, empty ( ) )
86- }
87- }
88-
89- impl < I , D , S > LegacyFrameAllocator < I , D , S >
90- where
91- I : ExactSizeIterator < Item = D > + Clone ,
92- I :: Item : LegacyMemoryRegion ,
93- S : Iterator < Item = UsedMemorySlice > + Clone ,
94- {
95- pub fn new_with_used_slices ( start_frame : PhysFrame , memory_map : I , used_slices : S ) -> Self {
9684 // skip frame 0 because the rust core library does not see 0 as a valid address
9785 // Also skip at least the lower 1MB of frames, there are use cases that require lower conventional memory access (Such as SMP SIPI).
9886 let lower_mem_end = PhysFrame :: containing_address ( PhysAddr :: new ( LOWER_MEMORY_END_PAGE ) ) ;
99- let frame = core:: cmp:: max ( start_frame , lower_mem_end) ;
87+ let frame = core:: cmp:: max ( frame , lower_mem_end) ;
10088 Self {
10189 original : memory_map. clone ( ) ,
10290 memory_map,
10391 current_descriptor : None ,
10492 next_frame : frame,
10593 min_frame : frame,
106- used_slices,
10794 }
10895 }
10996
@@ -154,10 +141,10 @@ where
154141
155142 /// Calculate the maximum number of regions produced by [Self::construct_memory_map]
156143 pub fn memory_map_max_region_count ( & self ) -> usize {
157- // every used slice can split an original region into 3 new regions,
158- // this means we need to reserve 2 extra spaces for each slice .
159- // There are 3 additional slices ( kernel, ramdisk and the bootloader heap)
160- self . len ( ) + ( 3 + self . used_slices . clone ( ) . count ( ) ) * 2
144+ // every used region can split an original region into 3 new regions,
145+ // this means we need to reserve 2 extra spaces for each region .
146+ // There are 3 used regions: kernel, ramdisk and the bootloader heap
147+ self . len ( ) + 6
161148 }
162149
163150 /// Converts this type to a boot info memory map.
@@ -174,15 +161,22 @@ where
174161 ramdisk_slice_start : Option < PhysAddr > ,
175162 ramdisk_slice_len : u64 ,
176163 ) -> & mut [ MemoryRegion ] {
177- let used_slices = Self :: used_regions_iter (
178- self . min_frame ,
179- self . next_frame ,
180- kernel_slice_start,
181- kernel_slice_len,
182- ramdisk_slice_start,
183- ramdisk_slice_len,
184- self . used_slices ,
185- ) ;
164+ let used_slices = [
165+ UsedMemorySlice {
166+ start : self . min_frame . start_address ( ) . as_u64 ( ) ,
167+ end : self . next_frame . start_address ( ) . as_u64 ( ) ,
168+ } ,
169+ UsedMemorySlice :: new_from_len ( kernel_slice_start. as_u64 ( ) , kernel_slice_len) ,
170+ ]
171+ . into_iter ( )
172+ . chain (
173+ ramdisk_slice_start
174+ . map ( |start| UsedMemorySlice :: new_from_len ( start. as_u64 ( ) , ramdisk_slice_len) ) ,
175+ )
176+ . map ( |slice| UsedMemorySlice {
177+ start : align_down ( slice. start , 0x1000 ) ,
178+ end : align_up ( slice. end , 0x1000 ) ,
179+ } ) ;
186180
187181 let mut next_index = 0 ;
188182 for descriptor in self . original {
@@ -219,34 +213,6 @@ where
219213 }
220214 }
221215
222- fn used_regions_iter (
223- min_frame : PhysFrame ,
224- next_free : PhysFrame ,
225- kernel_slice_start : PhysAddr ,
226- kernel_slice_len : u64 ,
227- ramdisk_slice_start : Option < PhysAddr > ,
228- ramdisk_slice_len : u64 ,
229- used_slices : S ,
230- ) -> impl Iterator < Item = UsedMemorySlice > + Clone {
231- [
232- UsedMemorySlice {
233- start : min_frame. start_address ( ) . as_u64 ( ) ,
234- end : next_free. start_address ( ) . as_u64 ( ) ,
235- } ,
236- UsedMemorySlice :: new_from_len ( kernel_slice_start. as_u64 ( ) , kernel_slice_len) ,
237- ]
238- . into_iter ( )
239- . chain (
240- ramdisk_slice_start
241- . map ( |start| UsedMemorySlice :: new_from_len ( start. as_u64 ( ) , ramdisk_slice_len) ) ,
242- )
243- . chain ( used_slices)
244- . map ( |slice| UsedMemorySlice {
245- start : align_down ( slice. start , 0x1000 ) ,
246- end : align_up ( slice. end , 0x1000 ) ,
247- } )
248- }
249-
250216 fn split_and_add_region < ' a , U > (
251217 mut region : MemoryRegion ,
252218 regions : & mut [ MaybeUninit < MemoryRegion > ] ,
@@ -325,11 +291,10 @@ where
325291 }
326292}
327293
328- unsafe impl < I , D , S > FrameAllocator < Size4KiB > for LegacyFrameAllocator < I , D , S >
294+ unsafe impl < I , D > FrameAllocator < Size4KiB > for LegacyFrameAllocator < I , D >
329295where
330296 I : ExactSizeIterator < Item = D > + Clone ,
331297 I :: Item : LegacyMemoryRegion ,
332- S : Iterator < Item = UsedMemorySlice > + Clone ,
333298{
334299 fn allocate_frame ( & mut self ) -> Option < PhysFrame < Size4KiB > > {
335300 if let Some ( current_descriptor) = self . current_descriptor {
0 commit comments