@@ -48,19 +48,18 @@ pub trait LegacyMemoryRegion: Copy + core::fmt::Debug {
48
48
}
49
49
50
50
/// 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 > {
52
52
original : I ,
53
53
memory_map : I ,
54
54
current_descriptor : Option < D > ,
55
55
next_frame : PhysFrame ,
56
56
min_frame : PhysFrame ,
57
- used_slices : S ,
58
57
}
59
58
60
59
/// Start address of the first frame that is not part of the lower 1MB of frames
61
60
const LOWER_MEMORY_END_PAGE : u64 = 0x10_0000 ;
62
61
63
- impl < I , D > LegacyFrameAllocator < I , D , Empty < UsedMemorySlice > >
62
+ impl < I , D > LegacyFrameAllocator < I , D >
64
63
where
65
64
I : ExactSizeIterator < Item = D > + Clone ,
66
65
I :: Item : LegacyMemoryRegion ,
@@ -82,28 +81,16 @@ where
82
81
/// before the given `frame` or `0x10000`(1MB) whichever is higher, there are use cases that require
83
82
/// lower conventional memory access (Such as SMP SIPI).
84
83
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 {
96
84
// skip frame 0 because the rust core library does not see 0 as a valid address
97
85
// Also skip at least the lower 1MB of frames, there are use cases that require lower conventional memory access (Such as SMP SIPI).
98
86
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) ;
100
88
Self {
101
89
original : memory_map. clone ( ) ,
102
90
memory_map,
103
91
current_descriptor : None ,
104
92
next_frame : frame,
105
93
min_frame : frame,
106
- used_slices,
107
94
}
108
95
}
109
96
@@ -154,10 +141,10 @@ where
154
141
155
142
/// Calculate the maximum number of regions produced by [Self::construct_memory_map]
156
143
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
161
148
}
162
149
163
150
/// Converts this type to a boot info memory map.
@@ -174,15 +161,22 @@ where
174
161
ramdisk_slice_start : Option < PhysAddr > ,
175
162
ramdisk_slice_len : u64 ,
176
163
) -> & 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
+ } ) ;
186
180
187
181
let mut next_index = 0 ;
188
182
for descriptor in self . original {
@@ -219,34 +213,6 @@ where
219
213
}
220
214
}
221
215
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
-
250
216
fn split_and_add_region < ' a , U > (
251
217
mut region : MemoryRegion ,
252
218
regions : & mut [ MaybeUninit < MemoryRegion > ] ,
@@ -325,11 +291,10 @@ where
325
291
}
326
292
}
327
293
328
- unsafe impl < I , D , S > FrameAllocator < Size4KiB > for LegacyFrameAllocator < I , D , S >
294
+ unsafe impl < I , D > FrameAllocator < Size4KiB > for LegacyFrameAllocator < I , D >
329
295
where
330
296
I : ExactSizeIterator < Item = D > + Clone ,
331
297
I :: Item : LegacyMemoryRegion ,
332
- S : Iterator < Item = UsedMemorySlice > + Clone ,
333
298
{
334
299
fn allocate_frame ( & mut self ) -> Option < PhysFrame < Size4KiB > > {
335
300
if let Some ( current_descriptor) = self . current_descriptor {
0 commit comments