mmap - 네트워크

Download Report

Transcript mmap - 네트워크

응용프로그램 IO Control
네트워크 프로그래밍
http://network.hanbat.ac.kr

응용 프로그램에서 특정번지 액세스


pointer 변수를 이용하여 해당 주소의 address에 원하는 데이터를 write하
는 programming
예제) 물리 주소: 0x1060 0000(LED), 데이터: 0x00
unsigned char *ptr;
ptr = 0x1060 0000 /* register physical address */
*ptr = 0x00 /* write data value to register */

오류 발생: Linux kernel에서 물리적 접근을 허가하지 않음


가상주소를 사용
가상주소(Virtual address)

실제 존재하는 물리 주소가 아니라, Linux kernel 내부에서 일정한 단계를
거쳐 논리적으로 계산된 다른 주소체제
2
mmap()을 이용한 I/O Control

메모리 장치 디바이스


응용 프로그램에서 특정 physical address에 접근


/dev/mem : 시스템의 memory 공간에 접근할 수 있는 장치파일
메모리 장치 디바이스를 통한 mmap() 함수 이용
mmap 함수

파일이나 디바이스를 응용프로그램의 주소 공간 메모리에 대응시킴
void *mmap (void *start, size_t length, int prot, int flags, int fd, off_t offset);
3
mmap()을 이용한 I/O Control
void *mmap (void *start, size_t length, int prot, int flags, int fd, off_t offset);
Process address space
fd
(memory device)
start
length
offset
length
4
mmap() function

mmap 함수의 원형
void *mmap (void *start, size_t length, int prot, int flags, int fd, off_t
offset);

Arguments


start: 특정 주소로 매핑, 일반적으로 NULL로 설정
length: 맵핑시킬 메모리 영역의 길이


system의 page size (가상메모리의 분할단위)
prot: 액세스 허용 권한 설정




PROT_EXEC: 실행 가능한 페이지
PROT_READ: 읽기 가능한 페이지
PROT_WRITE: 쓰기 가능한 페이지
PROT_NONE: 접근할 수 없는 페이지
5
mmap() function
void *mmap (void *start, size_t length, int prot, int flags, int fd, off_t
offset);

Arguments

flags: 맵핑 유형과 동작 구성 요소





MAP_FIXED: 특정한 mapping 위치로 고정
MAP_SHARED: 다른 프로세스와 mapping 영역의 공유가 가능
MAP_PRIVATE: 맵핑을 공유하지 않음
fd: 파일 기술자 (메모리 디바이스)
offset:

mapping 대상의 시작 위치를 제시하며, mapping 대상의 내용 가운데 이
지점부터 memory 를 mapping
6
munmap() function


mmap 함수와 함께 쓰며, mmap으로 메핑된 메모리를 반환
munmap 함수 원형
int munmap (void *start, size_t length);

mmap 함수를 사용하는 방법





open() 함수를 사용하여 열린 file descriptor를 획득한다.
mmap() 함수를 사용하여 제어할 I/O의 pointer 획득한다.
pointer에서 값을 읽거나 원하는 값을 쓴다.
munmap() 함수를 사용하여 memory 공간 해제한다.
close() 함수를 이용하여 열린 descriptor를 반환한다.
7
Example of mmap()

Program example (test_led.c)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#define LED_ADDR 0x10600000
int main(void)
{
int fd;
unsigned char *led_addr;
if((fd=open(“/dev/mem”, O_RDWR|O_SYNC))<0)
{
perror(“mem open fail\n”);
exit(1);
}
led_addr = mmap(NULL, 1, PROT_WRITE, MAP_SHARED, fd, LED_ADDR);
if(led_addr <0)
{
close(fd);
exit(0);
}
*led_addr = 0x00;
munmap(led_addr, 1);
close(fd);
}
8
munmap() usage

munmap()



형식




mmap()과 pair 함수
Memory mapping을 해제하는 기능
#include <unistd.h>
#include <sys/mman.h>
int munmap (void *start, size_t length);
Argument



Start: mmap()에서 반환했던 가상주소를 대입 함으로서, 해제할 mapping
영역을 공지
Length: 해제할 때 영역의 길이
munmap() Return value


Success: return (0)
Fail: return (-1)
9
가상 주소 액세스 : mmap()

응용 프로그램 코드에서 memory mapping을 구현하는 방법은
“mmap( )” 함수 호출




mmap() 함수는 파라메터(argument)에서 제공된 특정 대상 메모리에
mapping한 후에 mapping 된 지점에 해당되는 가상주소를 반환하는 함수
mmap()이 호출되면, 프로그램 제어권이 Linux kernel로 이관, Linux
kernel은 내부적으로 mmap() 함수 인자를 해석하여 mapping 영역을 설정
하고 그 위치에 해당하는 가상주소를 계산하여 mmap() 리턴값으로 반환
반환된 가상주소에 pointer 변수에 대입
“start” argument



mapping 영역이 시작되길 원하는 위치를 의미하며, 통산 null 혹은 0값으로
대입을 권고
0값이 아닌 경우 flag 인자가 MAP_FIXED 일때 mapping 영역의 시작 위치
가 이 값이 되도록 커널에서 강제적으로 요청할 경우에 사용
일반적으로 mapping 의 시작 위치는 자동적으로 비어 있는 영역을 커널로
선택하도록 하는 것이 안전하므로 null 혹은 0값으로 대입
10
munmap() usage

munmap() 실행에 따른 오류 반환값






EBADF: fd가 유효한 파일 기술자가 아니다. 즉 MAP_ANONYMOUS가 설정
되어 있지 않다.
EACCES: MAP_PRIVATE가 설정되었지만, fd가 읽을 수 있도록 열려있지 않
다. 또는 MAP_SHARED와 PROT_WRITE가 설정되었지만, fd가 쓸 수 있도
록 열려있지 않다.
EINVAL: start나 length나 offset가 적당하지 않다. 즉 너무 크거나
PAGESIZE 경계로 정렬되어 있지 않다.
ETXTBUSY: MAP_DENYWRITE가 설정되었으나, fd로 지정된 객체가 쓰기
위해 열려있다.
EAGAIN: 파일이 잠겨있거나, 너무 많은 memory가 잠겨있다.
ENOMEN: 사용할 수 있는 메모리가 없다.
11