彻底解决elf文件装载问题
This commit is contained in:
parent
a2074a168f
commit
be9c0b187c
|
@ -3,6 +3,7 @@
|
|||
|
||||
#define SYSCALL_PUTCHAR 1
|
||||
#define SYSCALL_PRINT 2
|
||||
#define SYSCALL_GETC 3
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
@ -20,4 +21,10 @@ static inline void syscall_putchar(char c){
|
|||
asm volatile("int $31\n\t" : "=a"(rets) : "0"(SYSCALL_PUTCHAR), "r"(ebx) : "memory", "cc");
|
||||
}
|
||||
|
||||
static inline char syscall_getc(){
|
||||
uint32_t rets;
|
||||
asm volatile("int $31\n\t" : "=a"(rets) : "0"(SYSCALL_GETC) : "memory", "cc");
|
||||
return rets;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,11 +1,33 @@
|
|||
#include "../include/syscall.h"
|
||||
|
||||
int gets(char *buf) {
|
||||
int index = 0;
|
||||
char c;
|
||||
while ((c = syscall_getc()) != '\n') {
|
||||
if (c == '\b') {
|
||||
if (index > 0) {
|
||||
index--;
|
||||
syscall_print("\b \b");
|
||||
}
|
||||
} else {
|
||||
buf[index++] = c;
|
||||
syscall_putchar(c);
|
||||
}
|
||||
}
|
||||
buf[index] = '\0';
|
||||
syscall_putchar(c);
|
||||
return index;
|
||||
}
|
||||
|
||||
void hlt(){
|
||||
while (1);
|
||||
}
|
||||
|
||||
int main(){
|
||||
syscall_print("Hello! User Application!\n");
|
||||
syscall_print("Debug info\n");
|
||||
//char* info;
|
||||
//gets(info);
|
||||
//syscall_print(info);
|
||||
//put_char('A');
|
||||
hlt();
|
||||
return 0;
|
||||
|
|
|
@ -19,6 +19,7 @@ extern syscall
|
|||
|
||||
|
||||
asm_syscall_handler:
|
||||
cli
|
||||
push ds
|
||||
push es
|
||||
push fs
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
// b 0x211972
|
||||
// b 0x20d0a6
|
||||
|
||||
#define ACCESS_ONCE(x) (*(volatile typeof(x) *) (x))
|
||||
|
||||
#define LONG_MAX 9223372036854775807L
|
||||
#define LONG_MIN -9223372036854775808L
|
||||
|
|
|
@ -6,9 +6,10 @@
|
|||
#include "isr.h"
|
||||
|
||||
#define KHEAP_INITIAL_SIZE 0xf00000
|
||||
#define KHEAP_START 0xa0000000
|
||||
#define KHEAP_START 0x90000000
|
||||
#define STACK_SIZE 32768
|
||||
|
||||
#define USER_EXEC_FILE_START 0xa0000000
|
||||
#define USER_START 0xb0000000
|
||||
#define USER_END (USER_START + 0xf00000)
|
||||
#define USER_HEAP_END (USER_END - STACK_SIZE)
|
||||
|
@ -21,8 +22,8 @@ typedef char ALIGN[16];
|
|||
#include "multiboot.h"
|
||||
#include "common.h"
|
||||
|
||||
typedef struct page {
|
||||
uint32_t present: 1;
|
||||
typedef volatile struct page {
|
||||
volatile uint32_t present: 1;
|
||||
uint32_t rw: 1;
|
||||
uint32_t user: 1;
|
||||
uint32_t accessed: 1;
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
#define SYSCALL_PUTC 1
|
||||
#define SYSCALL_PRINT 2
|
||||
#define SYSCALL_GETC 3
|
||||
|
||||
void syscall_install();
|
||||
|
||||
|
|
|
@ -139,9 +139,9 @@ void kernel_main(multiboot_t *multiboot) {
|
|||
//klogf(user_process("service.bin","Service") != -1,"Service base process init.\n");
|
||||
klogf(user_process("init.bin","Init") != -1,"Init base process init.\n");
|
||||
|
||||
int pid = kernel_thread(setup_shell,NULL,"CPOS-Shell");
|
||||
klogf(pid != -1,"Launch kernel shell.\n");
|
||||
kernel_thread(check_task,&pid,"CPOS-CK");
|
||||
//int pid = kernel_thread(setup_shell,NULL,"CPOS-Shell");
|
||||
//klogf(pid != -1,"Launch kernel shell.\n");
|
||||
//kernel_thread(check_task,&pid,"CPOS-CK");
|
||||
|
||||
//panic_pane("System out of memory error!",OUT_OF_MEMORY);
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
page_directory_t *kernel_directory = 0; // 内核用页目录
|
||||
page_directory_t *current_directory = 0; // 当前页目录
|
||||
|
||||
uint32_t *frames;
|
||||
volatile uint32_t *frames;
|
||||
uint32_t nframes;
|
||||
|
||||
extern struct task_struct *current;
|
||||
|
@ -73,11 +73,11 @@ void alloc_frame(page_t *page, int is_kernel, int is_writable) {
|
|||
void alloc_frame_line(page_t *page, uint32_t line,int is_kernel, int is_writable) {
|
||||
set_frame(line);
|
||||
memset(page,0,4);
|
||||
|
||||
page->present = 1; // 现在这个页存在了
|
||||
page->rw = is_writable ? 1 : 0; // 是否可写由is_writable决定
|
||||
page->user = is_kernel ? 0 : 1; // 是否为用户态由is_kernel决定
|
||||
page->frame = line / 0x1000;
|
||||
|
||||
}
|
||||
|
||||
void free_frame(page_t *page) {
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include "../include/description_table.h"
|
||||
#include "../include/graphics.h"
|
||||
#include "../include/io.h"
|
||||
#include "../include/shell.h"
|
||||
|
||||
static void syscall_puchar(uint32_t ebx,uint32_t ecx,uint32_t edx,uint32_t esi,uint32_t edi){
|
||||
printf("%c",ebx);
|
||||
|
@ -13,9 +14,14 @@ static void syscall_print(uint32_t ebx,uint32_t ecx,uint32_t edx,uint32_t esi,ui
|
|||
printf("%s",ebx);
|
||||
}
|
||||
|
||||
static char syscall_getc(uint32_t ebx,uint32_t ecx,uint32_t edx,uint32_t esi,uint32_t edi){
|
||||
return getc();
|
||||
}
|
||||
|
||||
void *sycall_handlers[MAX_SYSCALLS] = {
|
||||
[SYSCALL_PUTC] = syscall_puchar,
|
||||
[SYSCALL_PRINT] = syscall_print,
|
||||
[SYSCALL_GETC] = syscall_getc,
|
||||
};
|
||||
|
||||
typedef size_t (*syscall_t)(size_t, size_t, size_t, size_t, size_t);
|
||||
|
@ -28,7 +34,6 @@ size_t syscall() {
|
|||
asm("mov %%edx, %0\n\t" : "=r"(edx));
|
||||
asm("mov %%esi, %0\n\t" : "=r"(esi));
|
||||
asm("mov %%edi, %0\n\t" : "=r"(edi));
|
||||
//printf("eax: %08x, ebx: %08x, ecx: %08x,\n edx: %08x, esi: %08x, edi: %08x\n", eax, ebx, ecx, edx, esi, edi);
|
||||
if (0 <= eax && eax < MAX_SYSCALLS && sycall_handlers[eax] != NULL) {
|
||||
eax = ((syscall_t)sycall_handlers[eax])(ebx, ecx, edx, esi, edi);
|
||||
} else {
|
||||
|
|
|
@ -227,7 +227,12 @@ int32_t user_process(char *path, char *name){ // 用户进程创建
|
|||
alloc_frame(pg,0,1);
|
||||
}
|
||||
|
||||
char* buffer = user_alloc(new_task,size);
|
||||
for (int i = USER_EXEC_FILE_START; i < USER_EXEC_FILE_START + size; i++) {
|
||||
page_t *pg = get_page(i,1,page, false);
|
||||
alloc_frame(pg,0,1);
|
||||
}
|
||||
|
||||
char* buffer = USER_EXEC_FILE_START;//user_alloc(new_task,size);
|
||||
|
||||
memset(buffer,0,size);
|
||||
vfs_readfile(path,buffer);
|
||||
|
@ -238,7 +243,6 @@ int32_t user_process(char *path, char *name){ // 用户进程创建
|
|||
printf("Unknown exec file format.\n");
|
||||
return -1;
|
||||
}
|
||||
// printf("Process Main Address: %08x\n",ehdr->e_entry);
|
||||
uint32_t main = ehdr->e_entry;
|
||||
load_elf(ehdr,page);
|
||||
|
||||
|
|
|
@ -24,7 +24,6 @@ char getc() {
|
|||
int gets(char *buf, int buf_size) {
|
||||
int index = 0;
|
||||
char c;
|
||||
logk("GETS DEBUG I\n");
|
||||
while ((c = getc()) != '\n') {
|
||||
if (c == '\b') {
|
||||
if (index > 0) {
|
||||
|
@ -36,7 +35,6 @@ int gets(char *buf, int buf_size) {
|
|||
putchar(c);
|
||||
}
|
||||
}
|
||||
logk("GETS DEBUG II\n");
|
||||
buf[index] = '\0';
|
||||
putchar(c);
|
||||
return index;
|
||||
|
|
|
@ -32,10 +32,13 @@ void load_segment(Elf32_Phdr *phdr,page_directory_t *dir, void *elf) {
|
|||
alloc_frame(get_page(i,1,dir,false),0,1);
|
||||
}
|
||||
//printf("VDDR: %08x elf: %08x offset: %08x filesz: %08x elf+offset: %08x\n",phdr->p_vaddr, elf , phdr->p_offset, phdr->p_filesz, elf + phdr->p_offset);
|
||||
//if(phdr->p_vaddr == 0xaffff000) return;
|
||||
uint32_t p_vaddr = (void *)phdr->p_vaddr;
|
||||
uint32_t p_filesz = (void *)phdr->p_filesz;
|
||||
uint32_t p_memsz = (void *)phdr->p_memsz;
|
||||
memcpy((void *)phdr->p_vaddr, elf + phdr->p_offset, phdr->p_filesz);
|
||||
if (phdr->p_memsz > phdr->p_filesz) { // 这个是bss段
|
||||
memset((void *)(phdr->p_vaddr + phdr->p_filesz), 0, phdr->p_memsz - phdr->p_filesz);
|
||||
|
||||
if (p_memsz > p_filesz) { // 这个是bss段
|
||||
memset((void *)(p_vaddr + p_filesz), 0, p_memsz - p_filesz);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue