메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

Linux 커널로부터의 사용자 공간 메모리 액세스

Linux 메모리와 사용자 공간 API에 대한 소개

M. Tim Jones, Consultant Engineer, Independent author
M. Tim Jones
M. Tim Jones is an embedded firmware architect and the author of Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (now in its second edition), AI Application Programming (in its second edition), and BSD Sockets Programming from a Multilanguage Perspective. His engineering background ranges from the development of kernels for geosynchronous spacecraft to embedded systems architecture and networking protocols development. Tim is a platform architect with Intel and author in Longmont, Colo.

요약:  커널과 사용자 공간이 서로 다른 가상 주소 공간에 존재하기 때문에 이들 사이에서 데이터를 이동할 때는 특별한 고려사항이 있습니다. 가상 주소 공간 뒤에 숨겨진 개념과 사용자 공간으로(부터) 데이터를 이동하는 데 필요한 커널 API에 대해 살펴보고 메모리를 맵핑하는 데 사용되는 기타 맵핑 기술 중 일부에 대해 알아봅니다.

원문 게재일:  2010 년 8 월 11 일 번역 게재일:   2011 년 3 월 15 일
난이도:  중급 원문:  보기 PDF:  A4 and Letter (81KB | 11 pages)Get Adobe® Reader®
페이지뷰:  2886 회
의견:  


Tim과 연락하기

Tim은 developerWorks의 가장 유명한 다작 저자 중 한 명이다. developerWorks에 실린 Tim의 모든 기사를 살펴보자. Tim의 프로파일을 확인하고 Tim과 다른 저자 및 My developerWorks의 동료 독자와 연락을 해보자.

Linux®에서는 주소지정 가능한 최소 메모리 단위가 바이트이지만 메모리의 관리된 개념 역할을 하는 것은 페이지이다. 이 기사는 Linux에서의 메모리 관리에 대한 토론으로 시작한 후 커널로부터의 사용자 주소 공간 조작을 위한 방법에 대해 살펴본다.

Linux 메모리

Linux에서는 사용자 메모리와 커널 메모리가 독립적이며 별도 주소 공간에서 구현된다. 주소 공간은 가상화된다. 즉, 주소는 간단하게 설명된 프로세스를 통해 실제 메모리에서 추상화된다. 주소 공간은 가상화되기 때문에 다수의 주소 공간이 존재할 수 있다. 실제로 커널 자체도 하나의 주소 공간에 상주하며 각 프로세스도 자체 주소 공간에 상주한다. 이러한 주소 공간은 가상 메모리 주소로 구성되어 있어 독립적인 주소 공간을 가진 다수의 프로세스가 상당히 적은 실제 주소 공간(시스템의 실제 메모리)을 참조하도록 할 수 있다. 이를 통해 각 주소 공간은 독립되어 분리되기 때문에 안전성이 보장되므로 이는 편리할 뿐만 아니라 안전하기도 하다.

하지만 이러한 보안과 관련된 비용이 지출된다. 각 프로세스(및 커널)는 실제 메모리의 서로 다른 영역을 참조하는 동일한 주소를 가질 수 있기 때문에 메모리를 즉시 공유할 수 없게 된다. 다행히도 몇 가지 해결 방법이 있다. 사용자 프로세스는 POSIX(Portable Operating System Interface for UNIX®) 공유 메모리 메커니즘(shmem)을 통해 메모리를 공유할 수 있지만 각 프로세스가 실제 메모리의 동일한 영역을 참조하는 서로 다른 가상 주소를 가질 수 있다는 주의사항이 있다.

실제 메모리에 대한 가상 메모리 맵핑은 페이지 테이블을 통해 발생하며 이는 기본 하드웨어에서 구현된다(그림 1 참조). 하드웨어 자체에서 맵핑을 제공하지만 커널이 테이블 및 해당 구성을 관리한다. 여기서 설명한 것과 같이 프로세스는 큰 주소 공간을 가질 수 있지만 밀도가 낮다는 것에 유의한다. 즉, 주소 공간의 작은 영역(페이지)이 페이지 테이블에서 실제 메모리를 참조한다. 이를 통해 프로세스가 특정 시점에 필요한 페이지를 위해서만 정의되는 대용량 주소 공간을 가질 수 있다.


