BLOG ARTICLE Operating Systems | 11 ARTICLE FOUND

  1. 2010.09.02 OS 만들기 -2- (MBR) 2
  2. 2010.09.02 OS 만들기 -1- (bochs) 1
  3. 2010.09.02 VMware에 Live Android OS 실행하기
  4. 2010.08.30 JNI 헤더파일 - jni.h
  5. 2010.08.26 NDK를 이용한 안드로이드 App 기본예제 7

OS 만들기 -2- (MBR)

Operating Systems/OS 만들기 프로젝트 2010. 9. 2. 23:22 Posted by 알 수 없는 사용자


간단한 OS를 만들기 전에 중요한 작업중 하나인 MBR Code를 만드는 일이다.
 

시작하기 전에 Python, Nasm, Bochs 모두 환경변수에 경로를 지정해준다.



boot.asm 이라는 파일을 만들고 위와 같은 어셈블리어를 작성하였다.

Prompt> nasm -fbin -o boot.bin boot.asm


asm 파일을 bin이라는 바이너리 파일로 컴파일을 하였다.


전에 만들어두었던 Image파일과 같은 폴더에서 작업을 한다.

 

 

위 그림처럼 mbr.py를 만든다. 이 파일은 Image 파일안에 MBR Code를 넣고 있는 작업이다.

 

Prompt> python mbr.py

를 입력하면 "success!" 문자가 뜨는 것을 확인 할 수 있다.

 

Prompt> bochs -q

를 입력하여 실행을 해 보자.

 

 

위 그림처럼 성공적으로 MBR Code가 실행된 것을 확인 할 수 있다.

 

batch file을 만들어서 이용하면 쉽게 실행을 할 수 있다.

Prompt> copy con name.bat

마칠때는 ^Z

 

P.S : 프롬프트에서 bochs, nasm, python을 바로 입력하여 성공한 것은 환경변수에 등록을 해 놓았기 떄문에 바로 명령어를 이용할 수 있다.

'Operating Systems > OS 만들기 프로젝트' 카테고리의 다른 글

OS 만들기 -6- (IDT)  (0) 2010.09.14
OS 만들기 -5- (GDT)  (0) 2010.09.08
OS 만들기 -4- (Protected Mode)  (3) 2010.09.08
OS 만들기 -3- (Kernel)  (0) 2010.09.08
OS 만들기 -1- (bochs)  (1) 2010.09.02
AND

OS 만들기 -1- (bochs)

Operating Systems/OS 만들기 프로젝트 2010. 9. 2. 21:57 Posted by 알 수 없는 사용자

OS를 만들기 위해 준비를 해야 할 것이 있다.


먼저 어셈블 코드를 바이너리 코드로 만들기 위해 nasm이 필요하다.


http://www.nasm.us/


python을 이용하기 때문에 python도 받아두자.


그리고 MBR Code를 만들고 매번 부팅을 하는 수고를 덜기 위해 가상공간이 필요한데 이 부분은
bochs로 해결하였다.
 


bochs를 이용하기 위해 우선 bochs를 설치하고 cmd로 dos모드에서 bximage.exe를 실행한다.

 

첫번째는 HD(Hard)와 FD(Floppy) 선택 부분인데 기본은 HD이기 때문에 그냥 엔터를 입력한다.

세번째는 Image의 Size인데 기본은 10M이지만 현재 256M으로 잡았다.

네번째는 Image의 Name인데 "boot.img"를 입력하였다.

현재 클립보드에 ata0-master에 대한 정보가 입력되어 있기 때문에 다른 어딘곳에 복사를 해 둔다.

 

 

위 그림과 같이 boot.img 라는 Image파일이 생성되었다.

바로 그 위에 보이는 bochsrc-sample.txt가 있는데 이 파일은 bochs를 실행할떄 환경을 설정줄 수 있는 파일이다.

 

 

위 그림은 주석부분을 다 지우고 설정 부분만 따로 모아 놓은 것이다.

위에 보이는 ata0-master부분을 지우고 전에 저장해 놓았던 부분으로 바꾼 후 bochsrc로 파일을 저장해 둔다.

 

그리고 BXSHARE부분을 설정해 주어야 한다.

prompt> set $BXSHARE="bochs 설치 경로"

