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