그림 1. 페이지 테이블이 가상 주소에서 실제 주소로의 맵핑을 제공함
페이지 테이블이 가상 주소에서 실제 주소로의 맵핑을 제공함

프로세스에 대해 메모리를 낮은 밀도로 정의할 수 있다는 것은 기본적인 실제 메모리가 과도하게 커미트될 수 있음을 의미한다. 페이징(Linux에서는 일반적으로 스왑이라고 함)이라는 프로세스를 통해 사용 빈도가 적은 페이지가 속도가 느린 스토리지 디바이스(예: 디스크)로 동적으로 이동하여 액세스가 필요한 다른 페이지를 수용한다(그림 2 참조). 이 동작을 통해 실제 메모리의 활용도를 높이기 위해 필요성이 적은 페이지를 마이그레이션하는 중에 애플리케이션에 더 필요한 페이지를 컴퓨터의 실제 메모리에서 제공할 수 있다. 일부 페이지는 파일을 참조할 수 있다는 것에 유의한다. 이 경우에는 페이지가 더티 페이지인 경우 페이지 캐시를 통해 데이터가 비워지고 페이지가 정리된 페이지인 경우 단순히 데이터가 삭제된다.


그림 2. 스왑을 사용하면 사용 빈도가 적은 페이지를 더 느리고 비용이 적게 드는 스토리지에 마이그레이션하여 실제 메모리 공간의 활용도를 높일 수 있음
스왑을 사용하면 사용 빈도가 적은 페이지를 더 느리고 비용이     적게 드는 스토리지에 마이그레이션하여 실제 메모리 공간의 활용도를 높일 수 있음

MMU가 없는 아키텍처

모든 프로세서에 MMU가 있는 것은 아니다. 따라서 uClinux 배포판(마이크로 컨트롤러 Linux)에서는 오퍼레이션의 단일 주소 공간을 지원한다. 이 아키텍처에서는 MMU에서 제공하는 보호가 제공되지 않지만 Linux가 프로세서의 또다른 클래스에서 실행될 수 있도록 한다. uClinux에 대한 정보는 참고자료 섹션을 참조한다.

스토리지에 스왑하기 위해 페이지를 선택하는 데 사용되는 프로세스는 페이지 대체 알고리즘이라고 하며 다수의 알고리즘(예: 사용한지 가장 오래된 알고리즘)을 사용하여 구현될 수 있다. 이 프로세스는 페이지가 메모리에 없는 메모리 위치가 요청될 때 발생한다(MMU(Memory Management Unit)에 맵핑이 없음). 이 이벤트는 페이지 결함이라고 하며 하드웨어(MMU)에 의해 발견되어 페이지 결함 인터럽트 발생 후 펌웨어에 의해 관리된다. 이 스택에 대한 설명은 그림 3을 참조한다.

Linux에서는 유용한 특성을 제공하는 흥미로운 스왑의 구현을 제공한다. Linux 스왑 시스템을 사용하면 다중 스왑 파티션 및 우선순위를 작성하고 사용할 수 있어 여러 성능 특성을 제공하는 스토리지 디바이스를 통해 스왑의 계층을 사용할 수 있다(예: SSD(Solid-State Disk)에 대한 첫 번째 레벨 스왑과 더 느린 스토리지 디바이스에 대한 더 큰 두 번째 레벨 스왑). SSD 스왑에 더 높은 우선순위를 연결하면 소진될 때까지 사용할 수 있으며 소진된 경우에만 페이지가 우선순위가 낮은(더 느린) 스왑 파티션에 기록된다.


그림 3. 가상 주소 대 실제 주소 맵핑의 주소 공간 및 요소
가상 주소 대 실제 주소 맵핑