를 입력해준다. 이 부분은 ROM 파일이 이 설치된 폴더에 있기에 그 쪽으로 지정해 주는 것이다.

설정을 다 했으면 실행을 해보자.

Prompt> bochs -q

옵션으로 q를 주는 것은 빠른 실행을 위해서이며 자동으로 폴더에 있는 bochsrc를 찾아서 설정을 해 준다.

 

 

위 그림처럼 "No bootable device"가 뜰것이다. 이 것은 현재 POST(power-on self-test 퓨터에 전원이 공급되었을 때, 컴퓨터 키보드, , 디스크 드라이브 그리고 기타 하드웨어 등이 바르게 동작하는지를 확인하기 위해, 컴퓨터 BIOS가 동작시키는 일련의 진단 시험 과정이다)과정을 거치고MBR Code(Master Boot Record. 부팅시 BIOS에 의해 처음으로 읽어들여지는 디스크의 정보)를  실행 해야 하는데 어떠한 MBR Code가 없기 때문에 위와 같은 메시지를 출력하게 된다.

 

만약 Image 파일이 필요하다거나 궁금한점이 있으면 댓글을 달아주세요.
"만들면서 배우는 OS 커널의 구조와 원리"를 참조하고 있습니다.

'Operating Systems > OS 만들기 프로젝트' 카테고리의 다른 글

OS 만들기 -6- (IDT)  (0) 2010.09.14
OS 만들기 -5- (GDT)  (0) 2010.09.08
OS 만들기 -4- (Protected Mode)  (3) 2010.09.08
OS 만들기 -3- (Kernel)  (0) 2010.09.08
OS 만들기 -2- (MBR)  (2) 2010.09.02
AND

VMware에 Live Android OS 실행하기

Operating Systems/Android 2010. 9. 2. 16:13 Posted by 알 수 없는 사용자

먼저, 안드로이드 OS를 x86 플랫폼 위에서 실행하기 위해 아래의 사이트에서 안드로이드 OS 이미지 파일을 다운로드 합니다.




위 사이트에서 두 개로 나누어진 파일을 모두 다운로드합니다. 다운로드가 끝나면 cmd를 실행시킨 후, 아래의 명령어를 입력해서 하나의 이미지 파일로 합쳐줍니다.

COPY /B liveandroidv0.3.iso.001 + liveandroidv0.3.iso.002 liveandroidv0.3.iso




그럼, 이제부터 만들어진 이미지 파일을 이용해 VMware에서 설치를 하면 되겠습니다.






이미지 파일을 저 처럼 먼저 넣어줘도 되고, 나중에 넣어줘도 됩니다.




이 후의 설정은 권장사항으로 된 기본 설정을 그대로 유지한 상태로 넘어갑니다. 개인적으로 수정해도 상관없습니다. 저는 플로피디스크와 usb장치를 제거해주었습니다.

이제 VMware에서 Power On을 클릭해 실행하면 다음과 같은 모습으로 시작하게 됩니다.










안드로이드 OS 부팅 완료되었습니다. ^^
(참고로 뒤로 가기는 ESC 키를 이용하면 됩니다.)


'Operating Systems > Android' 카테고리의 다른 글

JNI 헤더파일 - jni.h  (0) 2010.08.30
NDK를 이용한 안드로이드 App 기본예제  (7) 2010.08.26
NDK 및 JNI 기본 개념  (7) 2010.08.26
AND

JNI 헤더파일 - jni.h

Operating Systems/Android 2010. 8. 30. 21:26 Posted by 알 수 없는 사용자

