diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-11-22 15:46:24 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-11-22 15:46:24 +0100 |
| commit | 795b1f7df203ae33e1d0eb13612f0ba2abf4351e (patch) | |
| tree | 42c4d8f94b6e7a9815ea5b3fe52a251d004d4b87 | |
| parent | 4ef54112ec3d3772cb97984a26c85299b8065316 (diff) | |
fix / workaround for my ELF binaries
| -rw-r--r-- | Makefile | 1 | ||||
| -rw-r--r-- | boot2/disk_load_16.asm | 2 | ||||
| -rw-r--r-- | boot2/stage2.asm | 6 | ||||
| -rw-r--r-- | fs/ext2.h | 1 | ||||
| -rw-r--r-- | kernel/kernel.c | 2 | ||||
| -rw-r--r-- | kernel/syscalls.c | 51 | ||||
| -rw-r--r-- | userspace/Makefile | 6 | ||||
| -rw-r--r-- | userspace/linker.ld | 28 |
8 files changed, 79 insertions, 18 deletions
@@ -32,6 +32,7 @@ CC=i686-foolos-gcc ############ compiler flags ############ CFLAGS= +CFLAGS=-w CFLAGS+=-ffreestanding CFLATS+=-Wall CFLAGS+=-Wextra diff --git a/boot2/disk_load_16.asm b/boot2/disk_load_16.asm index 52912f4..f326bec 100644 --- a/boot2/disk_load_16.asm +++ b/boot2/disk_load_16.asm @@ -90,7 +90,7 @@ disk_load_lba: add bx,0x0800 mov ax,[LBA] - add ax,64 ; 64 sectors = 0x2000*4 bytes ;16 sectors this is 0x200*0x10 butes + add ax,64 ; 64 sectors = 0x2000*4 bytes mov [LBA],ax cmp bx,0x9000 diff --git a/boot2/stage2.asm b/boot2/stage2.asm index ad1e4ea..3a469e8 100644 --- a/boot2/stage2.asm +++ b/boot2/stage2.asm @@ -42,6 +42,7 @@ MEMMAP_OFFSET equ 0x7c01 VESA_MODES equ 0x9300 ; do NOT overwrite yourself! be careful! VESA_MODE_INFO equ 0x9400 VESA_MODE_SELECT equ 0x4114 +CHUNKS_TO_LOAD equ 0x0a ;number of 0x8000 * 512 byte chunks to load into ram ; jmp boot_16 ;start boot process @@ -145,7 +146,7 @@ kernel_load: ; init vesa on last iteration! mov ax,[KERNEL_CHUNK] - cmp ax,0x5 + cmp ax,(CHUNKS_TO_LOAD-1) jne skip_vesa_init %ifndef FOOLOS_CONSOLE @@ -177,7 +178,8 @@ boot_32_pm: mov [KERNEL_CHUNK],ax ;check if all chunkgs loaded (hardcoded to 0x6 for a start) - cmp ax,0x6 + ;each chunk is 0x8000 * 15 bytes + cmp ax,CHUNKS_TO_LOAD je finish_load ; show KERNEL CHUNK value @@ -2,3 +2,4 @@ int ext2_check(uint8_t *ram); int ext2_inode_content(char *ram,int inode_nr,uint8_t *ramdest,int max); int ext2_read_dir(uint8_t *ram, int inode_nr,fs_dirent *dirs,int max); + diff --git a/kernel/kernel.c b/kernel/kernel.c index 156ce21..45c8fbb 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -64,7 +64,7 @@ void kernel_main(uint32_t initial_stack, int mp) // // Activate Virtual Memory (paging) // - vmem_init(); + //vmem_init(); // // init output to screen diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 2f4ad30..eb11f1b 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -72,6 +72,8 @@ typedef struct { } Elf32_Phdr; +static uint32_t alloc=0x900000; + int syscall_write(int file, char *buf, int len) { @@ -137,24 +139,22 @@ int syscall_execve(char *name, char **argv, char **env) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X, argvs=0x%08X, env=0x%08X)", name,argv,env); #endif - // lets first clean some area for loading our prog! - // we need this to zero-initalize 1mb bss and 1mb for prog - for(uint32_t *addr=0x800000; addr<=0xb00000; addr++) - { - *addr=0; - } + //TODO: load ELF binary and move this to own compilation unit + //load binary - ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000,0x100000); + ext2_check(EXT2_RAM_ADDRESS); + ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000-0x1000,0x100000); - //TODO: load ELF binary and move this to own compilation unit Elf32_Ehdr *elf; - elf=0x800000; + elf=0x800000-0x1000; 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!?"); + + /* log(FOOLOS_MODULE_NAME, FOOLOS_LOG_INFO, "elf id: class=%d, data=%d, version=%d osabi=%d abiv=%d ", elf->e_ident[4],elf->e_ident[5],elf->e_ident[6], @@ -176,19 +176,36 @@ int syscall_execve(char *name, char **argv, char **env) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf sh-num: %d",elf->e_shnum); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf sh-strndx: %d",elf->e_shstrndx); + */ + + // iterate over section headers for(int phidx=0;phidx<elf->e_phnum;phidx++) { - Elf32_Phdr *phdr=0x800000+elf->e_phoff+phidx*elf->e_phentsize; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"-- PROGRAMM HEADER %d --",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++) + { + *addr=0; + } + alloc=phdr->p_vaddr+phdr->p_memsz; + } + + /* // iterate over section headers for(int shidx=0;shidx<elf->e_shnum;shidx++) @@ -202,13 +219,21 @@ 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("ret"); + while(1); + /* // autorun "user-space" prog asm("push $10");//argv TODO: addresse asm("push $20"); //argc TODO: real number of params! asm("push $0x800000"); asm("ret"); + */ } @@ -273,9 +298,10 @@ int syscall_lseek(int file,int ptr,int dir) uint32_t syscall_sbrk(int incr, int none1, int none2) { - static uint32_t alloc; + // fool-os-convention to set bss_end: + /* if(incr==0) { alloc=0; @@ -290,6 +316,7 @@ uint32_t syscall_sbrk(int incr, int none1, int none2) alloc=incr; return alloc; } + */ uint32_t oldalloc=alloc; alloc+=incr; diff --git a/userspace/Makefile b/userspace/Makefile index 0797db2..a0817e3 100644 --- a/userspace/Makefile +++ b/userspace/Makefile @@ -1,9 +1,11 @@ CC=i686-foolos-gcc +CFLAGS=-w +LDFLAGS=-T linker.ld PROGS=shell simple brainfuck add ext2.img: $(PROGS) - dd if=/dev/zero of=ext2.img bs=512 count=2000 + dd if=/dev/zero of=ext2.img bs=512 count=5000 sudo mkfs.ext2 -O none ext2.img -F mkdir mnt sudo mount ext2.img mnt @@ -11,7 +13,7 @@ ext2.img: $(PROGS) mkdir mnt/miguel echo "hello one" > mnt/miguel/test1.txt echo "hello two" > mnt/test2.txt - cp $< mnt + cp $^ mnt # cp shell.bin mnt cp ~/temp/fool-os-stuff/binutils-fool-build/binutils/elfedit mnt sync diff --git a/userspace/linker.ld b/userspace/linker.ld new file mode 100644 index 0000000..99ae573 --- /dev/null +++ b/userspace/linker.ld @@ -0,0 +1,28 @@ +/* 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_ = .; + } + */ + +} |