모든 페이지가 스왑의 대상인 것은 아니다. 페이지 테이블 및 스왑 논리를 관리하는 인터럽트 또는 코드에 응답하는 커널 코드를 생각해 본다. 이들은 스왑되어서는 안 되는 명백한 페이지이기 때문에 고정되거나 메모리에 영구적으로 상주한다. 커널 페이지는 스와핑 대상이 아니더라도 사용자 공간 페이지는 스와핑 대상 이다. 하지만 사용자 공간 페이지는 mlock(또는 mlockall) 함수를 통해 고정되어 페이지를 잠글 수 있다. 이것이 사용자 공간 메모리 액세스 함수 뒤에 숨겨진 목적이다. 커널에서 사용자가 전달한 주소가 올바르고 액세스 가능하다고 가정한 경우에는 예를 들어, 사용자 페이지가 스왑되어 커널에서 페이지 결함이 발생하기 때문에 결과적으로 커널 패닉이 발생한다. 이 API(Application Programming Interface)를 사용하면 극한 상황을 적절하게 처리할 수 있다.


커널 API

이제 사용자 메모리를 조작하는 데 필요한 커널 API에 대해 살펴본다. 여기서는 커널과 사용자 공간 인터페이스에 대해 다루지만 다음 섹션에서는 기타 메모리 API 중 일부에 대해 살펴본다. 살펴볼 사용자 공간 메모리 액세스 함수가 표 1에 나열되어 있다.


표 1. 사용자 공간 메모리 액세스 API
함수설명
access_ok사용자 공간 메모리 포인터의 유효성을 검사함
get_user사용자 공간에서 단순 변수를 가져옴
put_user단순 변수를 사용자 공간에 추가함
clear_user사용자 공간의 블록을 지우거나 0으로 만듬
copy_to_user데이터 블록을 커널에서 사용자 공간으로 복사함
copy_from_user데이터 블록을 사용자 공간에서 커널로 복사함
strnlen_user사용자 공간의 문자열 버퍼 크기를 가져옴
strncpy_from_user문자열을 사용자 공간에서 커널로 복사함

예상한 대로 이러한 함수의 구현은 아키텍처에 종속될 수 있다. x86 아키텍처의 경우 ./linux/arch/x86/lib/usercopy_32.c 및 usercopy_64.c에 있는 소스와 함께 ./linux/arch/x86/include/asm/uaccess.h에 정의된 이러한 함수 및 기호를 찾을 수 있다.

데이터 이동 함수의 역할은 그림 4와 같이 복사에 관련된 유형과 관계가 있다(단순 대 집계).


그림 4. 사용자 공간 메모리 액세스 API를 사용한 데이터 이동
사용자 공간 메모리 액세스 API를 사용한 데이터 이동

access_ok 함수

access_ok 함수는 액세스하려는 사용자 공간에 있는 포인터의 유효성을 검사하는 데 사용된다. 호출자는 데이터 블록의 시작, 블록의 크기 및 액세스 유형(영역이 읽기와 쓰기 중 어느 것을 위한 것인지에 관계없음)을 참조하는 포인터를 제공한다. 함수 프로토타입은 다음과 같이 정의된다.

access_ok( type, addr, size );

type 인수는 VERIFY_READ 또는 VERIFY_WRITE로 지정될 수 있다. VERIFY_WRITE 기호는 메모리 영역이 읽기 또는 쓰기 가능한지도 식별한다. 영역이 액세스 가능할 경우에는 액세스 결과 여전히 -EFAULT가 발생하더라도 이 함수는 0이 아닌 값을 리턴한다. 이 함수는 단순히 주소가 커널에 있지 않고 사용자 공간에 있을 수 있는지 검사한다.

get_user 함수

사용자 공간에서 단순 변수를 읽으려면 get_user 함수를 사용한다. 이 함수는 charint와 같은 단순 유형에 사용되지만 구조와 같이 더 큰 데이터 유형에서는 copy_from_user 함수를 대신 사용해야 한다. 프로토타입은 읽기 오퍼레이션에 대해 사용자 공간에서 주소와 변수(데이터를 저장함)를 허용한다.

