ITGenerations
2018_0529_수업자료 본문
register 메모리 구성하는 최소 단위
마이크로 프로세스
마이크로 프로세서
윈도우 64bit는 레지스터의 크기로 64bits라고 한다.
1bit는 논리적으로 표현하면 0과 1로 표현한다.
1bit는 물리적으로 표현하면 High면 On(5V), Low면 Off(0V)
0과 1을 저장하기 위한 '장치'는 플리플롭이라고 한다.
최소단위는 트랜지스터 - 게이트 - 매치(or 플리플롭)
32비트 레지스터란, 임의의 프로세서에 레지스터의 길이를 의미하며 동시에,
마이크로프로세서를 이야기할 때 반드시에 기억해야되는 것은 인스트럭션 셋트와 레지스터다.
32비트 레지스터란, 32비트에 해당하는 명령어 셋(인스트럭션 셋트)를 가지고 있다.
ARM 레지스터 타입은 RISC다.
RISC Reduce Instruction Set Compuer
CISC Complex Instruction Set Computer
어셈블리어로 작성된다.
ARM에는 37개의 레지스터가 있다.
31개의 General 레지스터
6개의 status 레지스터
16개빼면 21개 남는데, 예외처리하면 ~가 된다.
as anytime이라는 상태는 user+system상태|FIQ상태(inturrup걸리는상태)|SuperVisior상태|Abort상태|IRQ상태|Undefined상태 라고 할 수있다.
System&User 16개 |
R0~R15 |
FIQ 7개 |
R8_fiq~R14_fiq |
Supervisor 2개 |
R13svc~R14_svc |
Abort 2개 |
R13_abt~R14_abt |
IRQ 2개 |
R13_irq~R14_irq |
Undefined 2개 |
R13_und~R14_und |
CPSR |
CPSR |
CPSR |
CPSR |
CPSR |
CPSR |
|
SPSR_fiq |
SPSR_svc |
SPSR_abt |
SPSR_irq |
SPSR_und |
System&User | FIQ | Supervisor | Abort | IRQ | Undefined |
R0 | R0 | R0 | R0 | R0 | R0 |
R1 | R1 | R1 | R1 | R1 | R1 |
R2 | R2 | R2 | R2 | R2 | R2 |
R3 | R3 | R3 | R3 | R3 | R3 |
R4 | R4 | R4 | R4 | R4 | R4 |
R5 | R5 | R5 | R5 | R5 | R5 |
R6 | R6 | R6 | R6 | R6 | R6 |
R7 | R7 | R7 | R7 | R7 | R7 |
R8 | R8_fiq | R8 | R8 | R8 | R8 |
R9 | R9_fiq | R9 | R9 | R9 | R9 |
R10 | R10_fiq | R10 | R10 | R10 | R10 |
R11 | R11_fiq | R11 | R11 | R11 | R11 |
R12 | R12_fiq | R12 | R12 | R12 | R12 |
R13 | R13_fiq | R13_svc | R13_abt | R13_irq | R13_und |
R14 | R14_fiq | R14_svc | R14_abt | R14_irq | R14_und |
R15(pc) | R15(pc) | R15(pc) | R15(pc) | R15(pc) | R15(pc) |
CPSR | CPSR | CPSR | CPSR | CPSR | CPSR |
SPSR_fiq | SPSR_svc | SPSR_abt | SPSR_irq | SPSR_und |
15 + 7+ 2+ 2+ 2+2 +6 = 37
"Shadow" Register
CPU 동작 모드가 USER 모드 -> Supervisor 모드로 바뀔 경우, Supervisor 모드에서만 동작하는 Shadow register R13과 R14가 끼어든다.
유저모드에서는 R0~R15까지 보이는데 각각 32비트(레지스터의 길이)다.(?)
레지스터 하나하나가 32비트다.
리눅스 아키텍처(Linux Architecture)
User Level |
Application |
|||
Library |
(Application과 Library는 하나로 봐도무방) |
|||
------------------------------------------------------------------------------ |
||||
Software Inturrupt |
||||
Kernel Level |
System Call |
|||
Virtual File System |
||||
General File System |
Device File System |
Network File System |
||
Buffer cache |
TCP/IP Protocol stack |
|||
Block Device Driver |
Network Device Driver |
|||
Device Interface |
||||
Block Device |
Character Device |
Network Device |
User가 작성한 프로그램(프로그래밍)은 OS위에서 구동한다.
단, 여기서는 리눅스 OS라고 한다.
리눅스는 User Level의 Application에 속한다.
시스템에서 제공된 라이브를 사용하지 않으면 사용이 어려워 진다.
예를 들어서 네트워크 프로그래밍을 작성하면
Application - Library - Software Inturrupt - System Call - Network File System - TCP/IP Protocol Stack - Network Device Driver - Device Interface - Network Device를 사용하게된다.
여기서 가장 중요한 것은 System Call 이다.
open( ), close( ), fseek( ), read( ), write( )....
저수준 입출력 함수, C에서 구동가능함,위와 같은것들은 라이브러리다
open( ) - 내 프로그램 내에서 다른 파일을 열 수 있다. 해당 내용을 읽을 수 있다. 다른 디렉터리에 있다.
close( ) - 다 사용하면, 닫는다.
write( ) - 다 사용하고 파일형태로 저장하기 위해서 사용한다.
1. open()->swi 9000005 (1), 시스템번호를 호출하는것임-> sys_open()
(1) swi는 software inturrupt를 지칭함(어셈블리어) 9000005 즉, 5번이라는 시스템콜을 한다.
번호를 저장/지정되어있다. (파일을 실행하기 위한)
시스템(Application)에서 xxx( )을 실행하기 위해서는 System Call으로 바로 거치기 위해서는
'sys_xxx( )'를 실행한다.
내가 시스템콜을 테스트해보고싶다. 리눅스라는 시스템에서 제공하는걸 찾아보면, 시스템콜을 바로 실행할 수있다.
논리적으로 시스템콜이 어떤식으로 구동하는지 알아보자. -> '1' 을 보면된다.
시스템콜을 시행하기 위해서는 소프트웨어 인터럽트의 번호를 호출한다.
바로 실행하기 위해서는 'sys_xxx( )'를 실행한다.
System Call이 무엇인가? 라고 하면 아래를 설명하면 된다. 그리고 아래 단계를 기억하자.
System Call을 테스트 하는 방법
(큰 틀에서 보는것이다 세세한 것은 아래에서 다시 다룬다)
중요!!! (1) System Call 함수 구현 : sys_함수이름() -1. 시스템콜 함수 구현 eros.c -2. Makefile 수정 -3.config.in 파일 수정 (2) System Call 번호 할당 - 1. unistd.h 파일에 번호 할당 - 2.call.S 파일 수정 - 3. 커널 컴파일 (3) Application 구현 - 1. Application 소스를 작성한다 : eros_call.c - 2.Makefile 체크 - 3. zmodem을 통해서 실행파일 eros_call을 타겟보드로 전송 - 4. 실행 |
각 번호에서 해당하는 세세한 내용은 아직까지는 세세히 알 필요없다.
위 과정이 어떻게 진행되는지를 기억&이해 정도만 해도 된다.
총론 : 어떤 부문의 일반적 이론을 총괄하여 서술한 해설이나 저작.
각론 : 논문이나 저술 따위에서, 하나의 주제 가운데 구체적인 낱낱의 문제를 떼어 자세히 논함. 또는 그런 낱낱의 학문 분야.(따로풀이)
여기서 총론만 다뤘다...
(총론)시스템콜을 다루기 위해서는 1. 시스템콜 함수 구현, 2. 시스템콜 번호 할당, 3. 어플리케이션 구현한다.
(총론)시스템콜을 다루기 위해서는 1. 시스템콜 함수 구현, 2. 시스템콜 번호 할당, 3. 어플리케이션 구현한다. |
*각론은 잊어먹어도 되나, 총론은 꼭 알아야된다. 각론은 모르면 찾아보면되기때문.
(총론_1) 1. System Call 함수 구현
(각론_1) 1. 먼저 테스트할 시스템 콜 함수 eros.c를 구현한다.
구현될 시스템 콜 함수 eros.c는 커널 디렉토리 안에 작성된다.
즉, /KERNEL_SRC/kernel/eros.c
단, 여기서 /KERNERLSRC/=.../2.4.18-rmk7-pxa1-xhyper255/
#include<linux/kernel.h>
#include<linux/errno.h>
//sys_함수이름을 호출하기 위해서 asmlinkage_void 파일을 사용.
asmlinkage void sys_eros(int in) // int in은 외부에서 받아온다
{
int years;
years = in;
printk("\n EROS System Call....\n"); //printk는 read를 의미한다.
printk("\t You are \'%d%'years old\n", years);
}
위 소스는 커널에서 동장한다.
(각론_2) 2. Makefile 수정 (커널 디렉토리 아래에 있음)
obj-$(CONFIG_EROS_SYSCALL) += eros.o 추가
(각론_3) 3. config.in 파일 수정
위에서 Makefile을 수정하였으나 커널 아키텍처마다 컴파일 되는 커널이 틀리므로 사용하는 씨피유타입에 맞게 이를 인지 시켜야 된다. 따라서, 해당 씨피유를 지원하는 디렉터리로 이동한다. PXA255의 경우 ARM이므로,
#cd /KERNEL_SRC/arch/arm #ls config.in...... |
이 config.in 파일을 다음과 같이 수정한다.
- 먼저 vi config.in 후, "General setup"을 찾는다.
리눅스는 Arm뿐만 아니라 다양한 것을 지원한다.
다만, Arm혹은 그에 해당하는 것에 맞춰서 커널을 건들여줘야한다.(각각의 디렉터리로 이동)
그 아래에 다음의 항목을 추가
bool 'EROS System Call Support' CONFIG_EROS_SYSCALL |
(총론_2) 2. 시스템 콜 번호 할당
(각론_1) 1. unistd.h 파일에 번호 할당
시스템 콜 함수 이름과 번호할당은 unistd.h 헤드 파일에 해당 시스템 콜 함수 이름과 번호 할당한다.
unistd.h 파일은 헤드파일이므로 ~/include 디렉토리 밑에 있다는 것을 기억하자!
즉, unistd.h 헤드파일은 아래의 디렉토리에 존재한다.
/KERNEL_SRC/include/asm-arm/unistd.h
-Base 주소값 참조
#define_NR_SYSCALL_BASE 0x900000
-시스템 콜 번호 할당(:마지막번호+1의 번호할당)
#define_NR_readahead(_NR_SYSCALL_BASE+225)
#define_NR_eros(_NR_SYSCALL_BASE+226)
(각론_2) 2.call.S 파일 수정
시스템 콜 함수 구현과 번호 할당이 끝났으면 이 둘을 연결 시켜야한다. 이를 위하여
/KERNER_SRC/arch/arm/kernel/call.S 파일에 시스템 콜 함수와 번호를 연결할 수 있는 호출 넘버를 설정한다.
/*255*/ .long SYMBOL_NAME (SYS_readahead)
/*255*/ .long SYMBOL_NAME (SYS_eors) : 추가
(각론_3) 3. 커널 컴파일
이제 남은 일은 커널을 컴파일하여 올리면 된다.
#cd /KERNEL_SRC/ #make xhyper255A__conifg : 타겟보드 설정이 변경됨 #make menuconfig // ->General Setup : 선택 [*] EROS System Call Support (New) #make dep // 새롭게 만들어질 리눅스 커널이다. 호스트 피씨에서 만들어짐!!! 타겟보드아님!!! 타겟보드를 위해서 #make zImage // zImage를 /tftpboot/에 옮겨간다. 이후 타겟보드에 로그인해 들어가서 tftp로 zImage를 다운받는다. // 루트 밑에 zImage에서 위 파일을 다운받는다. tftp는 타겟보드에서 실행되는 명령어다. 타겟보드에서 미니콤을 실행해서 창을 연다. 타겟보드에서 나타나는 창에 아래처럼 명령어 입력한다. XHYPER255 > tftp zImage kernel // 다운로드 받는다. XHYPER255 > flash kernel // zImage를 커널에 fusing 시킨다. |
(총론3) 3. Application 구현
(각론_1) 1. Application 소스를 작성한다 : eros_call.c
eros_call.c 소스 #include <stdio.h> #include <linux/unistd.h> _syscall1(void, eros, int, in); int main() { int my_years; printf("\n Input Your Years : \n"); scanf("%d", &my_years); eros(my_years); return 0; } |
(각론_2) 2.Makefile 체크
Makefile 체크 ## EROS System Call Example CC=/usr/local/bin/arm-linux-gcc //gcc 크로스 툴체인을 사용한다. 타겟보드 사용을 위해 INCDIR = /KERNEL_SRc/2.4.18-rmk7-xhyper255R1.1/include CFLAGS=-l$(INCDIR) -Wall SRC = eros_call.c OUT = eros_call //r결과물 all : $(OUT) $(CC) $(CFLAGS) $(SRC) -o $(OUT) clean : rm -f *.o$(OUT) |
(각론_3) 3. zmodem을 통해서 실행파일 eros_call을 타겟보드로 전송
minicom 실행
zmodem 선택
(각론_4) 4. 실행
XHYPER255>./eros_call
'Univ > 임베디드' 카테고리의 다른 글
임베디드 수업내용 정리 2018_06_12 (0) | 2018.06.12 |
---|---|
2018_06_05 임베디드 수업 (0) | 2018.06.05 |
2018_0524 임베디드 수업자료 (0) | 2018.05.24 |
2018_05_17 수업자료 (0) | 2018.05.17 |
2018_05_15 임베디드 수업자료2 (0) | 2018.05.15 |