diff options
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | kernel/syscalls.c | 54 | ||||
| -rw-r--r-- | userspace/Makefile | 5 | ||||
| -rw-r--r-- | userspace/linker.ld | 28 | ||||
| -rw-r--r-- | userspace/sys/oldlinker.ld | 25 |
5 files changed, 36 insertions, 80 deletions
@@ -1,6 +1,5 @@ - ##################### # # # FoolOS Build Sys. # @@ -175,6 +174,3 @@ stick: $(FOOLOS) clean: $(CLEANDIRS) -rm *.bin $(FOOLOS) $(FOOLOS_VDI) $(KERNEL_ENTRY) $(ASM_OBJECTS) $(OBJECTS) $(IMG_FILLUP) $(BIN_MBR) $(BIN_MP) $(BIN_STAGE2) $(DEPS) bochs.out bochs.log ne2k-tx.log ne2k-txdump.txt - - - diff --git a/kernel/syscalls.c b/kernel/syscalls.c index eb11f1b..1be1053 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -144,11 +144,11 @@ int syscall_execve(char *name, char **argv, char **env) //load binary ext2_check(EXT2_RAM_ADDRESS); - ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000-0x1000,0x100000); + ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000,0x100000); Elf32_Ehdr *elf; - elf=0x800000-0x1000; + elf=0x800000; if(elf->e_ident[0]!=0x7f||elf->e_ident[1]!='E'||elf->e_ident[2]!='L'||elf->e_ident[3]!='F') panic(FOOLOS_MODULE_NAME,"ELF mismatch!?"); @@ -183,24 +183,40 @@ int syscall_execve(char *name, char **argv, char **env) // iterate over section headers for(int phidx=0;phidx<elf->e_phnum;phidx++) { - Elf32_Phdr *phdr=0x800000-0x1000+elf->e_phoff+phidx*elf->e_phentsize; - /* - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"-- PROGRAMM HEADER %d --",phidx+1); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-type: %d",phdr->p_type); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-offset: 0x%08X",phdr->p_offset); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-vaddr: 0x%08X",phdr->p_vaddr); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-filesz: 0x%08X",phdr->p_filesz); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-memsz: 0x%08X",phdr->p_memsz); - */ - - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz); - - // let's zero init bss and set alloc (heap) just right after it! - for(uint32_t *addr=phdr->p_vaddr+phdr->p_filesz; addr<=phdr->p_vaddr+phdr->p_memsz; addr++) + + if(phidx==1) { - *addr=0; + + Elf32_Phdr *phdr=0x800000+elf->e_phoff+phidx*elf->e_phentsize; + + /* + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"-- PROGRAMM HEADER %d --",phidx+1); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-type: %d",phdr->p_type); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-offset: 0x%08X",phdr->p_offset); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-vaddr: 0x%08X",phdr->p_vaddr); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-filesz: 0x%08X",phdr->p_filesz); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-memsz: 0x%08X",phdr->p_memsz); + */ + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"data: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz); + + // let's copy the rw- data block + uint32_t *data=0x800000+phdr->p_offset; + for(uint32_t *addr=phdr->p_vaddr; addr<=phdr->p_vaddr+phdr->p_filesz; addr++) + { + *addr=*data; + data++; + } + + // let's zero init bss and set alloc (heap) just right after it! + for(uint32_t *addr=phdr->p_vaddr+phdr->p_filesz; addr<=phdr->p_vaddr+phdr->p_memsz; addr++) + { + *addr=0; + } + + alloc=phdr->p_vaddr+phdr->p_memsz; } - alloc=phdr->p_vaddr+phdr->p_memsz; } @@ -222,7 +238,7 @@ int syscall_execve(char *name, char **argv, char **env) // autorun "user-space" prog asm("push $10");//argv TODO: addresse asm("push $20"); //argc TODO: real number of params! - asm("push $0x800000"); + asm("push $0x800080"); asm("ret"); while(1); diff --git a/userspace/Makefile b/userspace/Makefile index a0817e3..79c43d6 100644 --- a/userspace/Makefile +++ b/userspace/Makefile @@ -1,6 +1,5 @@ CC=i686-foolos-gcc CFLAGS=-w -LDFLAGS=-T linker.ld PROGS=shell simple brainfuck add @@ -14,8 +13,7 @@ ext2.img: $(PROGS) echo "hello one" > mnt/miguel/test1.txt echo "hello two" > mnt/test2.txt cp $^ mnt -# cp shell.bin mnt - cp ~/temp/fool-os-stuff/binutils-fool-build/binutils/elfedit mnt +# cp ~/temp/fool-os-stuff/binutils-fool-build/binutils/elfedit mnt sync sudo umount mnt rm mnt -rf @@ -29,7 +27,6 @@ shell: shell.o simple: simple.o add: add.o - clean: -rm *.o $(PROGS) ext2.img diff --git a/userspace/linker.ld b/userspace/linker.ld deleted file mode 100644 index 99ae573..0000000 --- a/userspace/linker.ld +++ /dev/null @@ -1,28 +0,0 @@ -/* OUTPUT_FORMAT(binary) */ - -SECTIONS -{ - . = 0x800000; - - /* - - .text : ALIGN(0x1000) { - _TEXT_START_ = .; - *(.text) - _TEXT_END_ = .; - } - - .data : ALIGN(0x1000) { - _DATA_START_ = .; - *(.data) - _DATA_END_ = .; - } - - .bss : ALIGN(0x1000) { - _BSS_START_ = .; - *(.bss) - _BSS_END_ = .; - } - */ - -} diff --git a/userspace/sys/oldlinker.ld b/userspace/sys/oldlinker.ld deleted file mode 100644 index 4eee8eb..0000000 --- a/userspace/sys/oldlinker.ld +++ /dev/null @@ -1,25 +0,0 @@ -OUTPUT_FORMAT(binary) - -SECTIONS -{ - . = 0x800000; - - .text : ALIGN(0x1000) { - _TEXT_START_ = .; - *(.text) - _TEXT_END_ = .; - } - - .data : ALIGN(0x1000) { - _DATA_START_ = .; - *(.data) - _DATA_END_ = .; - } - - .bss : ALIGN(0x1000) { - _BSS_START_ = .; - *(.bss) - _BSS_END_ = .; - } - -} |
