Busan IT/로봇제어2015. 10. 15. 09:15

==================================Outline====================================

라즈베리파이 커널 업데이트 내용 확인

----------------------------------------------------------------------------

 

'uname -r‘을 입력하여 현재의 버전 정보를 보자. 커널이 업그레이드 된 것을 알 수 있다.

 

3.18.7-7+ --> 4.1.10-v7+

 

커널을 업데이트한 이유는 커널 프로그램을 작성하기 위해서이다.

 

커널 프로그램은 운영체제에 속한 최상위 프로그램이기 때문에 오류가나면 전원을 뽑는 것 이외에는 방법이 없다.

 

레지스터는 CPU에 따라 모양이 바뀐다.

 

//porting작업은 기존의 같은 내용을 복사해 사용하고 수정된 내용만 덮어씌운다.

 

/usr/src/linux/arch에 들어가면 CPU의 소스들이 저장되어 있다.

 

intel : ia64, x86

 

arm 디렉토리에 들어오면 mach-'제조사로 된 디렉토리들을 볼 수 있다.

 

mach-bcm2709폴더 들어가서 파일들을 살펴보자. ARM CPU를 컴파일하게 되면 해당 폴더에 있는 파일들이 동작하게 된다.

 

make프로그램은 컴파일 시 변동된 부분만 컴파일하도록 해주는 프로그램이다.

 

menuconfig 창을 띄워보자.

 

'apt-get install ncurses-dev'

 

'make menuconfig'

 



 

config파일은 해당 설정을 저장해놓은 파일들이다.

 

joinc에서 Linux 커널에서의 디바이스 드라이버 작성

 

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Embedded/Documents/WritingDeviceDriversInLinux

 

linux에서 커널을 프로그램을 만드는 방법은 두 가지이다.

1. 직접 커널을 건드려 만든다.

2. 모듈을 사용하여 만든다.

 

이 모듈을 device driver라고 하고 linux에 사용되는 모듈을 lkm(Linux Kernel Module)이라고 한다.

 

CPU내에는 메모리를 관리해주는 MMU(Memory Management Unit)가 필요하다.

 

커널에서 프로그램을 작성하면 실제 메모리를 사용하게 된다. 이 실제 메모리를 kernel메모리라고 한다.

 

사용자가 장치에 내리는 모든 명령어는 커널을 통해 수행된다.

 

//키보드 보안 프로그램은 키보드 후킹을 감시하는 역할을 한다.

 

... 그래서 디바이스 드라이버를 배울 필요가 있다.

 

 

kernel에 모듈을 올리는 함수는 'insmod', 모듈을 삭제하는 함수는 ‘rmmod'이다.

 

 

반응형
Posted by newind2000
Busan IT/Assembly2015. 10. 15. 09:13

.386

.MODEL FLAT

PUBLIC _stst
PUBLIC _ldst    ; '_stst''_ldst'함수 외부 접근 허용 코드

.code

_start:  

_stst   PROC   NEAR32  ;store status

    ; - entry code -
    push  ebp    
    mov   ebp, esp

    pushfd
    mov esp, [ebp+8]  ;esp obj로 이동
    add esp, 40    ;esp obj 가장 아래로 이동

    pushad      ;eip와 efl을 제외한 모든 레지스터 구조체에 삽입
    push [ebp+4] ; eip삽입
    push [ebp-4] ; eflags삽입
    add esp, 20  ; 구조체의 esp자리로 내려온다.

    mov eax, ebp ; main의 esp를 구조체의 넣기 위해 레지스터 eax를 사용한다.
    add eax, 8   ; eax를 main의 esp가 있는 자리로 옮겨준다.
     ;12가 아닌 8인 이유는 esp는 마지막 변수를 가리키고 있기 때문이다.
    mov [esp], eax ; 구조체 esp에 main의 esp를 넣어준다.
    push [ebp]     ; 구조체 ebp자리에 main의 ebp를 넣어준다.

    
    ;mov eax, [esp+20] eax에는 return값이 들어감으로 복구시킬 필요가 없다.


    ; - exit code -
    mov  esp, ebp
    pop  ebp
    ret ;pop eip
    
    ;메인 함수에서의 복구
    ;add esp, 4 ;함수의 인자 자리를(&obj) 복구 시키기 위해 esp 사용한 인자의 크기만큼 옮긴다.

  
  _stst ENDP

  _ldst   PROC   NEAR32  ;
      
    ;mov esp, [esp+4]  ;esp를 구조체로 이동
    ;popfd    ;구조체 efl값을 레지스터 efl로 이동
    ;pop eax    ;eax값에 구조체 eip값을 이동
    ;mov ebx, esp  ;현재 esp값(구조체에 edi를 가리킨다)을 백업
    ;mov esp, [esp+12]  ;구조체 esp값을 esp에 저장한다.
    ;push eax    ;구조체eip값을 구조체 esp에 저장
    ;mov esp, ebx  ;esp를 구조체에 edi를 가리키는 값으로 이동시킨다.
    ;popad    ;스택에 있는 내용을 레지스터에 채운다.
    ;mov esp, [esp-20]  ;esp를 구조체 esp가 가리키는 곳으로 이동시킨다.
    ;sub esp, 4    ;esp - 4

    mov esp, [esp+4]
    popfd
    pop eax
    mov ebx, [esp+12]
    mov [ebx-4], eax
    popad
    mov esp, [esp-20]
    sub esp, 4


    ret ;pop eip

  _ldst ENDP


마지막 연산을 통해서 efl값이 변동된다. efl값이 변동하지 않도록 다시 코딩을 해보자.

반응형
Posted by newind2000
Busan IT/로봇제어2015. 10. 15. 09:10

==================================Outline====================================

ARM 레지스터

gcc kernel 업데이트

----------------------------------------------------------------------------

ARM 레지스터 

로봇제어를 하겠다. 정규시간에는 로봇제어 비정규시간에는 어셈블리를 공부하겠다.

 

라즈베리파이에서 기본형에 간단한 함수를 만들어 넣고 에셈블리 파일이 나오도록 컴파일한다.

 

파일을 열어보면 기존에 배운 어셈블리 파일과 내용이 다른 것을 알 수 있다. 라즈베리 파이는 ARMCPU를 쓰기 때문이다.

 

- 'str' 저장 명령어

 

//embedded recipes 책의 ARM레지스터 부분 참조

레지스터들의 이름은 CPU마다 다르다. Inter사의 이름이 붙은 레지스터가 특이한 경우이다.

 

PCProgram Counter이다. 인텔 CPU 레지스터의 EIP와 같은 기능을 한다.

 

레지스터는 7가지 모드가 존재한다.

 

r13 - r15는 특수한 기능을 가지고 있다.

 

모드에 상관없이 r0 - r7에는 같은 값이 들어간다.

 

- SP는 스택 포인터의 약자이다.

 

r14link 레지스터로써 프로그램이 복귀할 주소를 저장해 놓는다.

 

인텔의 CPU와 달리 ARM은 함수의 인자와 리턴 어드레스를 저장하기 위해 스택을 사용하지 않고 CPU 레지스터를 사용한다.

 

ARM은 메모리를 적게 사용하기 때문에 Intel에 비해 속도가 빠르다.


gcc kernel 업데이트 

리눅스에 맞는 최신 커널을 다운받아 업데이트한다.

 

https://www.raspberrypi.org/documentation/linux/kernel/building.md

 

 

GitHub는 프로그램을 버전별로 정리해주는 자료서버이다.

 

 

라즈베리파이2 회로도 정보 및 techrical reference manual을 다운 받아 저장한다.




반응형
Posted by newind2000