@@ -2,14 +2,14 @@ use frame_allocator::FrameAllocator;
2
2
use x86_64:: { PhysAddr , VirtAddr , align_up} ;
3
3
use x86_64:: structures:: paging:: { PAGE_SIZE , PageTable , PageTableFlags , PageTableEntry , Page , PhysFrame } ;
4
4
use usize_conversions:: usize_from;
5
- use xmas_elf;
6
- use xmas_elf :: program :: { self , ProgramHeader } ;
5
+ use xmas_elf:: program :: { self , ProgramHeader64 } ;
6
+ use fixedvec :: FixedVec ;
7
7
8
- pub ( crate ) fn map_kernel ( kernel_start : PhysAddr , elf_file : & xmas_elf :: ElfFile , p4 : & mut PageTable ,
9
- frame_allocator : & mut FrameAllocator ) -> VirtAddr
8
+ pub ( crate ) fn map_kernel ( kernel_start : PhysAddr , segments : & FixedVec < ProgramHeader64 > ,
9
+ p4 : & mut PageTable , frame_allocator : & mut FrameAllocator ) -> VirtAddr
10
10
{
11
- for program_header in elf_file . program_iter ( ) {
12
- map_segment ( kernel_start , program_header , p4, frame_allocator) ;
11
+ for segment in segments {
12
+ map_segment ( segment , kernel_start , p4, frame_allocator) ;
13
13
}
14
14
15
15
// create a stack
@@ -35,24 +35,24 @@ pub(crate) fn identity_map(frame: PhysFrame, flags: PageTableFlags, p4: &mut Pag
35
35
map_page ( page, frame, flags, p4, frame_allocator) ;
36
36
}
37
37
38
- pub ( crate ) fn map_segment ( kernel_start : PhysAddr , program_header : ProgramHeader , p4 : & mut PageTable ,
38
+ pub ( crate ) fn map_segment ( segment : & ProgramHeader64 , kernel_start : PhysAddr , p4 : & mut PageTable ,
39
39
frame_allocator : & mut FrameAllocator )
40
40
{
41
41
unsafe fn zero_frame ( frame : & PhysFrame ) {
42
42
let frame_ptr = frame. start_address ( ) . as_u64 ( ) as * mut [ u8 ; PAGE_SIZE as usize ] ;
43
43
* frame_ptr = [ 0 ; PAGE_SIZE as usize ] ;
44
44
}
45
45
46
- let typ = program_header . get_type ( ) . unwrap ( ) ;
46
+ let typ = segment . get_type ( ) . unwrap ( ) ;
47
47
match typ {
48
48
program:: Type :: Load => {
49
- let mem_size = program_header . mem_size ( ) ;
50
- let file_size = program_header . file_size ( ) ;
51
- let file_offset = program_header . offset ( ) ;
49
+ let mem_size = segment . mem_size ( ) ;
50
+ let file_size = segment . file_size ( ) ;
51
+ let file_offset = segment . offset ( ) ;
52
52
let phys_start_addr = kernel_start + file_offset;
53
- let virt_start_addr = VirtAddr :: new ( program_header . virtual_addr ( ) ) ;
53
+ let virt_start_addr = VirtAddr :: new ( segment . virtual_addr ( ) ) ;
54
54
55
- let flags = program_header . flags ( ) ;
55
+ let flags = segment . flags ( ) ;
56
56
let mut page_table_flags = PageTableFlags :: PRESENT ;
57
57
if !flags. is_execute ( ) { page_table_flags |= PageTableFlags :: NO_EXECUTE } ;
58
58
if flags. is_write ( ) { page_table_flags |= PageTableFlags :: WRITABLE } ;
0 commit comments