#include #include #include #include #include #include #include #include #include #include #include #include typedef struct { char filename[100]; char mode[8]; char uid[8]; char gid[8]; char size[12]; char mtime[12]; char chksum[8]; char typeflag[1]; } tar_header; uint32_t getsize(const char *in) { uint32_t size=0; uint32_t j; uint32_t count=1; for (j=11;j>0;j--,count*=8) { size+=((in[j-1]-'0')*count); } return size; } uint32_t find_loc(char* name,char* initrd) { uint32_t pos=0; tar_header tar_hdr; for (int i=0;;i++) { char* tar_hdr_ptr=(char*)&tar_hdr; for (size_t i=0;i0) { pos=pheader.offset+datapos; for (size_t i=0;i0) { fseek(initrd,pheader.offset+datapos,SEEK_SET); fread(ptr,sizeof(char),pheader.memsz,initrd); } copy_data(cr3,ptr,pheader.memsz,(void*)pheader.vaddr); } createTaskCr3((void*)header.entry,cr3); } return 1; } int main() { long size=initrd_sz(); char* initrd=malloc(size); initrd_get(initrd); uint32_t datapos=find_loc("vfs",initrd); load_task(datapos,initrd); yield(); // Bochs fails here rescan_vfs(); datapos=find_loc("devfs",initrd); load_task(datapos,initrd); yieldToPID(3); datapos=find_loc("initrd_drv",initrd); load_task(datapos,initrd); yieldToPID(4); mount("","devfs","/dev/"); datapos=find_loc("vga_drv",initrd); serial_print("Making vga task\n"); load_task_devfs(datapos); serial_print("Made vga task\n"); yieldToPID(5); FILE* file; do { file=fopen("/dev/vga","w"); } while(file==NULL); do { file=fopen("/dev/vga","w"); } while(file==NULL); datapos=find_loc("pci",initrd); load_task(datapos,initrd); free(initrd); yieldToPID(4); fputs("FPUTS String\n",file); char str[3]={0,0,0}; fgets(str,2,stdin); char str2[3]={0,0,0}; fgets(str2,2,stdin); printf("Printf %s,%s\n",str,str2); }