리눅스 커널 컴파일을 해보자 .

테스트사양 ubuntu-14.04.2  메모리 2GB 프로세스2개

 

커널을 받기위해 사이트를 접속한다.

https://www.kernel.org/하트3

 

 

 

커널 소스는 보통 /usr/src 폴더에 보관한다?

받은 소스를 /usr/src폴더에 옮긴후 다운받은 압축파일을 풀어헤친다

 

터미널 창에서 root@li:/usr/src# tar xvf linux-3.19.4.tar.xz 

압축을 풀고 cd linux-3.19.4

 

1. apt-get install ncurses-dev   (필요한 패키지를 설치한다.)

커널 컴파일하기전에 /boot/config-3.16.0-30-generic   커널 설정파일을 .config파일로 옮긴다.

cp config-3.16.0-30-generic /usr/src/linux-3.19.4/.config

2. make menuconfig   (커널 관련 설정파일을 설정하는 부분)

 

 

 

Load (선택) 방금복사한 파일 .config (OK) Save 세이브한다.

통합 커널 컴파일 할수있는 툴을 설치한다.

추가 apt-get update

3. apt-get install kernel-package

4. make-kpkg -j8 --initrd --revision=1.0 kernel_image  

    (revision= 버전)생성될 파일의 버전을 의미한다. -j 옵션 프로세스 *2(멀티컴파일? CPU를 여러개사용하여 컴파일 빠르도록)

    현재시각 16시 29분 ( 프로세스가 4개이므로 *2인 옵션에 8)

 결과사진

 

상위폴더에 cd ../

linux-image-3.19.4_1.0_amd64.deb  파일이 생성 되었는지 확인

 

 

5.   dpkg -i linux-image-3.19.4_1.0_amd64.deb

/boot 및 /lib/modules 에 파일이 추가된다 

 

6.  reboot now

 

7.  uname -a  (커널 버전이 바뀌었는지 확인한다.

 


 

과거 컴파일시

 

 

 

make -j8

아키텍쳐 부트 폴더의 bzImage 를 boot에 vmlinux-XXX로 복사

update-initramfs -c -k 2.6.29

Sudo update-grub

 

 

이상 쉬엇!

 

 


 

 

 

 

'리눅스커널' 카테고리의 다른 글

LCD (1)  (1) 2016.06.23
ARM 리눅스 커널 3.0 포팅(Porting the Linux kernel 3.0 for ARM Architecture)  (0) 2016.06.23
시스템콜  (0) 2015.04.16
systemcall  (0) 2015.04.15
스와퍼(Swapper)프로세스  (0) 2015.04.15

 

  도전!

다행이도 번역된 어셈블리언어 자료를 구할수 있게되었다. 감사합니다. ㅎ 아래에 파일 첨부.

 

기수법중

 최상의 비트를 MSB(Most significant Bit)

 차하위 비트를 LSB(Lesast significant Bit) 라 한다.

 

메모리의 단위 ( 각각 다름)

워드 (word) 

 2 바이트 

더블워드 (double word)

 4 바이트

쿼드워드 (quad word)

 8 바이트

패러그래프(paragraph)

 16 바이트

 

  워드란? 하나의 연산을 통해 저장 장치로부터 프로세서의 레지스터에 옮겨 놓을 수 있는 데이터 단위이다. 프로세서마다 각각 다르다. 한 워드에는 한 개의 컴퓨터 명령어, 저장 주소 처리되어야 할 응용프로그램 데이터를 저장 할 수 있다.

 

 

1.2.3  CPU 80x86계열

     8088, 8086 :

 

 보호모드 및 섹렉터에 대해 설명 5 ~ 9 다치 참고 하도록..

 

 

CPU 마다 각각의 고유한 기계어를 가지고 있고 고유의 어셈블리어를 가지고 있다. 이책에서는 NASM(Netwide Assembler)

 

1.3.3 피연산자

  명령들에 따라 피연사의 형태와 개수가 다르다. 보통 고정된 피연산자수(0-3)를 갖는다. 피연산자의 종류로는

 

 레지스터 : CPU레지스터들에게 직접적으로 접근

 메모리 : 메모리에 저장된 데이터를 가리킨다.

 즉시 피연산자 : 즉시 피연산자(immediate) 는 명령 자체에 있는 고정된 값들이다. 이들은 명령 자체에 저장된다

(즉, 세그먼트가 아닌 코드세그먼트에 저장됨) ?

묵시적 피연산자 : 묵시적 피연산자(implied)는 정확히 나타나지 않는다.  

                         예를들어 증가 명령은 레지스터나 메모리에 1을 더한다. 이때 1을 묵시적 피연산자라고 한다.

 

1.3.4 기초명령

 

 mov 이 명령은 두개의 피연산자를 필요로한다.

 move dest, src    ; src에 있는데이터가 dest로 복사된다. 이때 두 피연산자가 모두 메모리면 안된다. 또한 두 피연산자의 크기가 같아야된다.

 

mov     eax, 3    ; eax 레지스터에 3을 대입한다.(3은 즉시 피연산자 이다)

inc      ecx        ; ecx++

dec     dl          ; dl--

 

 

1.3.5 지시어

  지시어 (directive)는 CPU가 아닌 어셈블러를 위해 만들어 진 것이다.  어셈블러에게 무언가를 알려주는 역할을 한다.

  지시어는 기계 코드로 변환되지 않는다. 주용도

  • 상수를 정의한다.
  • 데이터를 저장할 메모리를 저장한다.
  • 메모리를 세그먼트로 묶는다.
  • 조건적으로 소스코드를 포함시킨다.
  • 다른 파일들을 포함시킨다.

     NASM은 C와 비슷한 전처리 명령들이 있다. 그러나 NASM의 전처리기 시지어는 C어서의 #이 아닌 %를 사용한다.

 

equ 지시어

equ 지시어는 심볼(symbol)을 정의할 때 사용. 심볼은 어셈블리 프로그래밍시 사용되는 상수를 뜻한다.

 

ex) symbol equ value

