Get VFS workng and start on fputc. Debugger is currently broken :(

This commit is contained in:
pjht 2019-07-20 11:03:27 -05:00
parent fb61bb2806
commit 7974c1e026
15 changed files with 154 additions and 60 deletions

View File

@ -1,15 +1,19 @@
set pagination off
target remote localhost:1234 target remote localhost:1234
symbol-file kernel/kernel.elf symbol-file kernel/kernel.elf
add-symbol-file fsdrv/fsdrv add-symbol-file init/init
b tasking.c:120 b tasking.c:123
commands commands
silent
disable breakpoints disable breakpoints
symbol-file kernel/kernel.elf symbol-file kernel/kernel.elf
if task->pid==2 p task->pid
add-symbol-file fsdrv/fsdrv if task->pid==1
add-symbol-file init/init
enable breakpoints enable breakpoints
else else
enable breakpoints 1 enable breakpoints 1
c
end end
c c
end end

12
file Normal file
View File

@ -0,0 +1,12 @@
vfs/main.c: In function 'vfs_putc':
vfs/main.c:133:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
main.c: In function 'vfs_putc':
main.c:133:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
WARNING: Image format was not specified for 'ext2.img' and probing guessed raw.
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
Specify the 'raw' format explicitly to remove the restrictions.
qemu-system-i386: terminating on signal 1 from pid 58353 (<unknown process>)

Binary file not shown.

View File

@ -12,11 +12,12 @@ int main() {
msg.msg=malloc(sizeof(vfs_message)); msg.msg=malloc(sizeof(vfs_message));
mailbox_get_msg(box,&msg,sizeof(vfs_message)); mailbox_get_msg(box,&msg,sizeof(vfs_message));
if (msg.from==0) { if (msg.from==0) {
yield();
} else { } else {
vfs_message* vfs_msg=(vfs_message*)msg.msg; vfs_message* vfs_msg=(vfs_message*)msg.msg;
msg.to=msg.from; msg.to=msg.from;
msg.from=box; msg.from=box;
vfs_msg->flags=13; vfs_msg->flags=0;
mailbox_send_msg(&msg); mailbox_send_msg(&msg);
yield(); yield();
} }

View File

@ -7,6 +7,7 @@
#include <memory.h> #include <memory.h>
#include <tasking.h> #include <tasking.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
typedef struct { typedef struct {
char filename[100]; char filename[100];
@ -143,19 +144,6 @@ void test_vfs(char* path,uint32_t box,uint32_t fs_box) {
free(msg.msg); free(msg.msg);
yield(); yield();
vga_write_string("Getting fs_box message\n"); vga_write_string("Getting fs_box message\n");
msg.msg=malloc(sizeof(vfs_message));
mailbox_get_msg(fs_box,&msg,sizeof(vfs_message));
if (msg.from==0) {
vga_write_string("No message\n");
} else {
vfs_message* vfs_msg=(vfs_message*)msg.msg;
display_msg(vfs_msg);
msg.to=msg.from;
msg.from=fs_box;
vfs_msg->flags=13;
mailbox_send_msg(&msg);
}
free(msg.msg);
yield(); yield();
vga_write_string("Getting message\n"); vga_write_string("Getting message\n");
msg.msg=malloc(sizeof(vfs_message)); msg.msg=malloc(sizeof(vfs_message));
@ -175,10 +163,19 @@ int main(char* initrd, uint32_t initrd_sz) {
info.width=80; info.width=80;
info.height=25; info.height=25;
vga_init(info); vga_init(info);
vga_write_string("INIT"); vga_write_string("INIT\n");
uint32_t datapos=find_loc("fsdrv",initrd); uint32_t datapos=find_loc("vfs",initrd);
load_task(datapos,initrd); load_task(datapos,initrd);
// uint32_t box=mailbox_new(16); yield();
datapos=find_loc("fsdrv",initrd);
load_task(datapos,initrd);
yield();
vga_write_string("CALLING FOPEN\n");
FILE* file=fopen("/dev/sda","w");
vga_write_string("FOPEN RETURNED\n");
vga_write_string("CALLING FPUTC\n");
fputc('a',file);
vga_write_string("FPUTC RETURNED\n");
// yield(); // yield();
// // uint32_t fs_box=mailbox_new(16); // // uint32_t fs_box=mailbox_new(16);
// // test_vfs("/dev/sda",box,fs_box); // // test_vfs("/dev/sda",box,fs_box);

View File

@ -132,24 +132,27 @@ void isr_handler(registers_t r) {
case 14: { case 14: {
uint32_t addr; uint32_t addr;
asm("movl %%cr2,%0": "=r"(addr)); asm("movl %%cr2,%0": "=r"(addr));
if (r.err_code==0) { vga_write_string("In PID ");
vga_write_string("Kernel process tried to read a non-present page entry at address ");
} else if (r.err_code==1) {
vga_write_string("Kernel process tried to read a page and caused a protection fault at address ");
} else if (r.err_code==2) {
vga_write_string("Kernel process tried to write to a non-present page entry at address ");
} else if (r.err_code==3) {
vga_write_string("Kernel process tried to write a page and caused a protection fault at address ");
} else if (r.err_code==4) {
vga_write_string("User process tried to read a non-present page entry at address ");
} else if (r.err_code==5) {
vga_write_string("User process tried to read a page and caused a protection fault at address ");
} else if (r.err_code==6) {
vga_write_string("User process tried to write to a non-present page entry at address ");
} else if (r.err_code==7) {
vga_write_string("User process tried to write a page and caused a protection fault at address ");
}
char str[11]; char str[11];
int_to_ascii(getPID(),str);
vga_write_string(str);
if (r.err_code==0) {
vga_write_string(", kernel process tried to read a non-present page entry at address ");
} else if (r.err_code==1) {
vga_write_string(", kernel process tried to read a page and caused a protection fault at address ");
} else if (r.err_code==2) {
vga_write_string(", kernel process tried to write to a non-present page entry at address ");
} else if (r.err_code==3) {
vga_write_string(", kernel process tried to write a page and caused a protection fault at address ");
} else if (r.err_code==4) {
vga_write_string(", user process tried to read a non-present page entry at address ");
} else if (r.err_code==5) {
vga_write_string(", user process tried to read a page and caused a protection fault at address ");
} else if (r.err_code==6) {
vga_write_string(", user process tried to write to a non-present page entry at address ");
} else if (r.err_code==7) {
vga_write_string(", user process tried to write a page and caused a protection fault at address ");
}
str[0]='\0'; str[0]='\0';
hex_to_ascii(addr,str); hex_to_ascii(addr,str);
vga_write_string(str); vga_write_string(str);

View File

@ -5,7 +5,7 @@
#include <mailboxes.h> #include <mailboxes.h>
Mailbox* mailboxes=(Mailbox*)0xF6400000; Mailbox* mailboxes=(Mailbox*)0xF6400000;
uint32_t next_box=0; uint32_t next_box=1;
uint32_t kernel_mailbox_new(uint16_t size) { uint32_t kernel_mailbox_new(uint16_t size) {
if (next_box==262144) { if (next_box==262144) {

View File

@ -41,6 +41,10 @@ void map_pages(void* virt_addr_ptr,void* phys_addr_ptr,int num_pages,char usr,ch
flags=flags|((usr&1)<<2); flags=flags|((usr&1)<<2);
smap[(1024+(1024*dir_entry))+table_entry]=phys_addr|flags; smap[(1024+(1024*dir_entry))+table_entry]=phys_addr|flags;
table_entry++; table_entry++;
if (table_entry==1024) {
table_entry=0;
dir_entry++;
}
phys_addr+=0x1000; phys_addr+=0x1000;
} }
} }

View File

@ -21,6 +21,7 @@ uint32_t next_pid;
Task* currentTask; Task* currentTask;
static Task* headTask; static Task* headTask;
static Task* tailTask;
Task* tasking_createTaskCr3KmodeParam(void* eip,void* cr3,char kmode,char param1_exists,uint32_t param1_arg,char param2_exists,uint32_t param2_arg); Task* tasking_createTaskCr3KmodeParam(void* eip,void* cr3,char kmode,char param1_exists,uint32_t param1_arg,char param2_exists,uint32_t param2_arg);
void tasking_init(void* esp) { void tasking_init(void* esp) {
@ -28,6 +29,7 @@ void tasking_init(void* esp) {
next_pid=0; next_pid=0;
headTask=tasking_createTaskCr3KmodeParam(NULL,paging_new_address_space(),1,0,0,0,0); headTask=tasking_createTaskCr3KmodeParam(NULL,paging_new_address_space(),1,0,0,0,0);
currentTask=headTask; currentTask=headTask;
tailTask=headTask;
} }
Task* tasking_createTaskCr3KmodeParam(void* eip,void* cr3,char kmode,char param1_exists,uint32_t param1_arg,char param2_exists,uint32_t param2_arg) { Task* tasking_createTaskCr3KmodeParam(void* eip,void* cr3,char kmode,char param1_exists,uint32_t param1_arg,char param2_exists,uint32_t param2_arg) {
@ -89,8 +91,9 @@ Task* tasking_createTaskCr3KmodeParam(void* eip,void* cr3,char kmode,char param1
if (next_pid>1024*32) { if (next_pid>1024*32) {
halt(); //Cannot ever create more than 32k tasks, as I don't currently reuse PIDs. halt(); //Cannot ever create more than 32k tasks, as I don't currently reuse PIDs.
} }
if (currentTask) { if (tailTask) {
currentTask->next=task; tailTask->next=task;
tailTask=task;
} }
return task; return task;
@ -120,3 +123,7 @@ void tasking_yield(registers_t registers) {
load_smap(task->cr3); load_smap(task->cr3);
switch_to_task(task); switch_to_task(task);
} }
uint32_t getPID() {
return currentTask->pid;
}

View File

@ -9,4 +9,5 @@ void tasking_yield();
Task* tasking_createTask(void* eip); Task* tasking_createTask(void* eip);
Task* tasking_createTaskCr3KmodeParam(void* eip,void* cr3,char kmode,char param1_exists,uint32_t param1_arg,char param2_exists,uint32_t param2_arg); Task* tasking_createTaskCr3KmodeParam(void* eip,void* cr3,char kmode,char param1_exists,uint32_t param1_arg,char param2_exists,uint32_t param2_arg);
char isPrivleged(uint32_t pid); char isPrivleged(uint32_t pid);
uint32_t getPID();
#endif #endif

View File

@ -63,7 +63,7 @@ void kmain(struct multiboot_boot_header_tag* hdr) {
if (tar_hdr->filename[0]=='\0') break; if (tar_hdr->filename[0]=='\0') break;
uint32_t size=getsize(tar_hdr->size); uint32_t size=getsize(tar_hdr->size);
pos+=512; pos+=512;
if (strcmp(&tar_hdr->filename,"init")==0) { if (strcmp(&tar_hdr->filename[0],"init")==0) {
datapos=pos; datapos=pos;
break; break;
} }

View File

@ -4,7 +4,7 @@
#include <ipc/vfs.h> #include <ipc/vfs.h>
#include <stdio.h> #include <stdio.h>
#include <tasking.h> #include <tasking.h>
#define VFS_PID 1 #define VFS_MBOX 3
static uint32_t box; static uint32_t box;
@ -13,14 +13,20 @@ void __stdio_init() {
box=mailbox_new(16); box=mailbox_new(16);
} }
static vfs_message* make_msg(vfs_message_type type, char* mode, char* path) { static vfs_message* make_msg(vfs_message_type type, char* mode, char* path, uint32_t fd, int data) {
static uint32_t id=0; static uint32_t id=0;
vfs_message* msg_data=malloc(sizeof(vfs_message)); vfs_message* msg_data=malloc(sizeof(vfs_message));
msg_data->type=type; msg_data->type=type;
msg_data->id=id; msg_data->id=id;
msg_data->fd=fd;
msg_data->data=data;
id++; id++;
if (mode!=NULL) {
strcpy(&msg_data->mode[0],mode); strcpy(&msg_data->mode[0],mode);
}
if (path!=NULL) {
strcpy(&msg_data->path[0],path); strcpy(&msg_data->path[0],path);
}
return msg_data; return msg_data;
} }
@ -28,16 +34,17 @@ FILE* fopen(char* filename,char* mode) {
if (strlen(filename)>4096 || strlen(mode)>10) { if (strlen(filename)>4096 || strlen(mode)>10) {
return NULL; return NULL;
} }
vfs_message* msg_data=make_msg(VFS_OPEN,mode,filename); vfs_message* msg_data=make_msg(VFS_OPEN,mode,filename,0,0);
Message msg; Message msg;
msg.from=box; msg.from=box;
msg.to=VFS_PID; msg.to=VFS_MBOX;
msg.msg=msg_data; msg.msg=msg_data;
msg.size=sizeof(vfs_message); msg.size=sizeof(vfs_message);
mailbox_send_msg(&msg); mailbox_send_msg(&msg);
free(msg.msg); free(msg.msg);
yield(); yield();
msg.msg=malloc(sizeof(vfs_message)); msg.msg=malloc(sizeof(vfs_message));
yield();
mailbox_get_msg(box,&msg,sizeof(vfs_message)); mailbox_get_msg(box,&msg,sizeof(vfs_message));
while (msg.from==0) { while (msg.from==0) {
yield(); yield();
@ -54,3 +61,30 @@ FILE* fopen(char* filename,char* mode) {
return file; return file;
} }
} }
int fputc(int c, FILE* stream) {
vfs_message* msg_data=make_msg(VFS_PUTC,0,0,*stream,c);
Message msg;
msg.from=box;
msg.to=VFS_MBOX;
msg.msg=msg_data;
msg.size=sizeof(vfs_message);
mailbox_send_msg(&msg);
free(msg.msg);
yield();
msg.msg=malloc(sizeof(vfs_message));
yield();
mailbox_get_msg(box,&msg,sizeof(vfs_message));
while (msg.from==0) {
yield();
mailbox_get_msg(box,&msg,sizeof(vfs_message));
}
vfs_message* vfs_msg=(vfs_message*)msg.msg;
if (vfs_msg->flags) {
free(msg.msg);
return EOF;
} else {
free(msg.msg);
return c;
}
}

View File

@ -17,8 +17,9 @@ typedef struct {
char mode[10]; char mode[10];
uint32_t fd; uint32_t fd;
char path[4096]; char path[4096];
uint32_t pos;
char flags; char flags;
char data; int data;
} vfs_message; } vfs_message;
#endif #endif

View File

@ -13,8 +13,9 @@ typedef struct _vfs_mapping_struct {
} vfs_mapping; } vfs_mapping;
typedef struct { typedef struct {
char* mntpnt; vfs_mapping* mntpnt;
char* path; char* path;
char* mode;
uint32_t pos; uint32_t pos;
char error; char error;
} vfs_file; } vfs_file;
@ -25,7 +26,7 @@ static uint32_t max_drvs;
static uint32_t next_drv_indx; static uint32_t next_drv_indx;
static vfs_mapping* head_mapping; static vfs_mapping* head_mapping;
static vfs_mapping* tail_mapping; static vfs_mapping* tail_mapping;
uint32_t* fd_tables[32768]; vfs_file* fd_tables[32768];
uint16_t open_fds[32768]; uint16_t open_fds[32768];
vfs_message* get_message(Message* msg,uint32_t box) { vfs_message* get_message(Message* msg,uint32_t box) {
@ -52,7 +53,7 @@ static int vfsstrcmp(const char* s1,const char* s2) {
void init_vfs() { void init_vfs() {
drvs=malloc(sizeof(uint32_t)*32); drvs=malloc(sizeof(uint32_t)*32);
drvs[0]=2; drvs[0]=5;
drv_names=malloc(sizeof(const char**)*32); drv_names=malloc(sizeof(const char**)*32);
max_drvs=32; max_drvs=32;
next_drv_indx=0; next_drv_indx=0;
@ -117,12 +118,40 @@ char vfs_fopen(vfs_message* vfs_msg,uint32_t from) {
} }
uint16_t fd=open_fds[from]; uint16_t fd=open_fds[from];
open_fds[from]++; open_fds[from]++;
fd_tables[from][fd].mntpnt=mntpnt;
fd_tables[from][fd].path=malloc(sizeof(char)*(strlen(&vfs_msg->path[0])+1));
strcpy(fd_tables[from][fd].path,&vfs_msg->path[0]);
fd_tables[from][fd].mode=malloc(sizeof(char)*(strlen(&vfs_msg->mode[0])+1));
strcpy(fd_tables[from][fd].mode,&vfs_msg->mode[0]);
fd_tables[from][fd].pos=0;
fd_tables[from][fd].error=0;
vfs_msg->fd=fd; vfs_msg->fd=fd;
return 0; return 0;
} }
return 1; return 1;
} }
char vfs_putc(vfs_message* vfs_msg,uint32_t from) {
uint32_t fd=vfs_msg->fd;
vfs_file file_info=fd_tables[from][fd];
strcpy(&vfs_msg->path[0],file_info.path);
strcpy(&vfs_msg->mode[0],file_info.mode);
vfs_msg->pos=file_info.pos;
Message msg;
msg.from=1;
msg.to=file_info.mntpnt->type;
msg.size=sizeof(vfs_message);
msg.msg=vfs_msg;
mailbox_send_msg(&msg);
yield();
vfs_msg=get_message(&msg,1);
if (vfs_msg->flags!=0) {
return vfs_msg->flags;
}
fd_tables[from][fd].pos++;
return 0;
}
int main() { int main() {
init_vfs(); init_vfs();
uint32_t box=mailbox_new(16); uint32_t box=mailbox_new(16);
@ -135,6 +164,7 @@ int main() {
vfs_msg->flags=vfs_fopen(vfs_msg,msg.from); vfs_msg->flags=vfs_fopen(vfs_msg,msg.from);
break; break;
case VFS_PUTC: case VFS_PUTC:
vfs_msg->flags=vfs_putc(vfs_msg,msg.from);
vfs_msg->flags=1; vfs_msg->flags=1;
break; break;
case VFS_GETC: case VFS_GETC: