리눅스 프로세스 관리

Download Report

Transcript 리눅스 프로세스 관리

임베디드 리눅스 시스템
(using EMPOS II)
한백전자 기술연구소 (소프트웨어 개발팀)
작 성
2016-07-06
: 양 근 배 ([email protected])
-1-
www.hanback.co.kr
•
•
•
•
•
•
•
•
•
•
•
2016-07-06
임베디드 시스템과 리눅스
임베디드 시스템 개발 구조
EMPOS II 하드웨어/소프트웨어 구성
부트로더 분석(EMPOS-BOOT)
리눅스 메모리 관리
리눅스 프로세스 관리
리눅스 커널
리눅스 파일 시스템
소프트웨어 개발 환경 설치
응용 프로그램 작성
디바이스 드라이버
-2-
www.hanback.co.kr
임베디드 시스템과 리눅스
임베디드 시스템의 정의
정해진 특정 기능을 수행하기 위해 하드웨어와 소프트웨어가 내장된 전자
제어 시스템을 말한다. 즉 단순 회로만으로 구성된 장치가 아닌 마이크로
프로세서가 내장되어 있고, 이러한 마이크로프로세서를 운영하여 원하는
작업을 수행 및 관리하는 프로그램이 포함된 시스템을 의미한다.
다양한 응용 분야에 적용
•
•
•
•
2016-07-06
PDA(Personal Digital Assistant )
각종 전자 제품
가정 자동화 시스템
공장 자동화 시스템
-3-
www.hanback.co.kr
임베디드 시스템과 리눅스
임베디드 시스템의 도입
•
•
•
•
•
시스템의 규모가 커짐
- Multi Tasking
Network나 multimedia가 시스템의 기본으로 자리 잡음
- Networking, GUI, Audio, Video,…
임베디드 시스템이 해야 할 일이 많아 지고 복잡해짐
순차적인 프로그램이 어렵게 됨
임베디드 시스템에도 운영체제의 개념이 필요하게 됨
임베디드 운영체제
•
•
2016-07-06
Real Time OS(RTOS)
- VxWorks, pSOS, VRTX
일반 임베디드 OS
- Embeded linux, Windows CE
-4-
www.hanback.co.kr
임베디드 시스템과 리눅스
기존 상용 임베디드 OS의 단점
•
•
•
•
2016-07-06
크기가 너무 크고 커널의 재구성이 비교적 용이하지 않다.
- 다양한 시스템을 구성하기 힘들다.
- 이동형 장비의 자원 한계의 벽에 이루기가 쉽다.
초기 구입비와 사용료(로열티)가 너무 비싸다.
- 대중화 상용화에 걸림돌이 될 수 있다.
커널이 오픈 소스가 아니다.
- 개발자도 한 사람의 사용자, OS에 대한 기술 축적불가
일반인에게 잘 알려져 있지 않다.
-5-
www.hanback.co.kr
임베디드 시스템과 리눅스
리눅스 특징
•
•
•
•
•
•
•
•
2016-07-06
멀티유저, 멀티 태스킹 시스템.
CPU의 최적화
효율적인 가상 메모리
동적 공유 라이브러리 (라이브러리 모듈의 존재)
뛰어난 네크워킹(네트웍 서버로서의 탁월성)
유연한 사용자 환경(X-Windows의 공개버전인 XFree86)
가상 콘솔의 제공(여러 개의 가상 콘솔을 사용)
POSIX와 완변한 호환
-6-
www.hanback.co.kr
임베디드 시스템과 리눅스
리눅스의 장점
•
•
•
•
•
•
•
•
•
•
2016-07-06
리눅스는 오래되고 많은 사람이 사용한다.
- 검증이 되었고, 안정적이고 다양한 기능을 수용 할 수 있다.
open source, open architecture이다.
- 수많은 개발자에 의하여 발전된다.
- 개발자 필요에 의하여 변경 가능하며 문제점 해결 할 수 있다.
소규모 모듈단위로 설계되어 있다
- 구조 변경 및 재구성이 용이하다.
Real Time운영을 지원한다.
- 상용 OS에 열세였던 RealTime성을 확보. 다양한 분야에 적용 가능
GUI의 불필요
원격 관리의 용의성(네트웍을 통한 시스템의 관리 유지보수 가능)
리부팅의 불필요(커널 UP 제외)
바이러스및 보안에 안전
뛰어난 어플리 케이션(컴파일러, 편집기, 기타 유틸리티)
상대적으로 작은 커널 크기(PDA등에 로드 가능)
-7-
www.hanback.co.kr
임베디드 시스템과 리눅스
리눅스의 한계
•
•
•
•
2016-07-06
품질 보증 프로그램의 부제
체계적이지 못한 문서화
버그 존재 확률이 많은 커널
멀티 미디어 기능이 약함
- MS Windows에 비해 멀티미디어 웹브라우징 기능이 약함
-8-
www.hanback.co.kr
임베디드 시스템 개발 구조
2016-07-06
-9-
www.hanback.co.kr
임베디드 시스템 개발 구조
임베디드 시스템의 개발
하드웨어
임베디드
시스템 개발
OS개발 또는 포팅
디바이스 드라이버
응용 프로그램 개발
2016-07-06
- 10 -
www.hanback.co.kr
임베디드 시스템 개발 구조
임베디드 리눅스의 흐름
전원 ON
부트로더 로딩
부트로더 개발/수정
커널 로딩
커널 개발/수정
루트파일시스탬 로딩
Shell/Init 프로세서
2016-07-06
파일시스템 작성
- 11 -
www.hanback.co.kr
임베디드 시스템 개발 구조
일반적인 임베디드 S/W 개발 환경 구성
HOST
2016-07-06
Debug Agent
Simulation
Environment
Target Server
GUI
Development
Tools
TARGET
- 12 -
Embeded Application
Library
Sub-system
Core OS
Kernel
www.hanback.co.kr
EMPOS-II HW/SW 구성
2016-07-06
- 13 -
www.hanback.co.kr
EMPOS-II HW/SW 구성
하드웨어 자원
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
2016-07-06
Memory : 128 Mbyte SDRAM, 32-Mbyte Flash memory. 1 Mbyte SRAM
PCMCIA slot 1개, Compact slot 1개
PS2 Keyboard, Mouse controller
Ethernet : 10/100 M LAN91C111 Primary/Secondary Ethernet controller
Touch-screen panel controllers : Burr Brown ADS7846
Audio CODEC : Cirrus CS4202
TFT LCD panel
USB Client port 1 Port
IrDA (infrared) transceiver 1 Port
Full-Function UART 1 Port
Bluetooth UART l Port
SD(Secure Digital memory Card ) or MultiMediaCard Slot 1개
I2C to 24C16 EEPROM
Epson RTC 4513 Real Time Clock Module
Intel SA-1111 companion 칩 확장용 Expansion 1 Port
7세그먼트 LED 4 Digit
LED * 8 EA
Keyboard 스위치 * 8 EA
20 x2 TEXT LCD * 1EA
- 14 -
www.hanback.co.kr
EMPOS-II HW/SW 구성
하드웨어 블럭도
2016-07-06
- 15 -
www.hanback.co.kr
EMPOS-II HW/SW 구성
소프트웨어 구성
•
•
•
•
•
부트로더 : EMPOS-BOOT v0.1
리눅스 커널 : linux-2.4.19-rmk4-pxa2-empx1
파일 시스템 : ramdisk-16m(ext2)
GUI : QT/E-2.3.2, Qtopia-1.4.0 (jffs)
개발 툴 : GNU Toolkit, Visual Esto
디바이스 모듈 구성
•
•
2016-07-06
커널 삽입 디바이스
- TFT LCD, PCMIA/CF, PS2 Keyboard, Touch Screen
- AC97 Audio, IrDA, FFUART, MMC 등
모듈 형태 디바이스
- SMC91111 Primary/Secondary Ethernet Driver(커널 소스에 포함)
- Prism2 Wireless Driver
- ide Disk Dirver
- Text LCD Driver
- LED, Button Driver
- 7Segment LED Driver
- GPIO Input , Output Driver
- 16 -
www.hanback.co.kr
부트로더 분석(EMPOS-BOOT)
2016-07-06
- 17 -
www.hanback.co.kr
부트로더 분석
일반 리눅스
EMPOS
BootLoader
BootLoader
LILO(LInux LOader)
EMPOS_boot
하드 디스크의 MBR에서 동작
Flash 0 block에서 동작
여러 O/S를 선택적으로 부팅
Linux Booting
Command line
• Kernel/root filesystem을 Downloading
• Ram에서 Flash로 writing
2016-07-06
- 18 -
www.hanback.co.kr
부트로더 분석
부트로더의 역할
•
•
•
•
•
hardware 초기화
- Memory setting
- CPU Clock setting
- GPIO setting
- Serial setting
- MAC address 획득 및 Ethernet port setting
Flash 에서 RAM으로 memory copy
- kernel image copy
- ramdisk image copy
- 부트로더 자신 copy
Kernel booting
Command mode 제공
포팅의 편의를 위한 Debug 모드 제공
여러 부트로더들
•
2016-07-06
blob, Redboot, ppcboot, armboot, bootldr 등
- 19 -
www.hanback.co.kr
부트로더 분석
부트로더 흐름도
2016-07-06
- 20 -
www.hanback.co.kr
부트로더 분석
* 소스 파일
•
Makefile : make 유틸리티에 사용되는 컴파일 스크립트
•
start.S : 처음 시작하는 코드로써 래지스터 세팅을 담당한다.
•
main.c : 전체적인 부트로더 시퀀스를 통제한다.
•
commans.c : 몇가지를 제외한 대부분의 명령어를 처리한다.
•
lib.c : 소스에서 사용하는 여러 라이브러리 성격의 함수를 제공한다.
•
flash.c : flash 메모리에 데이터를 저장하는 역할을 한다.
•
serial.c : FFUART 초기화 및 모니터링을 위한 기본 함수를 제공한다.
•
time.c : 부트로더에서 사용하는 타이머를 담당한다.
•
smc91111.c : 네트워크 디바이스파일로써 저수준 네트워크 통신을 담당한다.
•
net.c : bootp, tftp와 smc91111.c와의 중간 다리 역할을 한다.
•
bootp.c : bootp 패킷의 구성과 전달을 담당한다.
•
tftp.c : tftp 패킷의 구성과 전달을 담당한다.
* 해더 파일
•
ld-xscale : 링커 스크립트로 링커의 모듈 결합에 사용된다.
•
bootp.h : bootp.c와 관련된 해더.
•
commands.h : commands.c와 관련된 해더.
•
config.h : 보드의 래지스터 및 환경설정을 담당한다.
•
flash.h : flash.c 와 관련된 해더.
•
header.h : 네트워크 패킷 구성에 사용되는 패킷의 구조를 제공한다.
•
lib.h : lib.c 와 관련된 해더.
•
main.h : main.c 와 관련된 해더.
•
net.h : net.c와 관련된 해더.
•
reg.h : Xscale PXA255와 관련된 여러 래지스터의 주소.
•
serial.h : serial.c와 관련된 해더.
•
smc91111.h : smc91111.c와 관련되 해더.
•
tftp.h : tftp.c와 관련된 해더
•
time.h : time.c와 관련된 해더
•
types.h : 변수 타입 및 필요 항목 정의
2016-07-06
- 21 -
www.hanback.co.kr
부트로더 분석
매모리 맵
2016-07-06
- 22 -
www.hanback.co.kr
부트로더 분석
부트로더 명령어
•
•
•
•
•
•
•
•
•
•
•
•
•
•
2016-07-06
boot
: 램상에 존재하는 커널을 부팅한다.
reset
: 롬상에 존재하는 부트로더를 재시작한다.
bootp
: bootp를 통해 호스트로 부터 IP를 할당 받는다.
setip
: host와 target의 IP를 설정한다.
macwrite : Primary/Secondary Ethernet의 MAC주소를 설정한다.
tftp
: tftp를 통한 데이터를 전송받는다.
download : 시리얼을 통한 데이터를 전송받는다.
read
: 특정 메모리 위치의 값을 읽어 온다
write
: 특정 메모리 위치의 값을 변경 한다.
flash
: 전송 받은 데이터를 플래쉬에 저장한다.
erase
: 플래쉬에 저장되어 있는 데이터를 삭제한다.
status
: 메모리맵/래지스터/이더넷설정등을 출력한다.
help
: 도움말을 출력한다.
test
: 사용자 태스트 함수를 제공한다.
- 23 -
www.hanback.co.kr
부트로더 분석
소스 분석
•
•
•
•
•
•
Makefile
ld-xscale
config.h
start.S
main.c
serial.c
실습과제
•
•
•
•
•
2016-07-06
부트로더를 컴파일할 툴체인 리눅스 호스트에 설치한다.
처음 출력되는 Copyright 정보에 자신의 정보를 추가한다.
IO 초기화 부분을 수정하여, TextLCD 글자를 변경한다.
태스트 함수를 수정해서, 버튼 입력을 출력한다.
수정된 부트로더를 컴파일하여 보드에 포팅한다.
- 24 -
www.hanback.co.kr
리눅스 매모리 관리
2016-07-06
- 25 -
www.hanback.co.kr
리눅스 매모리 관리
세그먼트 방식
디스크립터 테이블
세그먼트
프로그램 블가능한 래지스터
세그먼트 셀렉터
2016-07-06
- 26 -
www.hanback.co.kr
리눅스 매모리 관리
세그먼트 디스크립터
세그먼트의 특징을 기술하는 8바이트의 디스크립터로 GDT나 LDT에 저장된다.
- GDT(Global Descriptor Table) : 하나만 존재
- LDT(Local Descriptor Table): 프로세스마다 존재
세그먼트 디스크립터에 기록된 내용
–
–
–
–
–
–
–
2016-07-06
세그먼트가 시작하는 선형 주소를 포함한 32비트의 Base 필드
과립도를 나타내는 G플래그(0-> 세그먼트 크기가 Byte, 1-> 4096을 곱한 크기)
세그먼트 길이를 바이트 단위로 나타내는 20 비트 크기의 Limit 필드
(G :0 -> 1부터 1MB, G:1 -> 4KB ~ 4GB)
시스템 플래그 S(S:0 ->커널 자료구조를 포함한 시스템 세그먼트, S:1 -> 일반 코
드, 데이터 포함하는 세그먼트)
세그먼트 종류, 접근권한을 나타내는 4비트 Type 필드(0: 커널만이 접근)
코드포함, 데이터 포함을 나타내는 플래그
운영체제가 사용하는 AVL플래그(리눅스에서는 무시)
- 27 -
www.hanback.co.kr
리눅스 매모리 관리
세그먼트 디스크립터의 종류
-
코드 세그먼트 디스크립터
GDT, LDT 모두에 존재 가능, S플래그를 1로 설정한다
-
데이터 세그먼트 디스크립터
GDT, LDT 모두에 존재 가능, S플래그를 1로설정(ex: 스텍 세그먼트등)
-
작업 상태 세그먼트 디스크립터
프로세서의 래지스터 상태를 저장하기 위해 사용, GDT에만 존재, S플래그 0
-
지역 디스크립터 테이블(LDTD)
LDT에 포함한 세그먼트의 참조를 나타낸다, GDT에만 존재, S플래그 0
2016-07-06
- 28 -
www.hanback.co.kr
리눅스 매모리 관리
세그먼트 셀렉터
논리 주소를 선형 주소로 변환을 위해 사용(세그먼트 래지스터)의 내용이
바뀌었을경우 다음 세그먼트를 찾기위해 사용
세그먼트 셀럭터의 필드 구성
GDT, LTD에 있는 세그먼트 디스크립터 엔트리를 구별하는 인덱스
TI (Table, Indicator) : 세그먼트가 GDT, LTD중 어디에 존재함을 나타낸다(TI:0->GTD,
TI:1 -> LTD)
권한 수준(세그먼트가 로드되었을 때 권한수준)
2016-07-06
- 29 -
www.hanback.co.kr
리눅스 매모리 관리
패이징 방식
31
22 21
디렉토리
12
테이블
11
0
옵셋
페이지
페이지 디렉토리
2016-07-06
페이지 테이블
- 30 -
www.hanback.co.kr
리눅스 매모리 관리
10 bit : 1024개의 앤트리 포함 가능
12 bit : 4096 byte 데이터 포함
1024*1024 *4096 =2**32개의 메모리 셀 주소 지정 가능
패이지 디렉토리/테이블 엔트리 구조
Present 플래그 (주메모리에 존재여부)
Accessed플래그 (페이지 프래임에 접근할 때마다 1)
Dirty 플래그 (썻을 경우:1)
Read/Write 플래그(접근 권한)
User/Supervisor 플래그(접근 권한 수준, 보호정책)
PCD/PWT 플래그 (하드웨어 케시가 페이지 태이블을 다루는 방법 제시)
Pase Size 플래그 (페이지 디렉토리 엔트리에만 적용
(1: 페이지프래임은4MB, 확장 패이징)
2016-07-06
- 31 -
www.hanback.co.kr
리눅스 매모리 관리
확장 패이징
중간 페이지 태이블이 불필요, 메모리 절약
메모리 단편화
하드웨어 보호 정책
세그먼트 유닛
패이징 유닛
권한 수준
0~4
User/Supervisor
접근 권한
읽기/쓰기/시행
읽기/쓰기
2016-07-06
- 32 -
www.hanback.co.kr
리눅스 매모리 관리
커널이 프로세스에게 0x20000000 ~0x2003ffff 까지
선형 주소 공간을 할당을 할 경우
0x2003ffff(0010000000 0000111111 111111111111) 0x80, 0x63
2016-07-06
- 33 -
www.hanback.co.kr
리눅스 매모리 관리
프로세스가 선형 주소 0x20021406의 값을 읽으려고
할경우 패이징 유닛 처리
1) 디렉토리 필드 0x80은 페이지 디렉토리 0x80 엔트리를 선택 (이곳에 패
이지 태이블의 위치존재)
2) 테이블 필드 0x21은 페이지 테이블의 0x21째 엔트리 선택 (이곳에 패이
지 프래임의 위치 존재)
3) 패이지 프레임의 오프셋 필드 0x406값을 선택
4) 만약 엔트리의 Present 플래그가 0이면 주메모리에 존재 하지 않으므로
패이지 예외 발생
2016-07-06
- 34 -
www.hanback.co.kr
리눅스 매모리 관리
예약된 페이지 프레임
일반적인 리눅스는 커널을 램의 0x00100000부터 시작하여 설치하며 이전
부분에 해당하는 페이지 프레임은 동적으로 할당되거나 스왑되지 않으며
다음처럼 사용된다.
페이지 프레임 0 : BIOS가 POST과정에서 인식한 시스템 하드웨어 설정 저
장 용도
0x000a0000 ~000fffff : BIOS 함수와 ISA 그래픽 카드의 내부 메모리 메핑
용도
프로세스 페이지 테이블
32bit 프로세서에서는 4G의 선형 주소 공간을 가질수 있다
(0x100000000 /0x400/0x400/0x400)
PAGE_OFFSET 매크로는 0xc0000000값을 보통 갖는다.(커널 영역과 프로
세스 영역 분리)
2016-07-06
- 35 -
www.hanback.co.kr
리눅스 프로세스 관리
2016-07-06
- 36 -
www.hanback.co.kr
리눅스 프로세스 관리
프로세스
멀티 프로그램 운영체제의 필수 개념으로 실행 상태에 있는 프로그램 인스
턴스
프로세스 디스크립터
커널이 프로세스의 정보를 사용할수 있도록 프로세스의 모든 정보를 저장
한다
state 필드 : 현재의 프로세스 상태
프로세스 ID : pid, pgrp, uid, euid, suid
프로세스 관계 : next_task, next_run, p_optr, p_pptr
파일 정보 : files_struct, fs_struct
시그널 정보 : sigpending, signal, blocked, sigaction
메모리 정보 :mm object, start_code, vm_area-struct,pgd
스케줄링 정보 : semsleeping, semundo
시행 파일 포멧 : personaliy, binfmt
자원 사용량 통계: utime, stime,rlimit
2016-07-06
- 37 -
www.hanback.co.kr
리눅스 프로세스 관리
state
nead_reched counter priority
tty_struct
next_task
prev_task
next_run
prev_run
프로세스완 연관된 tty
fs_struct
p_optr
p_optr
……..
현재 디랙토리
files_struct
파일 디스크립터 포인터
tty
mm_struct
tss
메모리 영역 디스크립터 포인터
signal_struct
fs
files
수신한 시그널
mm
signal_lock
sig
……..
2016-07-06
- 38 -
www.hanback.co.kr
리눅스 프로세스 관리
프로세스 상태
state 필드에서 나타낸다.
-
-
TASK_RUNNING : 프로세스가 CPU에서실행 중이거나 기다리는 중
TASK_INTERRUPIBLE : 프로세스가 인터럽트 가능
대기상태일경우, 기다리던 자원을 할당받거나, 시그널이 전달되면
TASK_RUNNING으로 전위(대기상태)
TASK_UNINTERRUPTIBLE : 위와 비슷하지만 프로세스에 시그널을 전달
해도 상태가 바뀌지 않는다. 거의 사용X, 장치 파일등을 열고 방해없이 완료
해야할경우 사용(대기상태)
TASK_STOPPED : SIGSTOP, SIGTSTP, SIGTTIN을 받았을경우 프로세스
는 중단
특정프로세스가 다른 프로세스를 감시 할수 있다(디버거의 ptrace()등)
TASK_ZOMBIE : 프로세스가 종료되었지만 부모 프로세스가 자식 프로세
스의 정보를 가져가지 않을경우
2016-07-06
- 39 -
www.hanback.co.kr
리눅스 프로세스 관리
프로세스 상태 전의
Suspended signal
ptrace
exit
TASK_RUNNING
(running)
TASK_STOPPED
TASK_ZOMBIE
Resume signal
ptrace
scheduling
sleep on
Interruptible_sleep_on
preempt
wait
TASK_INTERRUPTIBLE
TASK_UNINTERRUPTIBLE
(asleep)
2016-07-06
TASK_RUNNING
(ready)
wake_up
wake_up_interruptable
- 40 -
NULL
www.hanback.co.kr
리눅스 프로세스 관리
pid = fork()
PC
Wait((int*)0)
PC
fork 전
execl(“bin/ls”..)
PC
fork 후
exec 후
ls
Wait((int *)0)
2016-07-06
PC
PC
- 41 -
www.hanback.co.kr
리눅스 프로세스 관리
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <unistd.h>
int docommand(char * command)
{
pid_t pid
if((pid =fork()) <0)
return (-1);
if(pid ==0)
/* 자식 */
{ execl(“/bin/sh”, “sh”, “-c”, command, (char *)0);
peror(“execl”);
exit(1);
}
/* 부모의 코드 */
wait((int *)0);
return (0);
}
2016-07-06
- 42 -
www.hanback.co.kr
리눅스 프로세스 관리
프로세스 리스트
prev_task init_task
next_task
task_struck
prev_task
task
next_task
……
Running_queue_head
……
RUNNING
RUNNING
task
next_task
task_struck
task_struck
RUNNING
prev_task
RUNNING
……
RUNNING
RUNNING
current
2016-07-06
- 43 -
www.hanback.co.kr
리눅스 프로세스 관리
프로세스 종료
모든 프로세스 종료는 do_exit() 함수가 처리하며 다음과 같은 작업을 한다.
1.
2.
3.
4.
5.
6.
7.
8.
프로세스 디스크립터의 PF_EXITING 플래그를 설정하여 프로세스가 종료중임을 나
타냄
필요하면 sem_exit() 함수를 호출하여 세마포어 큐에서 프로세스 디스크립터 제거
필요하면 del_timer() 함수를 호출하여 동적 타이머 큐에서 프로세스 디스크림터 제
거
__exit_num(), __exit_files(), __exit_fs(), __exit_sighand()를 호출하여 각각 페이징,
파일시스템, 열린 파일 디스크립터, 시그널 처리등과 관련된 프로세스 자료구조를 점
검하여 더 이상 필요없는 자료구조를 제거
프로세스 디스크립터의 state 플래그를 TASK_ZOMBIE로 설정
프로세스 디스크립터의 exit_code 필드를 프로세스 종료 코드로 설정(exit()시스템콜
에 넘어온 값이나 커널에 넘겨진 값이다)
exit_notify() 함수를 호출하여 부모 프로세스와 자식 프로세스 모두의 친족관계를 갱
신, 종료되는 프로세스의 자식은 모두 init 프로세스의 자식이 된다
schedule() 함수를 호출하여 실행할 새로운 프로세스를 선택한다
2016-07-06
- 44 -
www.hanback.co.kr
리눅스 프로세스 관리
프로세스 제거
부모 프로세스는 wait()함수를 호출하여 자식 프로세스가 정상적으로 종료되었
는지 알수 있다. release()함수를 호출하여 좀비 프로세스의 프로세스 디스크
립터를 해제한다.
1.
2.
3.
4.
5.
6.
free_uid()함수를 호출하여 지금까지 만든 프로세스 개수를 하나 줄인다.
add_free_taskslot() 함수를 호출하여 해제하려는 프로세스 디스크립터를 가리키는
task 엔트리를 해제한다.
nr_task 변수값을 감소시킨다.
uuhash_pio()함수를 호출하여 pidhash 해쉬태이블에서 프로세스 디스크립터를 제거
한다.
REMOVE_LINKS 매크로를 호출하여 프로세스 목록에서 프로세스 디스크립터를 제
거
free_task_struct() 함수를 호출하여 프로세스 디스크립터와 커널 모드 스택으로 사용
되었던 8KB 메모리를 해제한다
2016-07-06
- 45 -
www.hanback.co.kr
리눅스 커널
2016-07-06
- 46 -
www.hanback.co.kr
리눅스 커널
커널이란
운영체제를 구성하고 있는 핵심(core)로써 타겟보드의 시스템 구동에 필요
한 환경 설정과 수행되는 프로그램들을 스케줄링하는 소프트웨어이다.
커널의 기능
•
•
•
•
•
2016-07-06
프로세스 관리(Pocess Management)
메모리 관리(Memory Management)
파일 시스템 관리(File System Management)
디바이스 관리(Device Management)
네트워크 관리(Network Management)
- 47 -
www.hanback.co.kr
리눅스 커널
2016-07-06
- 48 -
www.hanback.co.kr
리눅스 커널
커널 컴파일/포팅 (실습과제)
1) 커널 소스 확보 (linux-2.4.19)
2) arm, pxa, empx 패치 확보 (rmk4-pxa2-empx1)
3) 압축해제, 패치 적용
4) make empos_config : 컴파일 환경을 EMPOS 보드에 맞게 설정
5) make oldconfig (menuconfig) : 설정된 환경을 소스에 적용
6) make dep : 파일 의존성 검사
7) make clean (make distclean) : 이미 컴파일된 오브젝트 삭제
8) make zImage : 압축된 커널이미지 생성
9) make modules : 모듈 형태로 선택된 항목 컴파일(smc91111)
10)생성된 이미지를 tftp서비스 디랙토리로 복사
11) tftp zImage kernel (부트로더 명령어)
12) flash kernel (부트로더 명령어)
13) reset (부트로더 명령어)
2016-07-06
- 49 -
www.hanback.co.kr
리눅스 파일 시스템
2016-07-06
- 50 -
www.hanback.co.kr
리눅스 파일 시스템
파일 시스템이란
디스크의 섹터와 트랙 그리고 실린더 등을 논리적으로 사용하기 위하여, 불
록 단위로 읽고 쓰는 메커니즘을 말한다.
파일 시스템의 구조
/root
bin
boot
dev
etc
user1
2016-07-06
home
lib
user2
mnt
proc
root
sbin
include
- 51 -
tmp
lib
usr
local
var
sbin
src
www.hanback.co.kr
리눅스 파일 시스템
파일 시스템의 구조
•
•
•
•
•
•
•
•
•
•
2016-07-06
/ : 루트 디렉토리
/boot : 부팅 과정에 필요한 모든 구성 요소들이 포함되어 있다
/bin : 실행 파일이 모여 있다
/dev : 디바이스 드라이버들이 존재
/etc : 리눅스 운영에필요한 설정파일 및 초기화 스크립트등이 저장
- /etc/passwd : 사용자 정보를 포함하는 문서
- /etc/fstab : mount –a명령으로 마운트되는 파일시스템과 스왑목록
- /etc/init : 부팅시 커널의 처음 프로세스
- /etc/profile : 쉘에 의해 로그인 할때 실행되는 파일
/home : 사용자의 홈디랙토리
/lib : 공유 라이브러리 모듈 저장
/root : 시스템 관리자인 root의 홈디랙토리
/sbin : 시스템 관리를 위한 실행 유틸리티 저장
/usr : 공유 가능한 대부분의 프로그램 설치
- 52 -
www.hanback.co.kr
리눅스 파일 시스템
ext2 파일시스템의 특성
– 예상되는 시스템의 평균 파일 크기에 따라 시스템 관리자는 최적의 블록
크기를(1024 ~ 4096바이트) 선택이 가능
– 저장할 파일수를 예상한 값에 따라 파티션에 대한 아이노드 수를 선택할
수 있다.(디스크 공간 최적화)
– 디스크 불럭을 그룹으로 분할(탐색시간 절약)
– 파일의 사용 전에 디스크 데이터 블록을 미리 할당(파일 크기 증가시 인
접위치에 예약되므로 단편화를 줄일수 있다.)
– 심볼릭 링크를 지원한다.
– 시스템 중단으로 인한 영향을 최소화한다.
– 부트 과정에서 파일 시스템 상태에 대해 일관성 검사를 자도으로 지원
– 변경 할수 없는 파일, 추가만 가능한 파일등을 지원
– 어떤 방식의(SVR4: 프로세스 그룹ID, BSD:디랙토리ID 물려 받는다)마운
트 옵션 포함
2016-07-06
- 53 -
www.hanback.co.kr
리눅스 파일 시스템
디스크 자료 구조
부트불럭
수퍼 블록 (1)
2016-07-06
……
불럭 그룹 0
그룹
디스크립터 (1)
데이터 블록
비트맵 (1)
- 54 -
불럭 그룹 n
아이노드 아이노드
비트맵 (1) 태이블 (n)
데이터 블록 (n)
www.hanback.co.kr
리눅스 파일 시스템
수퍼 블록에 저장 내용
총 아이노드의 수, 파이시스템 크기, 불록 크기, 단편 크기, 그룹당 아이노드수,
마지막 마운트한 시간, 마지막 쓰기 시간등
그룹 디스크립터
-
각 블록그룹은 자신만의 그룹 디스크립터르 포함하며 다음 정보를 가지고 있다.
불럭 비트맵의 블록번호, 아이노드 비트맵의 블록번호, 그룹안의 아이노드수등
비트맵
비트의 연속으로 값이 0인경우 대응하는 아이노드또는 비트맵이 비었다는 의미
아이노드 테이블
-
-
2016-07-06
아이노드는 모두 128바이트로 같으며 1024 바이트 블록은 8개 4096 바이트블럭
은 32개를 포함하고 아이노드를 나타내는 ext2_inode 구조체는 다음과 같은 정보
를 가지고 있다.
파일유형, 접근 권한, 파일 길이, 소유자 식별자, 마지막 접근 시간, 아이노드 마지
막 변경시간, 하드링크의 수등
- 55 -
www.hanback.co.kr
리눅스 파일 시스템
리눅스의 부팅 과정
1) BIOS가 시스템 이상여부 태스트
-> 부트로더에서 수행
2) 부팅할 드라이브 선택
-> 커널의 플래쉬 위치 선택
3) 선택된 드라이브의 MBR읽어 드림
->수행 불필요
4) MBR의 파티션 태이블을 읽어 부팅할 파티션을 선택 -> 수행 불필요
5) 커널 로드
-> 커널을 램상으로 복사
6) 커널 압축 해제/ 재배치
7) 장착된 하드웨어 검사, 장치 드라이버 설정
8) 파일 시스템 검사
-> 램디스크, jffs이미지에 포함
9) 파일 시스템 마운트
10) /etc/inittab에서 init실행을 위한 설정 내용 확인
11) /sbin/init 실행(PID가 1이됨)
12) /etc/rc.d/rc.sysinit실행(hostname,시스테 점검, 모듈 로딩)
13) /etc/rc.d/rc실행 (runlevel에 따른 스크립트 실행)
14) /etc/rc.d/rc.local(매번 실행할 내용 입력)
15) /etc/rc.d/rc.serial (시리얼 포트 초기화)
16) login
2016-07-06
- 56 -
www.hanback.co.kr
리눅스 파일 시스템
램디스크
•
•
램디스크 생성
- dd if=/dev/zero of=./empos.ramdisk.fs count=4096 bs=1024
- mkfs -t ext2 empos.ramdisk.fs
램디스크 수정
- gunzip ramdisk-16m.gz
- mount –oloop ramdisk-16m dir_name
JFFS
•
2016-07-06
mkfs.jffs2 -o usr.jffs -e 0x40000 -r tmpdir
- 57 -
www.hanback.co.kr
개발 환경 설치
2016-07-06
- 58 -
www.hanback.co.kr
개발 환경 설치
개발 프로그램 설치
•
필요한 rpm 설치
-minicom, bootp, tftp, 설치
•
GNU 툴체인설치
- cross-tools.tgz를 /usr에 해제후 패스설정
•
Visual ESTO 설치
- 압축해제후 ./install.sh 실행
•
기타 프로그램
- gcc-2.95.3, tmake, mkfs.jffs2 등
2016-07-06
- 59 -
www.hanback.co.kr
개발 환경 설치
minicom 환경 설정(minicom –s)
•
2016-07-06
Serial port setup
- A 항목을 /dev/ttyS0로 바꾼다.
- E 항목을 115200 8N1으로 바꾼다
- F, G 항목을 No로 설정한다
- 60 -
www.hanback.co.kr
개발 환경 설치
bootp 환경 설정
•
/etc/bootptab
.default:\
:hd=/tftpboot:bf=null:\
:sm=255.255.255.0
empos :ht=1:ha=0x000B8A000001:tc=.default
•
/etc/hosts
192.169.123.200 empos.hanback.co.kr empos
2016-07-06
- 61 -
www.hanback.co.kr
개발 환경 설치
bootp 환경 설정
•
/etc/xinetd.d/bootp
service bootps
{
disable
flags
socket_type
protocol =udp
wait
user
server
server_args
}
2016-07-06
=no
=REUSE NAMEINARGS
=dgram
=yes
=root
=/usr/sbin/bootpd
=-s
- 62 -
www.hanback.co.kr
개발 환경 설치
tftp 환경 설정
•
/etc/xinetd.d/tftp
service tftp
{
disable
socket_type
protocol =udp
wait
user
server
server_args
}
2016-07-06
=no
=dgram
=yes
=root
=/usr/sbin/in.tftpd
=-s /tftpboot
- 63 -
www.hanback.co.kr
개발 환경 설치
nfs 환경 설정
•
/etc/exports
/nfs_resource
2016-07-06
192.168.123.200 (rw, no_root_squash)
- 64 -
www.hanback.co.kr
응용프로그램
2016-07-06
- 65 -
www.hanback.co.kr
응용 프로그램
컴파일 방법
–
–
크로스 컴파일 툴 체인이 설치한 후 기존의 Makefile안에서 컴파일 명령어 “xxx”를
arm-linux-xxx로 바꾸어 주면된다.
단순한 하나의 파일을 컴파일하기 위해선 “arm-linux-gcc –o hello hello.c” 사용할
수도 있다.
간단한 프로그램 작성
#include <stdio.h>
int main(void) {
printf(“Hello Embedded World\n”);
return 0;
}
2016-07-06
- 66 -
www.hanback.co.kr
응용 프로그램
hello.c 컴파일 방법
–
–
gcc –o hello hello.c (i386에서)
arm-linux-gcc –o hello hello.c (arm에서)
파일 타입
실행 파일을 파일 타입을 살펴 봄으로서 어뗜 CPU에서 동작되는지를 알수있다.
–
file ./hello
hello: ELF 32-bit LSB executable, ARM, version 1 (ARM),
for GNU/LINUX 2.4.19,Dynamically linked (used shared libs),
not stripped
2016-07-06
- 67 -
www.hanback.co.kr
응용 프로그램
mmap(), munmap() 함수
–
–
파일이나 장치 디바이스를 메모리에 메핑시키는 함수 즉 열린 파일 기술자를 통해
액세스되는 파일의 내용과 관련된 메모리의 구역에 대한 포인터를 생성한다.
mmap(), munmap()함수의 원형은 다음과 같다.
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t
offset)
int munmap(void *start, size_t length);
•start : 특정 메모리 어드레스를 요청하기위해서
•length : 메모리 세그먼트의 길이 설정
•offset : 파일 데이터의 시작을 변경
•fd : 파일 기술자
2016-07-06
- 68 -
www.hanback.co.kr
응용 프로그램
prot : 메모리 보호모드를 설정한다.
PROT_READ : 페이지 읽기 허락
PROT_WRITE : 페이지 쓰기 허락
PROT_EXEC : 페이지 실행
PROT_NONE : 페이지 접근 불가
Flags : 페이지에 가해지는 변경이 다른 곳에 반영되는 방법을 설정한다.
MAP_PRIVATE : 다른 프로세스와 대응 영역을 공유하지않는다.
MAP_FIXED : 지정된 주소 이외의 다른 주소를 선택하지 않는다.
MAP_SHARED: 객체에 대응 시키는 다른 프로세스와 대응 영역
을 공유한다.
2016-07-06
- 69 -
www.hanback.co.kr
응용 프로그램
응용 프로그램에서 I/O를 제어하기위한 방법
–
–
–
–
–
open 함수를 사용하여 열린 기술자 획득한다.
mmap()함수를 사용하여 제어할 I/O의 포인터 획득한다.
포인터에서 값을 읽거나 원하는 값을 쓴다.
munmap()함수를 사용하여 메모리 공간 해제한다.
close()함수를 이용하여 열린 기술자 반환한다.
fd = open(“/dev/mem”,O_RDWR);
addr = mmap(NULL,1,PROT_WRITE,MAP_SHARED,fd,ADDRESSOFLED);
addr = 0xaa;
munmap(addr,1);
close(fd)
2016-07-06
- 70 -
www.hanback.co.kr
응용 프로그램
응용 프로그램 분석
•
•
•
•
•
2016-07-06
“Hello world” 출력 프로그램
Led/button 제어 프로그램
웹을 통한 led출력 cgi프로그램
웹을 통한 7egment 출력 cgi 프로그램
웹을 통한 text LCD 출력 프로그램
- 71 -
www.hanback.co.kr
디바이스 드라이버
2016-07-06
- 72 -
www.hanback.co.kr
디바이스 드라이버
2016-07-06
- 73 -
www.hanback.co.kr
디바이스 드라이버
문자 디바이스(character device)
– 파일 시스템에서 노드 형태로 존재
– 대부분 순차적인 접근만을 허용
블록 디바이스(block device)
– 파일 시스템에서 노드 형태로 존재
– 버퍼를 이용하여 파일 시스템의 구축이 가능
– 대부분 정해진 크기의 블록 단위의 데이터 이동
네트워크 디바이스(network device)
– 파일 형태가 아닌 특별한 인터페이스 사용
– 스트림 기반이 아닌 패킷 단위의 접근
2016-07-06
- 74 -
www.hanback.co.kr
디바이스 드라이버
디바이스 파일(device file)
– 디바이스 드라이버를 접근하는 통로
– 장치 파일의 inode는 장치 유형(type),주번호(major number), 부번호
(minor number)로 구성된다.
디바이스 파일의 생성 : mknod
– Mknod /dev/file_name [c|b] major_number minor_number
주번호와 부번호
– 주번호 : 커널이 디바이스와 연관된 드라이버를 구분하는 데 사용
– 부번호 : 드라이버가 각 디바이스를 구분하는 데 이용
2016-07-06
- 75 -
www.hanback.co.kr
디바이스 드라이버
문자형 디바이스의 골격
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
Header Files
int device_open( … ) { … }
int device_release( … ) { … }
ssize_t device_write( … ) { … }
ssize_t device_read( … ) { … }
Function Prototypes
static struct file_operations device_fops = {
…
ssize_t (*read) (…);
ssize_t (*write) (…);
…
int (*open) (…);
int (*release) (…);
…
};
File Operation
int init_module(void) { … }
모듈 설치시 초기화 수행
void cleanup_module(void) { … }
모듈 제거시반환 작업수행
2016-07-06
- 76 -
www.hanback.co.kr
디바이스 드라이버
struct file_operations {
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char *, size_t,loff_t *);
int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *,struct poll_table_struct *);
int (*ioctl)(struct inode *,struct file *,unsigned int, unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *);
int (*release) (struct inode *, struct file *);
int (*fsync) (struct file *, struct dentry *, int datasync);
int (*fasync) (int, struct file *, int);
int (*lock) (struct file *, int, struct file_lock *);
ssize_t (*readv)(struct file *,const struct iovec *,unsigned long,loff_t *);
ssize_t (*writev)(struct file*,const struct iovec *,unsigned long,loff_t *);
ssize_t (*sendpage)(struct file *,struct page *, int, size_t, loff_t *,int);
unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned
long, unsigned long);
};
2016-07-06
- 77 -
www.hanback.co.kr
디바이스 드라이버
init_module()
– 디바이스 드라이버 등록
– 메모리 할당 및 초기화
cleanup_module()
– 디바이스 드라이버 제거
– 할당된 I/O메모리 영역 반환
open(), release()
– 디바이스 카운트 증가 및 감소
– usage 카운트 체크 및 증가 감소
read(), write(), ioctl(), …
– 디바이스 드라이버의 목적에 따른 일을 함
– 사용자 공간과 커널공간의 테이터 전송
– 메모리에 값을 쓰거나 읽음
2016-07-06
- 78 -
www.hanback.co.kr
디바이스 드라이버
포인터를 사용
– 포인터는 곧 번지이다.
– 포인터을 이용하여 값을 쓰는 방법
unsigned char *addr;
addr = (unsigned char *)(0xf1600000);
*addr = 0xaa;
포인터을 이용하여 값을 읽는 방법
unsigned char *addr;
char ch;
addr = (unsigned char *)(0xf1600000);
ch = *addr;
2016-07-06
- 79 -
www.hanback.co.kr
디바이스 드라이버
C에서 제공되는 함수를 사용
– 메모리로부터 값을 읽는 함수
• _u8 inb(unsigned int port);
• _u16 inw(unsigned int port);
• _u32 inl(unsigned int port);
– 메모리에 값을 쓰는 함수
• void outb(_u8 data, unsigned int port);
• void outw(_u16 data, unsigned int port);
• void outl(_u32 data, unsigned int port);
2016-07-06
- 80 -
www.hanback.co.kr
디바이스 드라이버
모듈에서 사용하는 테이터 전송함수
– get_user(void *x, const void *addr)
*addr의 값을 커널 영역인 x로 sizeof(addr)만큼 복사한다.
– put_user(void *x, const void *addr)
*x의 값을 user영역인 addr로 sizeof(addr)만큼 복사한다.
– copy_to_user(void *to, void *from, unsigned long size)
– copy_from_user(void *to, void *from, unsigned long size)
2016-07-06
- 81 -
www.hanback.co.kr
디바이스 드라이버
디바이스 드라이버를 컴파일 하기위해서는 일반 어플리케이션 컴파일 방법
에 약간의 옵션들을 추가 하면 된다.
1.
-
다음은 디바이스 드라이버를 컴파일하기위한 기본적인 과정이다
$ arm-linux-gcc -D__KERNEL__ -DMODULE
-I/working/kernel/linux-2.4.19/include -Wall -O2 –o
driver.o –c driver.c
__KERNEL__ : 헤더파일에게 이소스가 사용자 모드가 아닌커널
모드로에서 실행된다는 것을 알려준다.
- MODULE : 헤더 파일에게 이 코드가 모듈임을 알려준다.
2016-07-06
- 82 -
www.hanback.co.kr
디바이스 드라이버
디바이스 드라이버를 커널에 로딩하는 방법
$ insmod driver.o
디바이스 드라이버의 리스트를 보는 방법
$ lsmod
디바이스 드라이버를 커널에서 제거하는 방법
$ rmmod driver
디바이스 파일을 만드는 방법
$ mknod /dev/driver c 주번호 부번호
2016-07-06
- 83 -
www.hanback.co.kr
디바이스 드라이버
응용프로그램에서 디바이스 드라이버를 사용하는 방법
1. open함수를 이용하여 특수 장치 파일을 연다.
dev = open(“/dev/device”,O_WRONLY);
2. 디바이스 드라이버에서 제공하는 함수를 이용하여 디바이
스를 제어한다.
write(dev,&buff,1);
3. close함수를 이용하여 특수 장치 파일을 닫는다.
close(dev);
2016-07-06
- 84 -
www.hanback.co.kr
디바이스 드라이버
Hello 디바이스 드라이버
– Init_module(), cleanup_module()
• printk문을 이용하여 콘솔에 어떤 함수가 실행되는지 알려준다.
hello.c
#include <linux/module>
#include <linux/kernel.h>
#include <linux/init.h>
int init_module(void) {
printk(“Hello, Kernel!\n”);
}
void cleanup_module(void) {
printk(“Good-bye, Kernel!\n”);
}
2016-07-06
- 85 -
www.hanback.co.kr
디바이스 드라이버
Makefile
CC = arm-linux-gcc
KERNELDIR = /working/kernel/linux-2.4.19-rmk4-pax2-empx1
INCLUDEDIR = -I$(KERNELDIR)/include –I./
CFLAGS = -D__KERNEL__ -DMODULE –Wall –O2 –
I$(INCLUDEDIR)
MODULE_OBJS = hello.o
MODULE_SRCS = hello.c
$(MODULE_OBJS) :
$(CC) $(CFLAGS) –c $(MODULE_SRCS)
clean:
rm –f *.o
2016-07-06
- 86 -
www.hanback.co.kr
디바이스 드라이버
드라이버 컴파일
$make
드라이버 수행
$insmod hello.o
Using hello.o
Hello, Kernel!
$lsmod
Module
size Used by
hello
216 0 (unsed)
$rmmod hello
Good-bye, Kernel!
2016-07-06
- 87 -
www.hanback.co.kr
디바이스 드라이버
EMPOSII에 커널에(linux-2.4.19-rmk4-pax2empx1/arch/arm/mach-pax/empos_x255.x)설정된 디바이스의
가상 메모리 맵
static struct map_desc empos_x255_io_desc[] __initdata = {
/* virtual
physical
length
domain r w c b */
{0xf0000000, 0x00080000, 0x00040000, DOMAIN_IO, 0, 1, 0, 0},
/* empos status flash block*/
{0xf1000000, 0x10000000, 0x00010000, DOMAIN_IO, 0, 1, 0, 0 }, /* pcmcia status */
*/
{0xf1100000, 0x10100000, 0x00010000, DOMAIN_IO, 0, 1, 0, 0 }, /*nport */
{0xf1300000, 0x10300000, 0x00010000, DOMAIN_IO, 1, 1, 0, 0}, /*7 Segment */
{0xf1400000, 0x10400000, 0x00010000, DOMAIN_IO, 1, 1, 0, 0}, /*7 Segment */
{0xf1500000, 0x10500000, 0x00010000, DOMAIN_IO, 0, 1, 0, 0}, /*Push button */
{0xf1600000, 0x10600000, 0x00010000, DOMAIN_IO, 1, 1, 0, 0}, /* LED */
{0xf1700000, 0x10700000, 0x00010000, DOMAIN_IO, 1, 1, 0, 0}, /*Text LCD */
{0xf4000000, 0x04000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0},
/* Primary ETHERNET */
{ 0xf5000000, 0x08000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 },
/* Secondary ETHERNET */
LAST_DESC
};
2016-07-06
- 88 -
www.hanback.co.kr
디바이스 드라이버
EMPOSII의 LED의 회로 구성도 콘트롤 레지스터의 데이터 비트의 구조
2016-07-06
- 89 -
www.hanback.co.kr
디바이스 드라이버
프로그램 구조
– init_module(), cleanup_module()
• 디바이스 드라이버 등록 및 해제
• I/O 메모리 활당 및 해제
– open(), release()
• 디바이스 카운트 증가 및 감소
• usage 카운트에 따른 디바이스 접근 방식
– write()
• get_user()함수를 이용하여 사용자 공간의 데이터를 전송
• 전송 받은 데어터를 LED에 적용시킴
2016-07-06
- 90 -
www.hanback.co.kr
디바이스 드라이버
GPIO란
– General Purpose Input/Output pins으로 입력이나 출력으로 프그그램 되
거나 인터럽트 소스로 사용될 수 있다.
- GPIO 기능별 레지스터 정리
심벌
기능
GPLR
GPIO 포트 핀의 상태를 보여준다.
GPDR
GPIO 포트 핀의 방향을 설정한다.
GPSR
GPIO 포트 핀이 output일 때 해당 비트를 셋 한다.
GPCR
output 핀이 셋 된 것을 clear한다
GRER
GPIO 포트 핀이 input일 때 rising-edge를 감지한다.
GFER
GPIO 포트 핀이 input일 때 falling-edge를 감지한다.
GEDR
GRER이나 GFER로 설정된 값에 따른 결과를 설정한다.
GAFR
GPIO 핀을 alternate function로 전환한다.
2016-07-06
- 91 -
www.hanback.co.kr
디바이스 드라이버
- GPIO 레지스터 정리
Register
type
GPIO[31:0]
GPIO[63:32]
GPIO[84:64]
GPLR
GPLR0
GPLR1
GPLR2
GPSR
GPSR0
GPSR1
GPSR2
GPCR
GPCR0
GPCR1
GPCR2
GPDR
GPDR0
GPDR1
GPDR2
GRER
GRER0
GRER1
GRER2
GFER
GFER0
GFER1
GFER2
GEDR
GEDR0
GEDR1
GEDR2
GAFR
2016-07-06
GAFR0_U
GAFR0_L
GAFR1_U
- 92 -
GAFR1_L
GAFR2_U
GAFR2_L
www.hanback.co.kr
디바이스 드라이버
GPIO를 사용하기 위한 방법
1.
GPDR로 포트 핀의 방향 설정한다.
2.
포트 핀의 방향을 출력으로 설정했을 때는 GPSR로 해당 비트를 셋
하거나 GPCR로 셋된비트를 clear한다.
3. 포트 핀의 방향을 입력으로 설정했을 때는 GEDR로 해당 비트 값을
읽을 수 있다.
GPIO핀을 통해 인터럽트를 받는 방법
1.
request_irq()를 이용하여 자신만의 irq를 요청한다.
2.
Set_GPIO_IRQ_edge()를 이용하여 GPIO 포트번호와 감지할 상태
를 설정한다.
3.
Enable_irq로 인터럽트를 활성화 시킨다.
4.
모든 사용이 끝났을 때 disable_irq()와 free_irq()를 사용하여 irq를
제거한다.
2016-07-06
- 93 -
www.hanback.co.kr
디바이스 드라이버
– 다음은 EMPOS II에서 사용하고 있는 GPIO의 일부분.
2016-07-06
- 94 -
www.hanback.co.kr
디바이스 드라이버
프로그램 구조
– init_module(), cleanup_module()
• 디바이스 드라이버 등록 및 해제
– open(), release()
• 디바이스 카운트 증가 및 감소
• GPIO인터럽트 등록 및 해제
– read()
• interrupt_sleep_on()함수를 이용하여 인터럽트가 발생하기까지 기
다린 후 데이터를 복사하여 응용 프로그램에 전달.
– button_interrupt()
• 인터럽트가 발생하면 이 함수가 실행
• wake_up_interruptible()함수를 사용하여 자고 있는
interrupt_sleep_on() 함수를 깨운다.
2016-07-06
- 95 -
www.hanback.co.kr
디바이스 드라이버
TextLCD 디바이스
IOCTL()함수
– 읽기/쓰기외의 부가적인 연산을 위한 인터페이스
• 디바이스 설정및 하드웨어 제어
– 함수 호출
• Int ioctl(int fd, int cmd, …);
– fd : 파일 기술자
– cmd : 명령 번호
– … : 명령에 따른 인수
명령 번호
– 시스템에서 유일한 번호
– 정의 메크로
_IO(base,command) : 데이터 이동이 없다.
_IOR(base,command) : 커널에서 응용 프로그램으로 데이터 이동
_IOW(base,command) : 응용 프로그램에서 커널로 데이터 이동
_IOWR(base,command) : 양방향 데이터 이동
2016-07-06
- 96 -
www.hanback.co.kr
디바이스 드라이버
디바이스 드라이버에서 ioctl 사용방법
– 함수 선언
• int (*ioctl)(struct inode *inode,struct file *file,unsigned int
cmd, unsigned long gdata);
– cmd : 명령 번호
– gdata : 함수 호출시 넘겨 받는 인수
– 함수 구현
switch(cmd) {
case: TEXTLCD_COMMAMD_SET:
...
break;
case: TEXTLCD_FUNCTION_SET:
...
break;
…
}
2016-07-06
- 97 -
www.hanback.co.kr
디바이스 드라이버
Text lcd모듈은 8bit 마이크로프로세서가 내장되어 있고 2개의 레
지스터가 존재한다.
– Text Lcd레지스터들
Instruction Register(IR)
Text lcd 모듈의 환경설정.
Data Register(DR)
Text lcd 모듈에 글자를 표시하기 위한 데이터 값
값이 들어가는 레지스터.
– 텍스트 lcd를 사용하기 위해서는 Instruction Register(IR)에 명령을 셋하고
Data Register(DR)에 표시하고자 하는 데이터 값을 쓰면 된다.
– Text lcd 모듈에서 데이터 라인이 8비트이고 제어 비트가 3비트 이므로 디바이
스 드라이버에서는 하위 8비트는 데이터라인으로 묶고 상위 3비트는 제어라인
으로 사용한다.
2016-07-06
- 98 -
www.hanback.co.kr
디바이스 드라이버
- 텍스트 LCD모듈의 제어 명령표
제어 신호
Executed
Time
제어 명령
기능
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1.64mS
Clear Display
0
0
0
0
0
0
0
0
0
1
1.64mS
Return Home
0
0
0
0
0
0
0
0
1
0
40uS
Entry Mode Set
0
0
0
0
0
0
0
1
I/D
S
40uS
Display on/off Control
0
0
0
0
0
0
1
D
C
S
40uS
Cursor or Display Shift
0
0
0
0
0
1
S/
C
R/
L
0
0
40uS
Function Set
0
0
0
0
1
D/
L
N
F
0
0
40uS
Set CG RAM Address
0
0
0
1
Set DD RAM Address
0
0
1
DD RAM Address
40uS
Read Busy Flag and
Address
0
1
BF
Address Counter
40uS
Data Write to CG RAM
or DD RAM
1
0
Write Address
40uS
Data Read to CG RAM
or DD RAM
1
1
Read Address
40uS
2016-07-06
CG RAM Address
- 99 -
40uS
www.hanback.co.kr
디바이스 드라이버
- Text LCD의 Write 타이밍도
2016-07-06
- 100 -
www.hanback.co.kr
디바이스 드라이버
Text LCD모듈의 초기화하는 방법
–
Function Set(이진수:001x xx00)을 보낸다.
–
Display ON/OFF Control(0000 1xxx)을 보낸다.
–
Entry Mode Set(0000 01xx)을 보낸다.
–
DD RAM 주소를 보낸다.
–
문자 데이터를 연속으로 보낸다.
제어 비트 RS, R/W, E는 Text lcd 타이밍도를 맞추어 제어해 준다.
2016-07-06
- 101 -
www.hanback.co.kr
디바이스 드라이버
프로그램 구조
– init_module(), cleanup_module()
• 디바이스 드라이버 등록 및 해제
• I/O 메모리 활당 및 해제
– open(), release()
• 디바이스 카운트 증가 및 감소
• usage 카운트에 따른 디바이스 접근 방식
– write()
• copy_from_user()를 이용하여 사용자 공간의 데이터를 전송
• 전송 받은 데어터를 Text Lcd에 적용시킴
– Ioctl()
• 명령에 따른 Text Lcd 제어
2016-07-06
- 102 -
www.hanback.co.kr
참고문헌
•
•
•
•
•
•
•
Intel PXA255 Processor Develper’s Manual
Hanback Electronics EMPOS II SW/HW Manual
Understanding the Linux KERNEL
ARM Architecture Reference Manual
Unix 시스템 프로그래밍
Beginning Linux Programming
Add-on Linux Kernel
2016-07-06
- 103 -
www.hanback.co.kr