NDK환경을 구축하고, JAVA의 JNI 기술을 이용하여 안드로이드 앱을 개발하는데 C 혹은 C++을 사용할 수 있다고 하였습니다. 이 전에 포스팅한 글 중에 예제 실습을 한 번 한적이 있었습니다.
(NDK 프로그래밍 예제 : http://viiiin.tistory.com/category/Android%20Dev)
여기에 나온 my_lib.c 코드에서 사용 된 헤더파일이 궁금해서 좀 살펴보았습니다.

my_lib.c에서 사용 된 헤더파일은 ssu_os_android_NativeCall.h 입니다. 이 파일은 또 내부에서 jni.h 파일을 사용하고 있습니다.

jni.h 파일의 내용은 다음과 같습니다.

보시는 것과 같이 3개의 헤더파일을 포함하고 있습니다.

#include <stdio.h>
#include <stdarg.h>
#include "jni_md.h"

첫 번째로 stdio.h 파일은 다들 아시다시피 C의 표준 입출력 관련 함수들을 제공합니다.
두 번째로 stdarg.h 파일은 가변 인자 리스트를 처리하는데 사용됩니다. 주로 execl()함수나 printf()함수에서 사용됩니다.
마지막으로 jni_md.h 파일에는 몇 가지 호출 규약과 변수 타입이 재정의 되어 있습니다.

jni_md.h 파일의 내용은 다음과 같습니다.

JNIEXPORT와 JNIIMPORT는 각각 __declspec(dllexport)와 __declspec(dllimport)로 정의되어 있습니다. 이것으로 C++에서 DLL의 데이터 및 함수, 클래스 또는 클래스 멤버 함수를 이용할 수 있습니다. JNICALL은 윈도우즈 API 함수들의 기본 호출 규약인 __stdcall로 정의되어 있습니다. 그 외에 long은 jint로, __int64는 jlong과 같이 변수 타입도 재정의 되어 있습니다.

'Operating Systems > Android' 카테고리의 다른 글

VMware에 Live Android OS 실행하기  (0) 2010.09.02
NDK를 이용한 안드로이드 App 기본예제  (7) 2010.08.26
NDK 및 JNI 기본 개념  (7) 2010.08.26
AND

NDK를 이용한 안드로이드 App 기본예제

Operating Systems/Android 2010. 8. 26. 12:25 Posted by 알 수 없는 사용자

1. 개발환경

Host OS
  - Windows 7 Ultimate x86

Cygwin
  - version 2.712
  - http://www.cygwin.com

Eclipse
  - Eclipse IDE for Java Developers : Galileo Packages(ver 3.5)
  - http://www.eclipse.org/downloads

JDK
  - Java SE Development Kit 6u21
  - http://www.oracle.com/technetwork/java/javase/downloads/index.html

Android SDK & NDK
  - Android SDK Package : android-sdk_r06-windows.zip
  - Android NDK Package : android-ndk_r4b-windows.zip
  - Android SDK and AVD Manager(Packages and Archives) :
    http://dl-ssl.google.com/android/eclipse
    http://developer.android.com/sdk/index.html


2. Cygwin 설치 및 환경설정

Cygwin을 사용하는 이유는 기본적으로 Android 개발 환경이 Linux 기반으로 되어 있기 때문이고, ndk-build 명령으로 빌드하기 위함입니다. 개인적으로 MinGW를 사용하시는 분은 MinGW에서 하셔도 좋습니다.

Cygwin 설치 시에 Select Packages 단계에서 'make' 체크 후 설치해 줍니다.


저는 이미 설치되어 있기 때문에 'Keep'이라고 나오는 것입니다. 'Skip'부분을 클릭하면 'Install'로 바꿀 수 있습니다. 같은 방법으로 Search 기능을 이용하여 'vim'을 검색 후, Editors 카테고리의 vim을 'Install'로 바꾼 후 설치해 줍니다. 혹시 나중에 추가로 필요한 패키지가 생길 경우 다운받은 Cygwin 폴더의 setup.exe를 실행시켜 패키지를 추가할 수 있습니다.

다음으로 Cygwin을 실행하여 ndk-build 명령을 어디서든 실행할 수 있게 하기 위해 .bash_profile 파일의 PATH 환경변수에 경로를 추가시켜 줍니다.


/cygdrive 는 윈도우의 '내 컴퓨터'와 같은 경로입니다. 저의 경우에는 다운받은 NDK 폴더가 아래의 경로에 있기 때문에 그림과 같이 PATH설정을 해 준 것입니다. 본인의 경로에 맞게 수정해주면 됩니다.

D:\UTIL\etc\Android_NDK_r4b\android-ndk-r4b


그럼 이제 cygwin은 모두 준비가 끝난 상태입니다.


3. Eclipse Android Project 생성

이제 Eclipse를 이용하여 안드로이드 프로젝트를 만들어 보도록 하겠습니다.

먼저, [File]->[New]->[Project]를 선택하면 다음과 같은 창이 나옵니다.



Android Project를 선택한 후, Next를 클릭합니다.

아래 그림과 같이 빈 곳을 채워준 다음 Finish를 클릭합니다. 이 때, 저는 "Use default location"을 체크 해제 한 후, cygwin의 홈디렉토리에 프로젝트 폴더를 만든 후 이곳의 경로를 지정해 주었습니다.




다음 그림과 같이 프로그래밍할 준비를 마쳤습니다.





4. 예제 프로그래밍

그럼 이제 본격적으로 안드로이드 App 예제를 실행하기 위한 프로그래밍을 해 보도록 하겠습니다.

① Activity Layout 구성
위치 : [HelloAndroid]-[res]-[layout]-[main.xml]
텍스트뷰와 버튼을 각각 하나씩 추가합니다.



② Activity 구현
위치 : [HelloAndroid]-[src]-[ssu.os.android]-[NdkTestActivity.java]
버튼 클릭으로 jni를 호출하는 소스를 onCreate에 구현하였습니다.
혹시 에러가 나거든 [Ctrl+Shift+O]를 이용해 자동으로 import를 수행해 줍니다.


③ Class 만들기
위치 : [HelloAndroid]-[src]-[ssu.os.android]-[NativeCall.java]
위의 위치에 NativeCall.java 파일을 새로 생성합니다.
native 함수가 들어있는 NativeCall 클래스를 생성합니다. native 키워드는 javah가 헤더파일을 생성할 때 참조하게 되는 키워드 입니다. 구현부는 없습니다. static 부분은 class의 객체가 생성될 때 (new) 되어질 때 호출됩니다. "my_lib"는 ndk-build로 생성된 라이브러리 이름입니다. 파일명은 libmy_lib.so 입니다.


④ javah 실행
~/bin 디렉토리에서 javah를 실행합니다. javah는 내부적으로 ./ssu/os/android/NativeCall.class 파일을 참고하여 헤더파일을 생성하게 됩니다. 헤더 파일명은 패키지명과 클래스명을 참고해서 생성됩니다. -o 옵션을 사용하면 파일명을 임의로 지정할 수 있습니다. 프로젝트 폴더에 /jni 폴더를 생성하고, 만들어진 헤더파일을 옮겨줍니다.


- 생성 된 헤더파일(ssu_os_android_NativeCall.h) 내용
native 키워드로 되어있던 함수들이 jni 형태 함수 프로토타입을 확인할 수 있습니다.
복잡해 보이지만 C문법입니다.


⑤ 함수 구현
위치 : [HelloAndroid]-[jni]-[my_lib.c]
/jni 폴더에 my_lib.c 파일을 만들어서 다음과 같이 함수를 구현합니다. 두 개의 함수가 있는데 단순히 string을 리턴해 주는 함수와 두 정수를 입력받아 더한 후 리턴하는 함수입니다.


⑥ Android.mk 파일 작성
위치 : [HelloAndroid]-[jni]-[Android.mk]
다운받은 Android NDK 폴더의 /sample/hello-jni/jni 의 Android.mk 파일을 현재 프로젝트의 /jni 폴더에 복사한 후, 다음과 같이 수정하여 사용합니다. 수정 된 내용은 19, 20 라인의 LOCAL_MODULE 과 LOCAL_SRC_FILES 입니다.


⑦ NDK Build
프로젝트 루트 혹은 /jni 디렉토리에서 "ndk-build" 명령을 실행합니다.


빌드가 끝나면 프로젝트 폴더 밑에 /libs 폴더가 생성되고, 라이브러리인 .so 파일이 생성 된 것을 확인할 수 있습니다.




⑧ 에뮬레이터 실행
위의 과정이 정상적으로 진행되었으면 Eclipse에서 에뮬레이터를 실행시켜 줍니다. 안드로이드 부팅 과정이 끝나면 우리가 작성한 App을 볼 수 있을 것입니다.


Call JNI" 버튼을 누르게 되면 jni가 호출되어 스트링을 가져와 화면(TextView)에 뿌려주게 됩니다.



<참고 사이트>
[1] http://shchoi82.springnote.com/pages/6150375



'Operating Systems > Android' 카테고리의 다른 글

VMware에 Live Android OS 실행하기  (0) 2010.09.02
JNI 헤더파일 - jni.h  (0) 2010.08.30
NDK 및 JNI 기본 개념  (7) 2010.08.26
AND