[과제] 확장된 유클리드 알고리즘 수행

다소 쉬운 과제라고 생각했으나 %연산으로 나머지를 구하게되면 -2 % 10 의 결과가 -2가 나오는 현상이 발생하기 때문에

[ 나누어지는수 = 몫 * 나누는수 + 나머지 ] 식에서 [몫 * 나누는수] 를 이항하여 나머지를 구하는 함수를 작성하여

해결하였다. 소스코드는 아래와 같다.

// 확장된 유클리드 알고리즘 수행

#include <stdio.h>
#include <math.h>

// 모듈러 함수 -> [나누어지는수 = 몫 x 나누는수 + 나머지] 를 이항을 이용하여
// [나누어지는수 - 몫 x 나누는수 = 나머지] 형태로 하여 나머지를 구한다.
int mod(int a, int b)
{
    if (b > 0)
        return (int) (a - floor((float) a / (float) b) * b);
    else
        return (int) (a - ceil((float) a / (float) b) * b);
}   

// 포인터를 매개변수로 받아 변수값들을 교환한다.
void shift(int *n1, int *n2, int n)
{
    *n1 = *n2;
    *n2 = n;
}

int main(int argc, char *argv[])
{
    int q, a, b, r;            // 몫, 정수1, 정수2, 나머지
    int s, s1 = 1, s2 = 0;    // s, s1, s2
    int t, t1 = 0, t2 = 1;    // t, t1, t2

    printf("확장된 유클리드 알고리즘을 수행합니다.\n\n");
    printf("두 정수를 입력해 주세요 : ");

    scanf("%d %d", &a, &b);
   
    printf("\n");
    printf("\n 몫   정수1 정수2 나머지 s1  s2   s  t1  t2   t\n");

    // 알고리즘 수행구간
    while (b != 0)
    {
        q = floor((float)a / (float)b);
        r = mod(a, b);

        s = s1 - s2 * q;
        t = t1 - t2 * q;

        printf("%3d %5d %5d %5d %5d %3d %3d %3d %3d %3d\n", q, a, b, r, s1, s2, s, t1, t2, t);
       
        // 값 이동 구간
        shift(&a, &b, r);
        shift(&s1, &s2, s);
        shift(&t1, &t2, t);
    }
    printf("%9d %5d %11d %11d\n\n", a, b, s1, t1);

    return 0;
}

by 동네가수 | 2009/04/07 22:24 | 암호수학 | 트랙백 | 덧글(0)

x86 아키텍처 시스템에 안드로이드 포팅하기(Eee 1000h)

 2008년 12월 안드로이드 개발가지의 하나인 "cupcake"가 발표되었다. 다양한 기능이 추가 되었지만 그중 눈길을 끄는 것은 x86 아키텍처 대응 부분인데 아무래도 작년부터 시장에 등장한 Asus사의 eeepc를 선두로한 넷북들의 시장가세로 인한 개발 발표인듯 하다.

 졸업작품으로 안드로이드 플렛폼위에서 돌아가는 gps 수신정보를 이용한 어플리케이션을 계획하고 있던도중 한 일본의 Hatena님의 블로그 글을 참고하여 eee_1000h에 안드로이드를 포팅하였다.


 포팅에 앞서 준비 사항으로는

 (1) 600MB 이상의 USB 메모리스틱

 (2) 인터넷이 연결된 UBUNTU 8.10 32bit 환경
 여기서 usb 메모리가 필요한 이유는 넷북에 포팅을 해야 하는 경우 부트로더를 손봐야 하기때문에 번거롭고 제거할때도 귀찮아 지기때문에 편하고 안전하게 안드로이드를 포팅해보기 위함이다.


1. 안드로이드 포팅에 필요한 패키지 설치

$sudo apt-get -y install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev valgrind g++

2. 프로젝트 관리도구 "repo" 설치

$ cd ~
$ mkdir bin
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo

3. 자바 환경변수 등록

$ export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.10
$ export PATH=$PATH:~/bin

4. 안드로이드 소스 내려받기

$ mkdir cupcake
$ cd cupcake
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake
$ repo sync

5. 저장소 설정 파일 local_manifest.xml 생성 및 저장소 동기화

$ vi ./.repo/local_manifest.xml

다음 내용을 입력하고 저장 한다.

<manifest>
<project name="platform/vendor/asus/eee_701" path="vendor/asus/eee_701"/>
</manifest>

저장소 동기화

$ repo sync


6. PowerManagerService.java의 소스코드 수정

현제 전원 관리 인터페이스가 없다면 입력 이벤트를 받아 들이지 않는 버그가 있어 소스코드를 수정한다.
$ vi frameworks/base/services/java/com/android/server/PowerManagerService.java 


다음을 찾아
// assume nothing is on yet
mUserState = mPowerState = 0;

다음과 같이 수정

// assume nothing is on yet
mUserState = mPowerState = SCREEN_BRIGHT;

7. 빌드 수행

빌드를 수행하기 위한 모든 과정을 마쳤기때문에 빌드한다.

