Ubuntu에서 스마트폰 OS인 Ubuntu Touch를 선보였고 어느 덧 16.10 버전까지 발표되었다.

Ubuntu Touch는 안드로이드 레퍼런스 폰에서 구동이 가능하도록 롬을 지원하는데 지원하는 기기는 다음과 같다.
 

 


초창기 Preview 버전에서는 속도와 안정성에 대한 문제가 엄청 심했지만, 현재는 많이 안정화되어 있는 듯 하다.

다만, 아쉬운 점이 있다면 UI에 한글은 지원하지만, ​한글 키보드는 지원하지 않는다는 점이다.​

따라서, 재미삼아 체험으로 써보기엔 좋을지 모르지만 실용성으로 보자면 0%에 가깝다고 볼 수 있어서, 몇번 쓰다가 무조건 다시 안드로이드로 롤백하게 된다.

 

이번 포스팅은 Nexus 4를 이용하여 Ubuntu Touch 16.10을 설치하는 방법과 사용 후기를 소개한다.

설치 전, 기기에 중요한 데이터가 있다면 백업은 필수이며, 혹시나 설치 실패로 벽돌이 된다면 fastboot flash 명령어로 다시 갈아 엎으면 된다.


기본적으로 Ubuntu Touch를 Nexus 4기기에 설치하기 위해서는 Ubuntu Linux가 필요하다.

VMware Player 같은 프로그램을 이용하여 가상머신에 Ubuntu를 설치하고 USB를 연결하면 하드웨어 셋팅은 끝난다.

VMware Player 기준으로는 아래와 같이 설정하면 해당 가상머신에서 USB를 인식한다.

 

 


설치하기 전, Nexus 4에 디버깅 모드가 설정되어 있어야 하며, bootloader로 Reboot를 해야한다.

USB 디버깅 모드 설정 : 2017/05/02 - [Android] - 안드로이드 USB 디버깅 모드 설정

 

다음으로 apt-get을 이용하여, ubuntu-device-flash를 설치한다.

$ sudo apt-get install ubuntu-device-flash

 

 


ubuntu-device-flash 설치와 기기가 bootloader 모드로 되어 준비가 완료되었다면, Ubuntu Touch 롬을 받고 설치를 진행한다.

$ ubuntu-device-flash touch --channel=ubuntu-touch/stable/ubuntu --bootstrap


 

 

[Ubuntu Touch 16.10이 설치되는 화면]

 

 

[Ubuntu Touch 16.10이 부팅되는 화면]

 

 

[잠금화면과 기본 앱 목록 UI 부분]

 

 

[좌측을 드래그하면 탭바가 나오고 우측을 드래그하면 현재 동작중인 앱들 목록이 나타난다]

 

 

[앱 업데이트 목록과 종료 버튼을 누를 때 나타나는 종료 창]

 

C 언어에서 포인터 변수는 각각의 자료형에 대응하는 포인터 자료형을 선언(char → char *, int → int *)한다. 하지만, 사실상 모든 포인터 변수가 4 Byte 크기의 표현 범위를 가지고 있으므로 일반 변수의 주소 값을 대입하는 것에 대한 문제는 없을 것이다.


포인터 변수 자료형에 대하여 동일한 크기를 가지는 이유에 대해서는 이전 포스팅에서 설명하였다.
(2017/09/16 - [Programming/C] - C 언어 모든 포인터 변수 자료형이 똑같은 크기를 가지는 이유)

 

 

그렇다면 포인터 변수 자료형을 따로 두는 이유는 무엇일까? 이 부분에 대해서 포인터 자료형에 대하여 메모리에 접근하는 방식을 다뤄본다. 각 포인터 변수 자료형에서 메모리를 어떻게 읽어드리는지 확인하기 위해 아래와 같은 예시 코드를 작성하였다.

int 형 정수 변수에 임의의 수인 671,482,627를 입력하고, 해당 변수에 대하여 (char *), (short *), (int *) 자료형에 대하여 어떠한 값이 출력되는지 확인하는 코드이다.

 


 

위의 예시 코드를 컴파일하여 실행한 결과이다.

 


 

이를 메모리상에 도식한 형태는 아래와 같다.

 


 

이를 각각의 포인터 자료형에 맞게 정리하여 표현한다면, 아래와 같은 형태로 각각의 포인터 자료형이 지정된 크기에 맞게 메모리를 읽어드리는 것을 확인할 수 있다.

 


 

출력된 결과를 바탕으로 정리를 해보면 아래 그림과 같은 방식으로 정리가 될 것이다. (char *)의 경우 선언된 메모리 시작 주소에서 1 Byte 크기의 메모리 크기를 읽어드리고 이를 출력한다. 마찬가지로 (short *)의 경우도 선언된 메모리 시작 주소에서 2 Byte 크기씩 메모리를 읽어드려 값을 표현한다.
위의 그림의 메모리 주소를 자세히 보면, 메모리 순서가 역으로 표현되어 있는 것을 확인할 수 있다.

