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) &
|
||||
@$(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
|
||||
@cd initrd; tar -f ../iso/boot/initrd.tar -c *
|
||||
@grub-mkrescue -o $@ iso
|
||||
|
||||
initrd/init: init/* kernel/start.o
|
||||
init: init/* kernel/start.o
|
||||
@cd init && make
|
||||
@cp init/init initrd/init
|
||||
|
||||
initrd/vfs: vfs/* kernel/start.o
|
||||
vfs: vfs/* kernel/start.o
|
||||
@cd vfs && make
|
||||
@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");
|
||||
createTaskCr3((void*)header.entry,cr3);
|
||||
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");
|
||||
yield();
|
||||
vga_write_string("Yielded and got control, getting message\n");
|
||||
int sender=&sender;
|
||||
char* msg=get_msg(&sender);
|
||||
vga_write_string("Message: ");
|
||||
int sender;
|
||||
int size;
|
||||
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("\n");
|
||||
}
|
||||
|
@ -186,7 +186,7 @@ void isr_handler(registers_t r) {
|
||||
} else if (r.eax==5) {
|
||||
r.ebx=(uint32_t)tasking_get_errno_address();
|
||||
} 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) {
|
||||
tasking_send_msg(r.ebx,(void*)r.ecx,r.edx);
|
||||
} 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->sender_store[task->wr]=currentTask->pid;
|
||||
task->size_store[task->wr]=size;
|
||||
task->wr++;
|
||||
if (task->wr==16) {
|
||||
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) {
|
||||
return NULL;
|
||||
}
|
||||
@ -153,6 +154,7 @@ void* tasking_get_msg(uint32_t* sender) {
|
||||
}
|
||||
}
|
||||
*sender=currentTask->sender_store[currentTask->rd];
|
||||
*size=currentTask->size_store[currentTask->rd];
|
||||
char* data=currentTask->msg_store[currentTask->rd];
|
||||
currentTask->msg_store[currentTask->rd]=NULL;
|
||||
currentTask->sender_store[currentTask->rd]=0;
|
||||
|
@ -14,6 +14,7 @@ typedef struct Task {
|
||||
uint32_t pid;
|
||||
char* msg_store[16];
|
||||
uint32_t sender_store[16];
|
||||
uint32_t size_store[16];
|
||||
uint8_t rd;
|
||||
uint8_t wr;
|
||||
struct Task* next;
|
||||
|
@ -10,5 +10,5 @@ Task* tasking_createTask(void* eip);
|
||||
Task* tasking_createTaskCr3(void* eip,void* cr3);
|
||||
char isPrivleged(uint32_t pid);
|
||||
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
|
||||
|
@ -14,12 +14,12 @@ void createTask(void* task) {
|
||||
"::"b"(task));
|
||||
}
|
||||
|
||||
void* get_msg(uint32_t* sender) {
|
||||
void* get_msg(uint32_t* sender,uint32_t* size) {
|
||||
void* msg;
|
||||
asm volatile(" \
|
||||
mov $6, %%eax; \
|
||||
int $80; \
|
||||
":"=b"(msg):"b"(sender));
|
||||
":"=b"(msg):"b"(sender),"c"(size));
|
||||
return msg;
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,6 @@ void createTaskCr3(void* task,void* cr3);
|
||||
void createTaskCr3Param(void* task,void* cr3,uint32_t param1,uint32_t param2);
|
||||
char isPrivleged(uint32_t pid);
|
||||
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
|
||||
|
@ -1,9 +1,10 @@
|
||||
#include <tasking.h>
|
||||
|
||||
int main() {
|
||||
int sender=&sender;
|
||||
char* msg=get_msg(&sender);
|
||||
send_msg(1,msg,3);
|
||||
int sender;
|
||||
int size;
|
||||
char* msg=get_msg(&sender,&size);
|
||||
send_msg(1,msg,size);
|
||||
yield();
|
||||
for (;;);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user