Store size of message in buffer
This commit is contained in:
parent
7ee2472fe5
commit
1216d4c000
6
Makefile
6
Makefile
@ -28,16 +28,16 @@ debug: os.iso kernel/kernel.elf
|
|||||||
@$(EMU) -s $(QFLAGS) &
|
@$(EMU) -s $(QFLAGS) &
|
||||||
@$(GDB) -ex "target remote localhost:1234" -ex "symbol-file kernel/kernel.elf"
|
@$(GDB) -ex "target remote localhost:1234" -ex "symbol-file kernel/kernel.elf"
|
||||||
|
|
||||||
os.iso: kernel/kernel.elf initrd/* initrd/init initrd/vfs
|
os.iso: kernel/kernel.elf init vfs initrd/*
|
||||||
@cp kernel/kernel.elf iso/boot
|
@cp kernel/kernel.elf iso/boot
|
||||||
@cd initrd; tar -f ../iso/boot/initrd.tar -c *
|
@cd initrd; tar -f ../iso/boot/initrd.tar -c *
|
||||||
@grub-mkrescue -o $@ iso
|
@grub-mkrescue -o $@ iso
|
||||||
|
|
||||||
initrd/init: init/* kernel/start.o
|
init: init/* kernel/start.o
|
||||||
@cd init && make
|
@cd init && make
|
||||||
@cp init/init initrd/init
|
@cp init/init initrd/init
|
||||||
|
|
||||||
initrd/vfs: vfs/* kernel/start.o
|
vfs: vfs/* kernel/start.o
|
||||||
@cd vfs && make
|
@cd vfs && make
|
||||||
@cp vfs/vfs initrd/vfs
|
@cp vfs/vfs initrd/vfs
|
||||||
|
|
||||||
|
13
init/main.c
13
init/main.c
@ -88,13 +88,18 @@ int main(char* initrd, uint32_t initrd_sz) {
|
|||||||
vga_write_string("Loaded VFS into memory, creating task\n");
|
vga_write_string("Loaded VFS into memory, creating task\n");
|
||||||
createTaskCr3((void*)header.entry,cr3);
|
createTaskCr3((void*)header.entry,cr3);
|
||||||
vga_write_string("Created VFS task, sending test message\n");
|
vga_write_string("Created VFS task, sending test message\n");
|
||||||
send_msg(2,"hi",3);
|
send_msg(2,"hello",6);
|
||||||
vga_write_string("Sent test message, yielding to task\n");
|
vga_write_string("Sent test message, yielding to task\n");
|
||||||
yield();
|
yield();
|
||||||
vga_write_string("Yielded and got control, getting message\n");
|
vga_write_string("Yielded and got control, getting message\n");
|
||||||
int sender=&sender;
|
int sender;
|
||||||
char* msg=get_msg(&sender);
|
int size;
|
||||||
vga_write_string("Message: ");
|
char* msg=get_msg(&sender,&size);
|
||||||
|
vga_write_string("Message of size ");
|
||||||
|
char str[256];
|
||||||
|
int_to_ascii(size,str);
|
||||||
|
vga_write_string(str);
|
||||||
|
vga_write_string(": ");
|
||||||
vga_write_string(msg);
|
vga_write_string(msg);
|
||||||
vga_write_string("\n");
|
vga_write_string("\n");
|
||||||
}
|
}
|
||||||
|
@ -186,7 +186,7 @@ void isr_handler(registers_t r) {
|
|||||||
} else if (r.eax==5) {
|
} else if (r.eax==5) {
|
||||||
r.ebx=(uint32_t)tasking_get_errno_address();
|
r.ebx=(uint32_t)tasking_get_errno_address();
|
||||||
} else if (r.eax==6) {
|
} else if (r.eax==6) {
|
||||||
r.ebx=(uint32_t)tasking_get_msg((uint32_t*)r.ebx);
|
r.ebx=(uint32_t)tasking_get_msg((uint32_t*)r.ebx,(uint32_t*)r.ecx);
|
||||||
} else if (r.eax==7) {
|
} else if (r.eax==7) {
|
||||||
tasking_send_msg(r.ebx,(void*)r.ecx,r.edx);
|
tasking_send_msg(r.ebx,(void*)r.ecx,r.edx);
|
||||||
} else if (r.eax==8) {
|
} else if (r.eax==8) {
|
||||||
|
@ -120,6 +120,7 @@ void tasking_send_msg(uint32_t pid,char* msg,uint32_t size) {
|
|||||||
}
|
}
|
||||||
task->msg_store[task->wr]=data;
|
task->msg_store[task->wr]=data;
|
||||||
task->sender_store[task->wr]=currentTask->pid;
|
task->sender_store[task->wr]=currentTask->pid;
|
||||||
|
task->size_store[task->wr]=size;
|
||||||
task->wr++;
|
task->wr++;
|
||||||
if (task->wr==16) {
|
if (task->wr==16) {
|
||||||
task->wr=0;
|
task->wr=0;
|
||||||
@ -135,7 +136,7 @@ void tasking_send_msg(uint32_t pid,char* msg,uint32_t size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void* tasking_get_msg(uint32_t* sender) {
|
void* tasking_get_msg(uint32_t* sender,uint32_t* size) {
|
||||||
if (!currentTask->msg_store) {
|
if (!currentTask->msg_store) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -153,6 +154,7 @@ void* tasking_get_msg(uint32_t* sender) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
*sender=currentTask->sender_store[currentTask->rd];
|
*sender=currentTask->sender_store[currentTask->rd];
|
||||||
|
*size=currentTask->size_store[currentTask->rd];
|
||||||
char* data=currentTask->msg_store[currentTask->rd];
|
char* data=currentTask->msg_store[currentTask->rd];
|
||||||
currentTask->msg_store[currentTask->rd]=NULL;
|
currentTask->msg_store[currentTask->rd]=NULL;
|
||||||
currentTask->sender_store[currentTask->rd]=0;
|
currentTask->sender_store[currentTask->rd]=0;
|
||||||
|
@ -14,6 +14,7 @@ typedef struct Task {
|
|||||||
uint32_t pid;
|
uint32_t pid;
|
||||||
char* msg_store[16];
|
char* msg_store[16];
|
||||||
uint32_t sender_store[16];
|
uint32_t sender_store[16];
|
||||||
|
uint32_t size_store[16];
|
||||||
uint8_t rd;
|
uint8_t rd;
|
||||||
uint8_t wr;
|
uint8_t wr;
|
||||||
struct Task* next;
|
struct Task* next;
|
||||||
|
@ -10,5 +10,5 @@ Task* tasking_createTask(void* eip);
|
|||||||
Task* tasking_createTaskCr3(void* eip,void* cr3);
|
Task* tasking_createTaskCr3(void* eip,void* cr3);
|
||||||
char isPrivleged(uint32_t pid);
|
char isPrivleged(uint32_t pid);
|
||||||
void tasking_send_msg(uint32_t pid,char* msg,uint32_t size);
|
void tasking_send_msg(uint32_t pid,char* msg,uint32_t size);
|
||||||
void* tasking_get_msg(uint32_t* sender);
|
void* tasking_get_msg(uint32_t* sender,uint32_t* size);
|
||||||
#endif
|
#endif
|
||||||
|
@ -14,12 +14,12 @@ void createTask(void* task) {
|
|||||||
"::"b"(task));
|
"::"b"(task));
|
||||||
}
|
}
|
||||||
|
|
||||||
void* get_msg(uint32_t* sender) {
|
void* get_msg(uint32_t* sender,uint32_t* size) {
|
||||||
void* msg;
|
void* msg;
|
||||||
asm volatile(" \
|
asm volatile(" \
|
||||||
mov $6, %%eax; \
|
mov $6, %%eax; \
|
||||||
int $80; \
|
int $80; \
|
||||||
":"=b"(msg):"b"(sender));
|
":"=b"(msg):"b"(sender),"c"(size));
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,6 @@ void createTaskCr3(void* task,void* cr3);
|
|||||||
void createTaskCr3Param(void* task,void* cr3,uint32_t param1,uint32_t param2);
|
void createTaskCr3Param(void* task,void* cr3,uint32_t param1,uint32_t param2);
|
||||||
char isPrivleged(uint32_t pid);
|
char isPrivleged(uint32_t pid);
|
||||||
void send_msg(uint32_t pid,void* msg,uint32_t size);
|
void send_msg(uint32_t pid,void* msg,uint32_t size);
|
||||||
void* get_msg(uint32_t* sender);
|
void* get_msg(uint32_t* sender,uint32_t* size);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
#include <tasking.h>
|
#include <tasking.h>
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
int sender=&sender;
|
int sender;
|
||||||
char* msg=get_msg(&sender);
|
int size;
|
||||||
send_msg(1,msg,3);
|
char* msg=get_msg(&sender,&size);
|
||||||
|
send_msg(1,msg,size);
|
||||||
yield();
|
yield();
|
||||||
for (;;);
|
for (;;);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user