1. 압축 해제 및 폴더 접근
wget을 통해 필요한 압축파일은 받은 상태라 가정 후 시작한다.
tar xfvz 01_startup.tar.gz
를 통해 압축 해제 후, 폴더에 접근한다. 근데 왠걸... "-bash: cd: 01_startup: 허가 거부" 라고 뜨지 않는가?
cy@???:~/os_project$ ls -al
합계 80
drwxrwxr-x 6 cy cy 4096 5월 10 02:31 .
drwxr-xr-x 48 cy cy 4096 5월 10 02:30 ..
drw-r--r-- 6 cy cy 4096 4월 28 10:08 01_startup
ls -al 을 보면, read권한이 없어 문제 없는듯 보이지만, root가 아닌 계정에서 폴더 접근을 위해서는 x 플래그가 켜져 있어야 한다. 아마, centos 와 달리 ubuntu에서는 root를 사용하기 보단 일반 계정에서 sudo 를 통해 작업을 하는 경우가 많기 때문일듯 하다.
sudo chmod +x 01_startup -R
이젠 01_startup 폴더에 접근 가능하다.
우선 필요한 프로그램 들을 설치하도록 하자.
sudo apt-get install qemu-system-arm
sudo apt-get install bison
아래 과정 중 기타 프로그램 설치가 필요할 경우 설치하도록 한다.
cy@???:~/os_project/01_startup$ make config-smdkc210
make: arm-none-linux-gnueabi-gcc: 명령을 찾지 못했음cp -f configs/Config-smdkc210.mk Config.mk
ubuntu의 경우 apt-get 으로 설치 가능한 툴체인 중 가장 유사한 것은 gcc-arm-none-eabi 이다. 해당 툴체인을 설치하여 사용하도록 한다.
sudo apt-get install gcc-arm-none-eabi
수정할 부분을 찾기 위해 grep 명령어를 사용하도록 한다.
cy@???:~/os_project/01_startup$ grep "gnueab" ./* -nri
./Config.mk:6:CROSS_PREFIX := arm-none-linux-gnueabi-
./Makefile:41: #arm-none-linux-gnueabi-gdb -x .gdbinit
./configs/Config-smdkc210.mk:6:CROSS_PREFIX := arm-none-linux-gnueabi-
./configs/Config-rpi2.mk:6:CROSS_PREFIX := arm-none-linux-gnueabi-
./configs/Config-rpi1.mk:6:CROSS_PREFIX := arm-none-linux-gnueabi-
찾아진 부분들을 모두, arm-none-linux-gnueabi- 에서 arm-none-eabi- 로 바꾸도록 한다.
(이는 gcc-arm-linux-gnueabi 을 설치 후, arm-none-linux-gnueabi- 에서 arm-linux-gnueabi- 로 바꾸어도 상관 없다.)
이제 make 를 하면 컴파일이 완료 됨을 확인 가능하다.(sudo make 로 할 필요가 있다. )
여기까지 하고, 끝낼 수 있으면 좋겠지만...
나는 SSH 환경에서 작업을 하고 싶다. 그래서 Makefile 을 좀 더 자세히 보기로 하였다.
35 run: all
36 gnome-terminal --hide-menubar -e "qemu-system-arm -M smdkc210 -display none -serial stdio -kernel $(TARGET)" &
Makefile 을 통해 어짜피 gnome-terminal 을 통해 qemu 결과를 봄을 확인하였다. 즉, display가 필요없다는 뜻 이다.
따라서 run 을 아래와 같이 수정하도록 한다.
35 run: all
36 qemu-system-arm -M smdkc210 -nographic -kernel $(TARGET)
gnome-terminal 로 새로운 터미널로 열지 않으려고 하기 때문에 gnome-terminal 을 지웠다.
-serial stdio 를 사용할 경우, stdio 가 qemu의 serial 과 연결되어, 이후 사용에 문제가 생기므로 지웠다.
-display none 대신 -nographic 을 사용하였다.
(serial 이 nographic 을 사용 시 정상적으로 입력/출력 된다고 믿고있다. 이후 serial 사용 코드 사용 시 재확인 필요하다.)
아래와 같이 정상적으로 실행 됨을 확인 가능하다.
cy@???:~/os_project/01_startup_ubuntu$ sudo make run
make[1]: Entering directory `/home/cy/os_project/01_startup_ubuntu/kernel'
make[2]: Entering directory `/home/cy/os_project/01_startup_ubuntu/kernel/mach-s5pc210'
arm-none-eabi-ld -nostdlib -nostartfiles -nodefaultlibs -static -X -r startup.o interrup.o uart.o -o built-in.o
make[2]: Leaving directory `/home/cy/os_project/01_startup_ubuntu/kernel/mach-s5pc210'
arm-none-eabi-ld -nostdlib -nostartfiles -nodefaultlibs -static -X -r mach-s5pc210/built-in.o event.o interrupt.o lib.o main.o mutex.o scheduler.o task.o test.o timer.o -o built-in.o
make[1]: Leaving directory `/home/cy/os_project/01_startup_ubuntu/kernel'
arm-none-eabi-ld -nostdlib -nostartfiles -nodefaultlibs -static -X -T /home/cy/os_project/01_startup_ubuntu/kernel/mach-s5pc210/kernel.lds -N kernel/built-in.o /usr/lib/gcc/arm-none-eabi/4.8/libgcc.a -o baekos.elf
arm-none-eabi-nm baekos.elf | grep -v '\(compiled\)\|\(\.o$\)\|\( [aUw] \)\|\(\.\.ng$\)\|\(LASH[RL]DI\)' | sort > Symbols.map
arm-none-eabi-objcopy -O binary -R .note -R .comment -S baekos.elf baekos.img
/bin/cp -f baekos.img /tftpbootCompile Result
===========================================================
text data bss dec hex filename
5188 4 39664 44856 af38 baekos.elf
===========================================================qemu-system-arm -M smdkc210 -nographic -kernel baekos.img
smdkc210 board supports only 2 CPU cores. Ignoring smp_cpus value.Starting Baek's Education RTOS Kernel..............
(종료를 위해서는 ctrl +a +x 를 입력하면 된다.)
현재 하는 삽질
- raspi2 QEMU 를 발견하였다. 하지만, 커널 로드를 실패하는건지, uart출력의 문젠지(GPIO 가 없으므로...) 화면이 나오지 않아 확인중이다. baekos 가 아닌 raspi2 용 리눅스는 실행됨을 확인하였다.
참고 : http://blog.3mdeb.com/2015/12/30/emulate-rapberry-pi-2-in-qemu/
댓글 3
.
raspi2를 QEMU에서 사용하려면 초기화를 다 해줘야합니다.
우리는 bootcode.bin, start.elf에서 초기화한 내용을 사용하기 때문에 이 부분을 건너 뛴건데,
브로드컴에서 공개하지 않아서...
적어도 DRAM 초기화는 해줘야 부팅이 가능합니다.
시간 있으시면 해보시고, 저한테 코드도 좀 보내주십시요.