Busan IT/로봇제어2015. 10. 16. 16:07

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

모듈 파라미터

장치 드라이버의 형식

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

//모듈을 위한 프로그래밍 시 코딩 파일의 이름을 'main'으로하면 에러가 난다.

 

 

모듈 파라미터

 

make up, down도 마저 작성한 후 모듈을 올리고 내려 본다.

 

//모듈 상태를 보는 명령어 ‘lsmod'

 

 

 

모듈 사용 시 인자를 선언하여 그 값을 바꿔줄 수 있다.

 

이를 사용하기 위해서는 아래의 매크로를 등록해야 한다.

 

module_param(name, type, perm);

name => 변수 이름type   => 변수 타입perm  => 퍼미션

 

int iNum과 문자열 “Hello"를 선언해주고 모듈 인자에 넣어 값을 변동한 뒤 출력해본다.

 

insmod smart.ko iNum=999

insmod smart.ko cpT="Hello"

 

//‘dmesg’로 출력할 수 있다..

 



[smart.c]

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");

static int rp_init(void);
static void rp_exit(void);
module_init(rp_init);
module_exit(rp_exit);
int iNum = 100;
char * cpT = "Test Message";
module_param(iNum, int0);//charp = char *

static int rp_init(void)
{
  printk("Welcome to Smart World!\n");
  printk("[%d]\n", iNum);
  printk("[%s]\n", cpT);
  return 0;
}

static void rp_exit(void)
{
  printk("Farewell Dear\n");

  return;
}  

[makefile]

obj-m = smart.o

#KDIR = /lib/modules/$(shell uname -r)/build
KDIR = /usr/src/linux

PWD = $(shell pwd)

all:
  @clear
  $(MAKE) -C $(KDIR) M=$(PWD) modules
  @ls -al smart.ko

up:
  @clear
  @insmod smart.ko
  @echo ================== dmesg =================
  @dmesg | tail
  @echo ================== dmesg =================

down:
  @clear
  @rmmod smart
  @echo ================== dmesg =================
  @dmesg | tail
  @echo ================== dmesg =================

clean:
  @clear
  @rm -rf *.ko
  @rm -rf *.mod.*
  @rm -rf .*.cmd
  @rm -rf *.o
  @rm -rf modules.order
  @rm -rf Module.symvers
  @rm -rf .tmp_versions
  @ls -al
  @echo Clean :Done.

 

장치 드라이버의 형식

 

Unix방식을 물려받은 linux는 모든 장치들을 파일로 관리한다.

노란색 폴더가 장치를 의미한다.

 

장치 드라이버의 형식

 

장치 드라이버는 3개로 나눈다. 

 

c: c for character : 데이터 전송 단위 1byte(크기가 고정되어 있지 않다)

ex) 마우스, 키보드

 

b: b for block: 블록은 데이터 크기가 고정되어 있다. 데이터를 보낼 때 고정된 크기만큼 보낸다.

ex) 하드드라이브

 

n: n for network: ???

 

Q: 하드드라이브가 일정한 크기(블록으)로 조각나 있는 이유?

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

커널이 있는 폴더가 linux이다.

 

MODULE_LICENSE("GPL")

 

커널 사용을 위해 GPL 규약을 승인한다는 뜻이다.

 

라즈베리파이로 프로그래밍을 하는 방법은 2가지이다.

 

1. 라이브러리를 사용

2. 디바이스 커널을 사용






 

Line. 6 : $(shell uname -r)

쉘 창에서 'uname -r' 값을 가져오는 것이다.

Line. 11: *.ko

커널 오브젝트라는 뜻이다.

 

//makefile 생성시 m은 대문자이다.

 

반응형
Posted by newind2000
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/로봇제어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