가령 (short *)인 2 Byte의 경우, 데이터 표현이 0xbfe30846~0xbfe30847가 아닌, 0xbfe30847~0xbfe30846​ 역순으로 표현되고 있으며, (int *)인 4 Byte의 경우도 0xbfe30844~0xbfe30847가 아닌, 0xbfe30847~0xbfe30844​의 순서로 값이 표현되었다.

 - 참고) 만약 정방향의 순서로 값을 읽어드려 (int *) 4 Byte를 표현한다면, 0xbfe30844~0xbfe30847 = 50,529,832 값이어야 한다.

 

그 이유로는 현재 사용되는 CPU에서는 지정된 포인터의 크기만큼 메모리를 읽어드릴 때, 이를 역으로 읽어서 데이터를 표현하게 되는데 이를 Little Endian 표기법이라고 하며, 아래 그림은 다음 설명한 내용을 Little Endian 표기법​으로 정리하여 요약한 것이다.

 


 

다음과 같이 포인터 변수마다 각각의 고유 자료형 이름을 가지는 이유는 변수가 시작되는 주소 값에서 얼마만큼의 크기를 읽어드릴지 위한 단위의 지정​하기 위함​임을 알 수 있다.

 

일반적인 자료형(char, int, float, double 등등...)와 다르게 포인터 변수 선언 시, 자료형들은 동일한 크기를 가진다. 이번 포스팅은 포인터 자료형이 동일한 크기를 가지는 이유에 대해 설명한다.


예를 들어, 아래의 코드를 컴파일해보자.

 

 


이 코드를 32 Bit 프로그램으로 컴파일하였을 경우는 아래와 같다.

 


 

다음으로 64 Bit 프로그램으로 컴파일하였을 경우 아래와 같다.

 

 


왜 동일한 크기를 가지는 것일까? 그리고 32/64 Bit에서 포인터 크기가 변한 이유는 무엇일까? 모든 자료형이 그렇듯이 각각의 자료형은 해당 자료 표현을 위해 그 범위 만큼의 크기를 가진다. char 자료형은 1 Byte의 크기를 가진다. 즉, 1 Byte = 8 Bit이므로 표현할 수 있는 범위는 아래 그림과 같을 것이다. 아래 그림에서 char 자료형을 예를 들어 보자.

 

 


총 표현할 수 있는 범위는 0~255까지 256의 경우의 수를 표현하며, 이를 ASCII 코드에 대응하여, 지정된 문자를 출력한다.

다음으로, int 자료형의 경우의 수를 예를 들어보자.

 

 


32 Bit 프로그램 기준으로 int 자료형은 4 Byte의 크기를 가지며, 이는 총 32 Bit으로 4,294,967,296개의 경우의 수를 가진다. 이처럼 자료형이 고유의 크기를 가지는 이유는 그만큼 표현할 수 있는 경우의 수에 해당하는 크기를 의미하며, 따라서 각각의 자료형마다 크기가 다르게 지정되어 있다는 것을 알 수 있다.


다시 돌아가서 포인터 자료형의 경우, char, int, double 자료형과는 다르게 모든 포인터 자료형에 대하여 동일한 크기를 가진다. 포인터 변수는 주소 값을 넣는 자료형이라는 것은 다들 알고 있을 것이다. 즉, 주소 값을 저장하기 위한 자료형이기 때문에 OS Bit에 따른 해당 메모리 주소 값을 모두 포인터 변수로 넣을 수 있는 경우의 수가 필요한 자료형이어야 할 것이다.


32 Bit 프로그램을 예로 들어보자. 32 Bit의 경우 표현하여 사용 가능한 메모리양은 4,294,967,296 경우의 수이므로, OS에서 총 가용할 수 있는 메모리는 4 GB(4,294,967,296 Byte)가 된다. 32 Bit에서 포인터가 4 Byte인 이유는 여기서 분명해진다. 가용할 수 있는 모든 메모리의 경우의 수를 표현하기 위해서는 4 Byte 크기의 자료형이어야 때문이다.

그렇다면 64 Bit의 경우는 어떨까? 총 가용할 수 있는 메모리양은 이론상으론 ​16 EB(18,446,744,073,709,551,616 Byte)​일 것이다. 즉, 산술적으로 따져봤을 때 16 EB까지 지원이 가능한 것이지만, 현재 OS에서는 이 정도까지의 대용량 메모리는 지원하지 않는 것으로 알고 있다.

 

+ Recent posts