get_user( x, ptr );

get_user 함수는 두 가지 내부 함수 중 하나에 맵핑된다. 내부적으로 이 함수는 결과를 저장하기 위해 제공된 변수를 기반으로 액세스 중인 변수의 크기를 판별하고 __get_user_x를 통해 내부 호출을 형성한다. 이 함수는 성공 시 0을 리턴한다. 일반적으로 get_userput_user 함수는 블록 사본보다 빠르므로 작은 유형이 이동되는 경우에는 사용되어야 한다.

put_user 함수

put_user 함수는 커널의 단순 변수를 사용자 공간에 기록하는 데 사용된다. get_user와 마찬가지로 이 함수도 기록할 값이 포함된 변수와 사용자 공간 주소를 기록 대상으로 허용한다.

put_user( x, ptr );

get_user와 마찬가지로 put_user 함수는 put_user_x 함수 위에 내부적으로 맵핑되며 성공 시에는 0을 리턴하고 오류 발생 시에는 -EFAULT를 리턴한다.

clear_user 함수

clear_user 함수는 사용자 공간의 메모리 블록을 0으로 만드는 데 사용된다. 이 함수는 사용자 공간 및 크기의 포인터를 0(바이트로 정의됨)으로 만든다.

clear_user( ptr, n );

내부적으로 clear_user 함수는 먼저 access_ok를 통해 사용자 공간 포인터가 쓰기 가능한지 확인한 후 인라인 어셈블리에 코딩된 내부 함수를 호출하여 지우기 오퍼레이션을 수행한다. 이 함수는 반복 접두부가 포함된 문자열 명령어를 사용하여 매우 빡빡한 루프로 최적화된다. 이 함수는 오퍼레이션에 성공했을 때 지울 수 없거나 0이 아니었던 바이트 수를 리턴한다.

copy_to_user 함수

copy_to_user 함수는 데이터 블록을 커널에서 사용자 공간으로 복사한다. 이 함수는 사용자 공간 버퍼에 대한 포인터, 커널 버퍼에 대한 포인터 및 바이트로 정의된 길이를 허용한다. 이 함수는 성공 시에는 0을 리턴하고 실패 시에는 전송되지 않은 바이트 수를 나타내는 0이 아닌 숫자를 리턴한다.

copy_to_user( to, from, n );

access_ok를 통해 사용자 버퍼에 쓸 수 있는 기능을 확인한 후 내부 함수 __copy_to_user가 호출되며 이 함수는 다시 ./linux/arch/x86/include/asm/uaccess_XX.h(여기서 XX는 아키텍처에 따라 32 또는 64임)에 있는 __copy_from_user_inatomic을 호출한다. 1, 2 또는 4바이트 사본 중 어느 것을 수행할지 판별한 후 이 함수는 마지막으로 __copy_to_user_ll(실제 작업이 수행되는 위치임)을 호출한다. 감시 모드에서 WP 비트가 준수되지 않은 i486 이전에 손상된 하드웨어에서 페이지 테이블은 언제든지 변경될 수 있기 때문에 주소지정하는 중에 원하는 페이지를 스왑하지 않도록 해당 페이지를 메모리에 고정해야 했다. i486 이후에는 이 프로세스가 최적화된 사본에 불과하게 되었다.

copy_from_user 함수

copy_from_user 함수는 데이터 블록을 사용자 공간에서 커널 버퍼로 복사한다. 이 함수는 커널 공간의 대상 버퍼, 사용자 공간의 소스 버퍼 및 바이트로 정의된 길이를 허용한다. copy_to_user와 마찬가지로 이 함수는 성공 시에는 0을 리턴하고 실패 시에는 복사에 실패한 바이트 수를 나타내는 0이 아닌 수를 리턴한다.

copy_from_user( to, from, n );

