일신우일신 - 日新又日新 - Getting Better Everyday

기술 노트

리눅스 [리눅스]시스템 메모리 가로채기

2003.08.13 21:43

남수혁 조회 수:33525 추천:59

리눅스 부팅시에 커널옵션으로 "mem=xxx"를 사용하면 시스템 메모리를 가로챌 수 있다.
예를들어, 시스템 메모리가 512MB이고 GRUB 설정이 다음과 같을 때,

title Redhat Linux(Kernel 2.4.21)
root (hd0, 0)
kernel /boot/vmlinuz-2.4.21 ro root=/dev/hda1 mem=500M

리눅스 커널은 시스템 메모리의 하위 500MB만 사용하고 그 위쪽의 12M를 버려둔다.
다시말해, 커널로부터 12MB의 시스템 메모리를 가로채게 되는 것이다.

이 메모리를 사용자 공간(User Space)에서 프로세스간 공유메모리 등으로 사용하려면
mmap 함수를 이용하여 다음과 같이 한다.


#define MEM_START (500*0x100000) /* 500MB */
#define MEM_SIZE (12*0x100000) /* 12MB */

void main()
{
int fd = open( "/dev/mem", O_RDWR );
if ( fd < 0 ) return -1;
char *memp = (char *)mmap(0, MEM_SIZE, PROT_READ|PROT_WRITE,
MAP_FILE|MAP_SHARED, fd, MEM_START );
if ( memp )
{
printf( "Ok!\n" );
/* do something... */
}
munmap( memp, MEM_SIZE );
close( fd );
}

또한, 이 메모리를 디바이스 드라이버 등과 같이 커널공간에서 사용하려면
ioremap 함수를 사용하여 다음과 같이 한다.

참고로, 커널공간에서 할당할 수 있는 연속적인 메모리(contiguous memory)의 최대 크기는
통상 32 * PAGE_SIZE(x86에서는 4KB) = 128K, 최근 커널(2.4?)에서는 좀 더 확장하여
512*PAGE_SIZE = 2MB 이다. 그런데, 프레임그레버 등과 같이 이보다 더 큰 대용량의
DMA 전송버퍼를 필요로 하는 경우에는 아래의 방법이 유용할 수 있다.

#define MEM_START (500*0x100000) /* 500MB */
#define MEM_SIZE (12*0x100000) /* 12MB */

static char *s_dmabuf = 0;

int __init sample_init()
{
...
s_dmabuf = ioremap( MEM_START, MEM_SIZE );
...
}

int __exit sample_exit()
{
...
iounmap( s_dmabuf );
...
}
번호 제목 글쓴이 조회 수 추천 수 날짜
29 윈도우 PowerShell 에서 벨 소리 끄기 남수혁 111 0 2018.01.27
28 Windows 8.1 홈그룹 및 라이브러리 폴더 제거/복구 방법 file 남수혁 10985 0 2014.01.01
27 Windows 7 절전모드 진입 후 바로 재부팅되는 문제 file 남수혁 20035 0 2012.05.21
26 Outlook 2010 메일계정 설정 백업/복원 남수혁 29491 1 2012.01.02
25 Outlook 프로그램을 시작하지 못할 때... 남수혁 23718 0 2010.01.27
24 HID Non-User Input Data Filter 설치 오류 [5] 남수혁 29975 5 2009.07.29
23 Vista/Windows 7/8/8.1에서 관리용 공유 드라이브 사용 방법 [1] file 남수혁 23867 1 2009.04.14
22 ClearType 글꼴 가독성 개선 방법 남수혁 22737 2 2009.02.08
21 리눅스에서 윈도우 TTF 폰트 사용하기 남수혁 22002 0 2008.10.12
20 리눅스에서 euc-kr과 utf-8 파일명 인코딩 변환 남수혁 32488 0 2008.10.03
19 Microsoft Excel DDE Tips file 남수혁 25977 1 2008.09.13
18 MSI 파일 압축해제 방법 남수혁 32083 1 2008.09.04
17 [윈도우]윈도우 쉘 바꾸기 남수혁 26214 40 2005.09.05
16 Samba와 Firewall(lokkit) 남수혁 24825 57 2005.08.01
15 [리눅스]아파치에서 한글이 나오도록... 남수혁 20720 64 2004.08.24
14 [리눅스]하나의 랜카드에 복수의 IP를 할당하는 방법 남수혁 23321 62 2004.03.19
13 Visual C++ 지워도 되는 파일들 / 파일 확장자별 설명 남수혁 46261 58 2003.11.24
12 리눅스 커널 온라인 레퍼런스 [1] 이철성 20659 61 2003.10.17
» [리눅스]시스템 메모리 가로채기 남수혁 33525 59 2003.08.13
10 소스 코드를 HTML로 변환시켜 주는 webcpp file 이철성 18018 66 2003.03.07