Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 OS
 osjournal 
 Protected Mode 
 Hardware 
 Kernels
  Dark Fiber
  BOS
  QNX
  OS Dev
  Lecture notes
  MINIX
  OS
  Solaris
  История UNIX
  История FreeBSD
  Сетунь
NEWS
Последние статьи :
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
  SQL 30.07   
  JFS 10.06   
  B-trees 01.06   
 
TOP 20
 Rubni-Corbet -> Глав...1128 
 Go Web ...522 
 Trees...243 
 2.0-> Linux IP Networking...212 
 Rubni-Corbet -> Глав...201 
 TCP 4...201 
 Cluster 3...197 
 Rubni-Corbet -> Глав...191 
 Steve Pate 3...184 
 Ethreal 1...179 
 Stein-MacEachern-> Час...178 
 Ethreal 4...176 
 Rubni-Corbet -> Глав...172 
 Part 3...171 
 Rodriguez 6...170 
 Gary V.Vaughan-> Autotoll...170 
 Стивенс 9...169 
 Bauer-> Appendix C...169 
 TCP 1...168 
 Python...165 
 
  01.10.2017 : 2303965 посещений 

iakovlev.org

Operating System Development (OSD) - boot

Адрес оригинального проекта - OSD

Начнем с простого - с загрузчика . Загрузчик написан под GRUB . На первом этапе не будем даже переключаться в защищенный режим, а лишь загрузим ядро с минимальным набором библиотечных функций.

Дерево проекта :

     ../include
     ../lib
     	kstart.s
 	main.c
 	video.c

В каталоге /include лежат хидеры библиотечных функций. В каталоге /lib лежат сами функции. В проекте 2 makefile - один в главном каталоге , второй - в подкаталоге lib. Главный makefile :


 LDSCRIPT=krnl.ld
 AS	=as 
 CC	=gcc -g -Wall -W -O2 -nostdinc -fno-builtin
 LD	=ld -g -T $(LDSCRIPT) -nostdlib
 LIBC	=lib/libc.a
 OBJS	=kstart.o main.o video.o 
 
 all: kernel.img
 
 .s.o:
 	$(AS) -o$@ $<
 
 .c.o:
 	$(CC) -c -o$@ $<
 
 kstart.o:	kstart.s	$(MAKEDEP)
 main.o:		main.c		$(MAKEDEP)
 video.o:	video.c		$(MAKEDEP)
 
 $(LIBC):
 	make -C lib $(MAKEFILE)
 
 kernel.img: $(OBJS) $(LDSCRIPT)	$(LIBC) $(MAKEDEP)
 	$(LD) -o$@ $(OBJS) $(LIBC)
 	objdump --source $@ >krnl.lst
 	nm $@ | sort >krnl.sym
 	strip $@
 
 clean:
 	rm *.o *.img *.sym *.lst
 	rm lib/*.o lib/*.a
 
При создании образа kernel.img очень полезная команда objdump --source $@ >krnl.lst дизассемблирует его.

Главный makefile использует библиотеку libc.a , которая генерится с помощью второго makefile :


 CC	=gcc -g -Wall -W -O2 -nostdinc -fno-builtin 
 STDIO	=doprintf.o
 STRING	=memsetw.o memcpy.o strlen.o
 X86	=inportb.o outportb.o 
 OBJS	=$(STDIO) $(STRING) $(X86) 
 
 all: libc.a
 
 clean:
 	rm -f libc.a $(OBJS)
 
 .c.o:
 	$(CC) -c -o$@ $<
 
 doprintf.o:	doprintf.c	
 memsetw.o:	memsetw.c	
 memcpy.o:	memcpy.c	
 strlen.o:	strlen.c	
 inportb.o:	inportb.c	
 outportb.o:	outportb.c	
 libc.a:	$(OBJS) $(MAKEDEP)
 	ar rcs libc.a $(OBJS)
 
При загрузке на экран будут выведены несколько тестовых сообщений :

 int main(void)
 {
 	int score = 4, years;
 
 	init_video();
 	kprintf("Hello from www.iakovlev.org !\n");
 	years = -7;
 	kprintf("%u score and %i years ago...\n", score, -years);
 	kprintf("-1L == 0x%lX == octal %lo\n", -1L, -1L);
 	kprintf("<%-08s> and <%08s> justified strings\n", "left", "right");
 	kprintf("Goodbye. Use reset button to end\n");
 /* return to KSTART.ASM, which will freeze */
 	return 0;
 }
 
Архив исходников лежит тут

Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье