Skip to content

Commit

Permalink
fix mapping a not-aligned page bug at kernel/sys_exec.c.
Browse files Browse the repository at this point in the history
  • Loading branch information
tinixos committed Jul 6, 2017
1 parent 3c7371a commit 8570418
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 17 deletions.
Binary file modified floppy.img
Binary file not shown.
37 changes: 23 additions & 14 deletions kernel/kernel/sys_exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
#define Elf32_Word u32 //size 4 无符号大整数
#define Elf32_Uchar u8
#define EI_NIDENT 16
#define PT_LOAD 1
typedef struct{
Elf32_Uchar e_ident[EI_NIDENT];
Elf32_Half e_type;
Expand Down Expand Up @@ -80,7 +81,7 @@ static void new_task_entry()
{
u32 fself = 0;
u32 fsize;
u32 i;
u32 i, vstart, vend, pages;
Elf32_Ehdr selfhead;
Elf32_Phdr selfphdr;

Expand All @@ -100,22 +101,30 @@ static void new_task_entry()
sys_read(fself, (u8 *)&selfphdr, sizeof(Elf32_Phdr));

/*
* 如果需要的p_memsz正好页对齐,则按照需要申请即可
* 否则需要给出p_memsz的向上对齐值
* 早期编译器不生成除了 PT_LOAD 段之外的其他类型
* 这里要跳过对非 Loadable 段的处理
*/
if (selfphdr.p_memsz % PAGE_SIZE != 0)
if (selfphdr.p_type == PT_LOAD)
{
u_get_pages(selfphdr.p_memsz/PAGE_SIZE+1,
selfphdr.p_vaddr,
selfphdr.p_type);
} else {
u_get_pages(selfphdr.p_memsz/PAGE_SIZE,
selfphdr.p_vaddr,
selfphdr.p_type);
if (selfphdr.p_align != PAGE_SIZE)
{
panic("Task_entry: unknow segment align %x.", selfphdr.p_align);
}

/*
* 这里 p_vaddr 可能不是页对齐值
* 起始地址应该是 p_vaddr 的下边界
* 结束地址永远是 p_vaddr + p_memsz 的上边界
*/
vstart = selfphdr.p_vaddr & PAGE_MASK;
vend = PAGE_ALIGN(selfphdr.p_vaddr + selfphdr.p_memsz);
pages = (vend - vstart) / PAGE_SIZE;

u_get_pages(pages, vstart, selfphdr.p_type);

sys_seek(fself, selfphdr.p_offset, SEEK_SET);
sys_read(fself, (u8 *)selfphdr.p_vaddr, selfphdr.p_filesz);
}

sys_seek(fself, selfphdr.p_offset, SEEK_SET);
sys_read(fself, (u8 *)selfphdr.p_vaddr, selfphdr.p_filesz);
}

/*
Expand Down
12 changes: 10 additions & 2 deletions kernel/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,16 @@ static void do_exception_exit(char * str,long * esp,long error_code,
warning("DS=%04X ES=%04X FS=%04X CS=%04X EFLAGS: %08X",
ds&0xffff, es&0xffff, fs&0xffff, esp[1]&0xffff, esp[2]);
warning("EIP=%08X ", esp[0]);
warning("Task %d exit.", current);
sys_exit();

if ((esp[1]&0xffff) == KERNEL_CS)
{
panic("Kernel mode exception, panic!");
}
else
{
warning("User mode exception, Task %d exit.", current);
sys_exit();
}
}

void do_double_fault(long * esp, long error_code,
Expand Down
3 changes: 2 additions & 1 deletion kernel/mm/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
#define PAGE_READONLY (PAGE_PRESENT | PAGE_USER | PAGE_ACCESSED)
#define PAGE_TABLE (PAGE_PRESENT | PAGE_RW | PAGE_USER | PAGE_ACCESSED)

#define PAGE_ALIGN(_x) ((_x)&0xFFFFF000)
#define PAGE_MASK (~(PAGE_SIZE-1))
#define PAGE_ALIGN(X) (((X)+PAGE_SIZE-1)&PAGE_MASK)


/* 用刷新cr3的方法来刷新TLB */
Expand Down

0 comments on commit 8570418

Please sign in to comment.