이 함수는 access_ok를 통해 사용자 공간의 소스 버퍼에서 읽을 수 있는 기능을 확인한 후 __copy_from_user를 호출하고 마지막으로 __copy_from_user_ll을 호출한다. 여기서 아키텍처에 따라 사용 불가능한 바이트를 0으로 만들어 사용자 버퍼에서 커널 버퍼로 복사하기 위한 호출이 작성된다. 최적화된 어셈블리 함수에는 관리 기능이 포함된다.

strnlen_user 함수

strnlen_user 함수는 strnlen처럼 사용되지만 사용자 공간에서 버퍼를 사용할 수 있다고 가정한다. strnlen_user 함수는 확인할 최대 길이와 사용자 공간 버퍼 주소라는 두 가지 인수를 사용한다.

strnlen_user( src, n );

strnlen_user 함수는 먼저 access_ok에 대한 호출을 통해 사용자 버퍼가 읽기 가능한지 확인한다. 액세스 가능한 경우에는 strlen 함수가 호출되고 max length 인수는 무시된다.

strncpy_from_user 함수

strncpy_from_user 함수는 사용자 공간 소스 주소 및 최대 길이가 제공되는 경우 문자열을 사용자 공간에서 커널 버퍼로 복사한다.

strncpy_from_user( dest, src, n );

사용자 공간의 사본으로서 이 함수는 먼저 access_ok를 통해 버퍼를 읽을 수 있는지 확인한다. copy_from_user와 비슷하게 이 함수는 ./linux/arch/x86/lib/usercopy_XX.c에 있는 최적화된 어셈블리 함수로 구현된다.


메모리 맵핑을 위한 기타 스키마

이전 섹션에서는 오퍼레이션을 시작하는 커널을 사용하여 커널과 사용자 공간 사이에서 데이터를 이동하는 데 필요한 방법에 대해 살펴봤다. Linux에서는 커널과 사용자 공간 모두에서 데이터 이동에 사용할 수 있는 다수의 다른 방법을 제공한다. 이러한 방법은 사용자 공간 메모리 액세스 함수에 의해 설명된 것과 같이 동일한 기능을 제공하지 않아도 되지만 주소 공간 사이에서 메모리를 맵핑하는 기능은 비슷하다.

사용자 공간에서는 사용자 프로세스가 별도 주소 공간에 표시되기 때문에 이들 사이의 데이터 이동은 일정 유형의 프로세스 간 통신 메커니즘을 통해 수행되어야 한다는 점에 유의한다. Linux에서는 메시지 큐와 같은 다양한 스키마를 제공하지만 가장 주목할 만한 것은 POSIX 공유 메모리(shmem)이다. 이 메커니즘을 사용하면 프로세스에서 메모리의 영역을 작성한 후 이 영역을 하나 이상의 프로세스와 공유할 수 있다. 각 프로세스는 공유 메모리 영역을 각각의 주소 영역에 있는 다른 주소에 맵핑할 수 있다는 것에 유의한다. 따라서 상대적인 오프셋 주소 지정이 필요하다.

mmap 함수를 사용하면 사용자 공간 애플리케이션이 가상 주소 공간에서 맵핑을 작성할 수 있다. 이 기능은 성능을 위해 특정 디바이스 드라이버의 클래스에서 일반적인 기능으로 실제 디바이스 메모리를 프로세스의 가상 주소 공간에 맵핑할 수 있게 한다. 드라이버에서 mmap 함수는 사용자 주소 공간에 대한 디바이스 메모리의 선형 맵핑을 제공하는 remap_pfn_range 커널 함수를 통해 구현된다.


추가 주제

이 기사에서는 Linux에서의 메모리 관리 주제에 대해 살펴보면서 페이징 뒤에 숨겨진 내용에 대해 알아본 후 이러한 개념을 사용하는 사용자 공간 메모리 액세스 함수에 대해 살펴봤다. 사용자 공간과 커널 사이에서 데이터를 이동하는 것은 보이는 것만큼 단순하지는 않지만 Linux에는 사용자를 위해 여러 플랫폼에서 이 태스크의 복잡성을 관리하는 단순한 API 세트가 포함되어 있다.


참고자료

교육

  • Red Hat Linux System Administration Primer에서는 가상 메모리에 대한 유용한 요약을 제공한다.

  • All about Linux swap space에서는 스왑의 목적, 스왑의 위치 및 스왑 공간을 관리하는 데 사용되는 다양한 명령에 대해 살펴본다.

  • 캐싱의 성능을 향상시키기 위해 압축된 캐시 스키마가 고안되었다. 이 스키마에서는 스토리지의 효율을 개선하기 위해 입력 시 페이지가 압축되는 스왑 디스크가 실제로 빠른 ramdisk이다.

  • 디바이스 드라이버 필독서인 Linux Device Drivers, Third Edition은 Linux 메모리 관리에 대한 최고의 소스 중 하나이며 디바이스 드라이버와 관련된 모든 내용을 포함하고 있다.

  • 커널과 사용자 공간 페이지의 한 가지 차이점은 커널 페이지는 메모리에서 지속되고 사용자 공간 페이지는 스토리지 디바이스에 스왑될 수 있다는 것이다. 모든 프로세스 가상 주소 공간의 부분을 메모리에 잠금 설정하는 것은 mlock()mlockall() 시스템 호출을 사용하여 수행할 수 있다.

  • 일부 프로세서에는 MMU가 없기 때문에 Linux는 uClinux 배포판을 사용하여 이러한 아키텍처를 지원한다. uClinux는 마이크로 컨트롤러와 같은 MMU 없는 아키텍처에 집중하는 프로젝트이다.

  • Wikipedia는 가상 메모리, 페이징, 페이지 테이블페이지 대체 알고리즘을 포함하여 메모리 관리와 관련된 주제에 대한 유용한 참고자료를 제공한다.

  • Linux에서는 수백 개의 기술자료 목록과 함께, Linux 개발자와 관리자를 위한 다양한 다운로드, 토론 포럼 및 다른 참고자료를 찾을 수 있다.

  • developerWorks 기술 행사 및 웹 캐스트를 통해 다양한 IBM 제품 및 IT 산업 주제에 대한 최신 정보를 얻을 수 있다.

  • 무료 developerWorks Live! briefing을 통해 최신 IBM 제품 및 도구에 대한 정보뿐만 아니라 IT 업계의 최신 경향까지도 빠르게 확인할 수 있다.

  • developerWorks on-demand demos에서는 입문자를 위한 제품 설치 및 설정부터 숙련된 개발자를 위한 고급 기능까지 망라된 다양한 데모를 제공한다.

  • Twitter의 developerWorks를 팔로우(follow)하거나 developerWorks에 대한 Linux 트윗(tweet)의 피드를 구독하자.

제품 및 기술 얻기

  • 자신에게 가장한 적합한 방법으로 IBM 제품을 평가해 보자. 시험판 제품을 다운로드하거나, 온라인으로 제품을 사용해 보거나, 클라우드 환경에서 제품을 사용하거나, SOA Sandbox에서 SOA(Service Oriented Architecture)를 효과적으로 구현하는 방법을 배울 수 있다.

토론

  • developerWorks 커뮤니티에 참여한다. 개발자가 이끌고 있는 블로그, 포럼, 그룹 및 wiki를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.

필자소개

M. Tim Jones

M. Tim Jones is an embedded firmware architect and the author of Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (now in its second edition), AI Application Programming (in its second edition), and BSD Sockets Programming from a Multilanguage Perspective. His engineering background ranges from the development of kernels for geosynchronous spacecraft to embedded systems architecture and networking protocols development. Tim is a platform architect with Intel and author in Longmont, Colo.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=리눅스
ArticleID=632104
ArticleTitle=Linux 커널로부터의 사용자 공간 메모리 액세스
publish-date=08112010
author1-email=mtj@mtjones.com
author1-email-cc=

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.