$ TARGET_ARCH=x86 TARGET_PRODUCT=eee_701 DISABLE_DEXPREOPT=true make installer_img

만약 빌드 수행중 다음과 같은 오류를 만나게 되면 아래와 같이 디렉토리를 생성하고 다시 빌드한다.

system: ***** FILE SYSTEM WAS MODIFIED *****
system: 390/1080 files (1.8% non-contiguous), 345322/365332 blocks
Install system fs image: out/target/product/eee_701/system.img
Target userdata fs image: out/target/product/eee_701/userdata.img
du: cannot access `out/target/product/eee_701/data': No such file or directory


$ mkdir out/target/product/eee_701/data
$ TARGET_ARCH=x86 TARGET_PRODUCT=eee_701 DISABLE_DEXPREOPT=true make installer_img


8. 커널설정 후 빌드


 "make i386_defconfig"로 i386 시스템에 관련된 기본설정을 적용한다음 "make menuconfig"명령을 실행하여 통합 설정을 아래와 같이 변경하여 준다.


  현시점 커널소스 에서 "Android pmem allocator"와 "Android alarm driver"의 해당부분 컴파일시 오류가 나므로 두항목을 선택해제 해준다.


$ cd kernel
$ make i386_defconfig
$ make menuconfig


아래와 같이 통합드라이버 설정 적용

General setup --->
[*] Enable the Anonymous Shared Memory Subsystem
Power management options --->
[*] Wake lock
Device Drivers --->
[*] Misc devices --->
[*] Network device support --->
[*] Ethernet (1000 Mbit) --->
[*] Atheros L1E Gigabit Ethernet support (EXPERIMENTAL)
[ ] Android pmem allocator
Graphics support --->
<*> Support for frame buffer devices --->
[*] VESA VGA graphics support
<*> Real Time Clock --->
[ ] Android alarm driver


드라이버 선택을 완료한후 해당 설정을 적용하기 위해 커널을 빌드한다.
$ make
$ cd ..

9. usb 부팅 가능 설정


우선 fdisk를 이용하여 파티션을 생성한다.
$ sudo fdisk /dev/sdb
명령 (m help) : n
명령 동작
e 확장
p 기본 영역 (1-4)
p
지역 번호 (1-4) : 1
첫번째 실린더 (1-1018, default 1) : 1
Last 실린더 + 실린더 or + size (K, M, G) (1-1018, default 1018) :

명령 (m help) : w


다음으로 ext3 파일시스템으로 usb메모리를 포멧해 준다.

$ sudo mkfs.ext3 /dev/sdb1
mke2fs 1.41.3 (12-Oct-2008)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
.......


아래와 같은 명령으로 usb에 루트파일시스템을 구축한다.

SoftKeyboard.apk는 현시점 불안정하기 때문에 제거해준다.

$ sudo mount -t ext3 /dev/sdb1 /mnt/usb
$ sudo cp -fr out/target/product/eee_701/root/* /mnt/usb/
$ sudo cp -fr out/target/product/eee_701/system/* /mnt/usb/system/
$ sudo mkdir /mnt/usb/boot
$ sudo cp kernel/arch/x86/boot/bzImage /mnt/usb/boot/vmlinuz
$ sudo chmod 666 /mnt/usb/system/usr/keychars/*
$ sudo chmod 666 /mnt/usb/system/usr/keylayout/*
$ sudo rm /mnt/usb/system/app/SoftKeyboard.apk


현제 usb부팅 환경에 맞게 초기화 파일을 수정하여 준다.

해당 수정 파일은 첨부파일로 업로드 하였으니 참고 -> init.rc

$ sudo vi /mnt/usb/init.rc


다음 설정은 이더넷 인터페이스 "eth0"을 DHCP를 통하여 자동으로 IP어드레스를 검색하고 이용하기 위한 설정이다.

$ sudo vi /mnt/usb/system/etc/init.usb.sh

아래와 같이 작성하고 저장

#!/system/bin/sh

netcfg eth0 dhcp
setprop net.dns1 4.2.2.2

실행권한을 준다.

$ chmod a+x /mnt/usb/system/etc/init.usb.sh

GRUB 부트로더 설정파일을 만든다.

$ sudo mkdir /mnt/usb/boot/grub
$ sudo vi /mnt/usb/boot/grub/menu.lst

아래와 같이 입력후 저장

default 0
timeout 3
hiddenmenu

title Android
root (hd0,0)
kernel /boot/vmlinuz root=/dev/sdb1 init=/init rw vga=788 rootwait


마지막으로 GRUB 설치한다.

$ sudo grub-install --root-directory=/mnt/usb --no-floppy /dev/sdb
$ sudo umount /mnt/usb


여기서 조금만 응용하면 VirtureBox 같은 가상 운영체제 시스템에 포팅도 가능하다.

by 동네가수 | 2009/04/07 21:01 | 안드로이드 | 트랙백 | 덧글(5)

◀ 이전 페이지          다음 페이지 ▶