修复syscall无法处理的问题
This commit is contained in:
parent
9c0f4797ed
commit
a2074a168f
@ -1,4 +1,4 @@
|
|||||||
CFLAGS = -m32 -I$(INCLUDE_PATH) -nostdinc -nolibc -nostdlib -ffreestanding -fno-stack-protector -Qn -fno-pic -fno-pie -fno-asynchronous-unwind-tables -fomit-frame-pointer -finput-charset=UTF-8 -fexec-charset=GB2312 -march=pentium -Qn -O0 -w
|
CFLAGS = -m32 -I$(INCLUDE_PATH) -nolibc -nostdlib -ffreestanding -fno-stack-protector -Qn -fno-pic -fno-pie -fno-asynchronous-unwind-tables -fomit-frame-pointer -finput-charset=UTF-8 -fexec-charset=GB2312 -march=pentium -Qn -O0 -w
|
||||||
CPPFLAGS = -m32 -I$(INCLUDE_PATH) -nostdinc -nolibc -nostdlib -ffreestanding -fno-exceptions -fno-stack-protector -Qn -fno-pic -fno-pie -fno-asynchronous-unwind-tables -fomit-frame-pointer -finput-charset=UTF-8 -fexec-charset=GB2312 -Qn -O3 -march=pentium -fno-rtti -w
|
CPPFLAGS = -m32 -I$(INCLUDE_PATH) -nostdinc -nolibc -nostdlib -ffreestanding -fno-exceptions -fno-stack-protector -Qn -fno-pic -fno-pie -fno-asynchronous-unwind-tables -fomit-frame-pointer -finput-charset=UTF-8 -fexec-charset=GB2312 -Qn -O3 -march=pentium -fno-rtti -w
|
||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
#ifndef CRASHPOWEROS_STDIO_H
|
#ifndef CRASHPOWEROS_STDIO_H
|
||||||
#define CRASHPOWEROS_STDIO_H
|
#define CRASHPOWEROS_STDIO_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
void put_char(char a);
|
void put_char(char a);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
23
apps/include/syscall.h
Normal file
23
apps/include/syscall.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#ifndef CRASHPOWEROS_SYSCALL_H
|
||||||
|
#define CRASHPOWEROS_SYSCALL_H
|
||||||
|
|
||||||
|
#define SYSCALL_PUTCHAR 1
|
||||||
|
#define SYSCALL_PRINT 2
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
static inline void syscall_print(char* c){
|
||||||
|
uint32_t rets;
|
||||||
|
uint32_t __arg1 = c;
|
||||||
|
register uint32_t ebx asm("ebx") = __arg1;
|
||||||
|
asm volatile("int $31\n\t" : "=a"(rets) : "0"(SYSCALL_PRINT), "r"(ebx) : "memory", "cc");
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void syscall_putchar(char c){
|
||||||
|
uint32_t rets;
|
||||||
|
uint32_t __arg1 = (uint32_t)(c);
|
||||||
|
register uint32_t ebx asm("ebx") = __arg1;
|
||||||
|
asm volatile("int $31\n\t" : "=a"(rets) : "0"(SYSCALL_PUTCHAR), "r"(ebx) : "memory", "cc");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -1,11 +1,12 @@
|
|||||||
#include "../include/stdio.h"
|
#include "../include/syscall.h"
|
||||||
|
|
||||||
void hlt(){
|
void hlt(){
|
||||||
while (1);
|
while (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
put_char('A');
|
syscall_print("Hello! User Application!\n");
|
||||||
|
//put_char('A');
|
||||||
hlt();
|
hlt();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
@ -4,7 +4,7 @@ OBJS_PACK = out/syscall.obj
|
|||||||
default : $(OBJS_PACK)
|
default : $(OBJS_PACK)
|
||||||
ar rv ../libo/libp.a $(OBJS_PACK)
|
ar rv ../libo/libp.a $(OBJS_PACK)
|
||||||
out/%.obj : %.c Makefile
|
out/%.obj : %.c Makefile
|
||||||
gcc -m32 -I../include -nostdinc -nostdlib -fno-builtin -ffreestanding -fno-stack-protector -Qn -fno-pic -fno-pie -fno-asynchronous-unwind-tables -fomit-frame-pointer -march=pentium -O0 -w -c $*.c -o out/$*.obj
|
gcc -m32 -I../include -nostdlib -fno-builtin -ffreestanding -fno-stack-protector -Qn -fno-pic -fno-pie -fno-asynchronous-unwind-tables -fomit-frame-pointer -march=pentium -O0 -w -c $*.c -o out/$*.obj
|
||||||
out/%.obj : %.cpp Makefile
|
out/%.obj : %.cpp Makefile
|
||||||
gcc -m32 -I../include -nostdinc -nostdlib -fno-builtin -ffreestanding -fno-stack-protector -Qn -fno-pic -fno-pie -fno-asynchronous-unwind-tables -fomit-frame-pointer -march=pentium -O0 -w -c $*.cpp -o out/$*.obj
|
gcc -m32 -I../include -nostdinc -nostdlib -fno-builtin -ffreestanding -fno-stack-protector -Qn -fno-pic -fno-pie -fno-asynchronous-unwind-tables -fomit-frame-pointer -march=pentium -O0 -w -c $*.cpp -o out/$*.obj
|
||||||
out/%.obj : %.asm Makefile
|
out/%.obj : %.asm Makefile
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
global put_char
|
|
||||||
|
|
||||||
put_char:
|
|
||||||
push eax
|
|
||||||
mov eax, 21h
|
|
||||||
int 31h
|
|
||||||
pop eax
|
|
||||||
ret
|
|
2
apps/libs/syscall.c
Normal file
2
apps/libs/syscall.c
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#include "../include/syscall.h"
|
||||||
|
|
@ -8,54 +8,6 @@
|
|||||||
#define SYSCALL_PUTC 1
|
#define SYSCALL_PUTC 1
|
||||||
#define SYSCALL_PRINT 2
|
#define SYSCALL_PRINT 2
|
||||||
|
|
||||||
#define DEFN_SYSCALL0(fn, num) \
|
|
||||||
int syscall_##fn() \
|
|
||||||
{ \
|
|
||||||
int a; \
|
|
||||||
asm volatile("int $0x80" : "=a" (a) : "0" (num)); \
|
|
||||||
return a; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEFN_SYSCALL1(fn, num, P1) \
|
|
||||||
int syscall_##fn(P1 p1) \
|
|
||||||
{ \
|
|
||||||
int a; \
|
|
||||||
asm volatile("int $0x80" : "=a" (a) : "0" (num), "b" ((int)p1)); \
|
|
||||||
return a; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEFN_SYSCALL2(fn, num, P1, P2) \
|
|
||||||
int syscall_##fn(P1 p1, P2 p2) \
|
|
||||||
{ \
|
|
||||||
int a; \
|
|
||||||
asm volatile("int $0x80" : "=a" (a) : "0" (num), "b" ((int)p1), "c" ((int)p2)); \
|
|
||||||
return a; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEFN_SYSCALL3(fn, num, P1, P2, P3) \
|
|
||||||
int syscall_##fn(P1 p1, P2 p2, P3 p3) \
|
|
||||||
{ \
|
|
||||||
int a; \
|
|
||||||
asm volatile("int $0x80" : "=a" (a) : "0" (num), "b" ((int)p1), "c" ((int)p2), "d"((int)p3)); \
|
|
||||||
return a; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEFN_SYSCALL4(fn, num, P1, P2, P3, P4) \
|
|
||||||
int syscall_##fn(P1 p1, P2 p2, P3 p3, P4 p4) \
|
|
||||||
{ \
|
|
||||||
int a; \
|
|
||||||
asm volatile("int $0x80" : "=a" (a) : "0" (num), "b" ((int)p1), "c" ((int)p2), "d" ((int)p3), "S" ((int)p4)); \
|
|
||||||
return a; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEFN_SYSCALL5(fn, num) \
|
|
||||||
int syscall_##fn(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) \
|
|
||||||
{ \
|
|
||||||
int a; \
|
|
||||||
asm volatile("int $0x80" : "=a" (a) : "0" (num), "b" ((int)p1), "c" ((int)p2), "d" ((int)p3), "S" ((int)p4), "D" ((int)p5)); \
|
|
||||||
return a; \
|
|
||||||
}
|
|
||||||
|
|
||||||
void syscall_install();
|
void syscall_install();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -5,20 +5,17 @@
|
|||||||
#include "../include/graphics.h"
|
#include "../include/graphics.h"
|
||||||
#include "../include/io.h"
|
#include "../include/io.h"
|
||||||
|
|
||||||
void syscall_handler(registers_t regs){
|
static void syscall_puchar(uint32_t ebx,uint32_t ecx,uint32_t edx,uint32_t esi,uint32_t edi){
|
||||||
io_cli();
|
printf("%c",ebx);
|
||||||
register uint32_t eax asm("eax");
|
|
||||||
printf("Syscall is enable. EAX: %08x PHIEAX: %08x\n",regs.eax,eax);
|
|
||||||
if(regs.eax == 0x01){
|
|
||||||
putchar((regs.edx));
|
|
||||||
}
|
}
|
||||||
io_sti();
|
|
||||||
return;
|
static void syscall_print(uint32_t ebx,uint32_t ecx,uint32_t edx,uint32_t esi,uint32_t edi){
|
||||||
|
printf("%s",ebx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *sycall_handlers[MAX_SYSCALLS] = {
|
void *sycall_handlers[MAX_SYSCALLS] = {
|
||||||
[SYSCALL_PUTC] = putchar,
|
[SYSCALL_PUTC] = syscall_puchar,
|
||||||
[SYSCALL_PRINT] = print,
|
[SYSCALL_PRINT] = syscall_print,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef size_t (*syscall_t)(size_t, size_t, size_t, size_t, size_t);
|
typedef size_t (*syscall_t)(size_t, size_t, size_t, size_t, size_t);
|
||||||
@ -31,7 +28,7 @@ size_t syscall() {
|
|||||||
asm("mov %%edx, %0\n\t" : "=r"(edx));
|
asm("mov %%edx, %0\n\t" : "=r"(edx));
|
||||||
asm("mov %%esi, %0\n\t" : "=r"(esi));
|
asm("mov %%esi, %0\n\t" : "=r"(esi));
|
||||||
asm("mov %%edi, %0\n\t" : "=r"(edi));
|
asm("mov %%edi, %0\n\t" : "=r"(edi));
|
||||||
printf("eax: %d, ebx: %d, ecx: %d, edx: %d, esi: %d, edi: %d\n", eax, ebx, ecx, edx, esi, 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) {
|
if (0 <= eax && eax < MAX_SYSCALLS && sycall_handlers[eax] != NULL) {
|
||||||
eax = ((syscall_t)sycall_handlers[eax])(ebx, ecx, edx, esi, edi);
|
eax = ((syscall_t)sycall_handlers[eax])(ebx, ecx, edx, esi, edi);
|
||||||
} else {
|
} else {
|
||||||
|
@ -232,20 +232,21 @@ int32_t user_process(char *path, char *name){ // 用户进程创建
|
|||||||
memset(buffer,0,size);
|
memset(buffer,0,size);
|
||||||
vfs_readfile(path,buffer);
|
vfs_readfile(path,buffer);
|
||||||
|
|
||||||
|
|
||||||
Elf32_Ehdr *ehdr = buffer;
|
Elf32_Ehdr *ehdr = buffer;
|
||||||
if(!elf32Validate(ehdr)){
|
if(!elf32Validate(ehdr)){
|
||||||
printf("Unknown exec file format.\n");
|
printf("Unknown exec file format.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
printf("Process Main Address: %08x\n",ehdr->e_entry);
|
// printf("Process Main Address: %08x\n",ehdr->e_entry);
|
||||||
uint32_t main = ehdr->e_entry;
|
uint32_t main = ehdr->e_entry;
|
||||||
load_elf(ehdr,page);
|
load_elf(ehdr,page);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t *stack_top = (uint32_t * )((uint32_t) new_task + STACK_SIZE);
|
uint32_t *stack_top = (uint32_t * )((uint32_t) new_task + STACK_SIZE);
|
||||||
|
|
||||||
*(--stack_top) = (uint32_t) main;
|
*(--stack_top) = (uint32_t) main;
|
||||||
|
//*(--stack_top) = (uint32_t) buffer;
|
||||||
*(--stack_top) = (uint32_t) kthread_exit;
|
*(--stack_top) = (uint32_t) kthread_exit;
|
||||||
*(--stack_top) = (uint32_t) switch_to_user_mode;
|
*(--stack_top) = (uint32_t) switch_to_user_mode;
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ void load_segment(Elf32_Phdr *phdr,page_directory_t *dir, void *elf) {
|
|||||||
for (size_t i = lo; i < hi; i += 0x1000) {
|
for (size_t i = lo; i < hi; i += 0x1000) {
|
||||||
alloc_frame(get_page(i,1,dir,false),0,1);
|
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);
|
//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;
|
//if(phdr->p_vaddr == 0xaffff000) return;
|
||||||
memcpy((void *)phdr->p_vaddr, elf + phdr->p_offset, phdr->p_filesz);
|
memcpy((void *)phdr->p_vaddr, elf + phdr->p_offset, phdr->p_filesz);
|
||||||
if (phdr->p_memsz > phdr->p_filesz) { // 这个是bss段
|
if (phdr->p_memsz > phdr->p_filesz) { // 这个是bss段
|
||||||
|
Loading…
Reference in New Issue
Block a user