한번 정의된 심볼의 값은 절대로 재정의 될 수 없다.

 

The % 정의 지시어  C언어듸 #define 지시어 와 동일 

 

 

print_int         EAX 에 저장된 값을 화면에 출력한다.
print_char      AL 에 저장된 아스키 코드 값에 대응 하는 문자를 화면에 표시한다
print_string     EAX 에 저장된 문자열의 주소값 에 해당하는 문자열을 화면 에 출력한다. 문자열은 반드시 C 형식

                          이어야 한다   (i.e. null 로 종료).
print_nl          화면에 개행문자를 출력한다.
read_int         키보드로 부터 정수를 입력받은 다음 EAX 레지스터에 저장
한다.
read_char      키보드로 부터 한 개의 문자를 입력 받은 후 그 문자의 아스키코드값을 EAX 레지스터에 저장한다.
                                         어셈블리 I/O 루틴

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PC 어셈블리언어  지은이 : Paul A.Carter

        번역자 : 이재범

 

pcasm (1).pdf

 

'ASM' 카테고리의 다른 글

어셈블러  (0) 2015.04.14

 

 

시스템 콜은 응용프로그램에서 운영체제에게 어떠한기능(시스템 자원)을 수행해 달라고 하는 하나의 수단이다.

- 저수준 프로그래밍을 몰라도 프로그래밍 가능, 프로그램 호환성이 좋다.

- 사용자 요청을 처리하기전에 인터페이스 수준에서 올바른 요청인지 검사할 수 있으므로 시스템 보완성이 높다.

 

 

 

시스템 콜의 종류 - type 별로 구분

  - 프로세스 제어

  - 파일조작

  - 장치 관리

  - 시스템 정보 및 자원 관리

  - 통신관련

  - 시스템콜의 초기화는 시스템 부팅시 커널 초기화 과정에서 trap_init()함수 내의 set_system_gate(SYSCALL_VECTOR, &system_call)을

     수행해서 0x80 인터럽트를 위한 게이트 디스크립터를 설정

  • SYSCALL_VECTOR : 0x80로 정의된 상수
  • &system_call : 시스템 콜을 위한 핸들러주소

 메모리 주소 영역이 커널 주소영역사용자 주소영역 으로 구분되어있기 때문에, 사용자 프로세스에서 커널 영역에

 접근시 Segmentation Fault 메시지를 출력하면서 프로세스가 종료된다. (커널 스레드나 디바이스드라이버 계층만 접근가능) 

 

arm 은 SWI 명령을 사용하면 내부 인터럽트가 발생한다.

x86에서는 eax에 시스템 콜 번호를 넣고 0x80번 인터럽트를 발생시킨다.

 

ARM의 경우

 -- USER 모드의 태스트에서 SWI 명령을 사용해서 특권모드인 SVC 모드로 진입하고, SWI 핸들러는 SWI 명령의 인자로 넘어오는 시스템 콜 번호를 보고서 어떻게 동작할지 결정한다.

 

 

 

 그림[1] 시스템 콜

 

 

 

[그림2] 시스템 콜 함수 찾아가는 과정

 

음.. fork()함수를 썻을때 glibc라이브러리를 통해 vfork()로 연결되는 부분을 찾고싶은데????????........어떻게하지

일단 라이브러리 소스를 받아보았다.. 졸려...............퓨ㅜ

 

 

 

[그림3] ARM 에서의 시스템콜  호출순서를 보자

   1.  사용자 프로세스에서 fork를 호출

   2.  glibc에 래핑되어 있는 fork함수가 호출되어 vfork함수를 호출한다. swi __NR_vfork 명령으로 시스템 콜을 호출하면  

   3. exception vector table로 들어간다(커널영역)

       (fork()의 시스템 콜 번호가 0x02 므로 여기에 4를 곱해 ,해당 시스템 콜을 처리하는 함수의 주소가

       System Call Vector Table의 어느 위치에 있는지 계산)

   4. sys_fork() 함수로 분기

 

 glibc - GNU C library 의 약자. GNU 시스템과 Linux에서 사용되는 대표적인 C라이브러리

glibc받기

http://www.gnu.org/software/libc/

 

 

 

 

참고

 - 12장 시스템 콜 구현하기(도전 임베디드 OS만들기 [이만우])

 - 휴인스 쟈료   www.huins.com

 - 리눅스 커널기초 http://idkkangjs.blog.me/30091117058

 - ARM 아키텍쳐   http://www.jkelec.co.kr/img/lecture/arm_arch/arm_arch_3.html

 - FALinux Forum [커널산책]

http://forum.falinux.com/zbxe/index.php?document_srl=575411

 

'리눅스커널' 카테고리의 다른 글

ARM 리눅스 커널 3.0 포팅(Porting the Linux kernel 3.0 for ARM Architecture)  (0) 2016.06.23
커널컴파일  (0) 2015.04.17
systemcall  (0) 2015.04.15
스와퍼(Swapper)프로세스  (0) 2015.04.15
schedule()함수  (0) 2015.04.15

+ Recent posts