Egloos | Log-in
F/OSS study
F/OSS study
[Linux] asmlinkage
Linux kernel: 2.6.11
arch: x86

커널 소스를 보다보면 asmlinkage로 선언된 함수들을 볼 수 있다.
asmlinkage는 어셈블리 코드에서 직접 호출(링크)할 수 있다는 의미이며
커널 소스의 <include/linux/linkage.h>에 다음과 같이 정의되어 있다.

#include <linux/config.h>
#include <asm/linkage.h>

#ifdef __cplusplus
#define CPP_ASMLINKAGE extern "C"
#else
#define CPP_ASMLINKAGE
#endif

#ifndef asmlinkage
#define asmlinkage CPP_ASMLINKAGE
#endif

...

그렇다면 어셈블리 코드에서 직접 호출할 수 있다는 것은 무엇을 의미할까?
일반적으로 C 함수는 어셈블리 코드에서 별 어려움없이 호출할 수 있지만
함수의 인자를 넘기거나 리턴값을 받는 부분 등의 호출 규약이 필요하다.

레지스터에 여유가 있는 ARM이나 MIPS 등의 아키텍처에서는
함수의 인자를 넘길 때 특정 레지스터를 사용하도록 호출 규약이 정의되어 있지만,
그렇지 못한 x86 아키텍처에서는 때에 따라 레지스터, 스택 혹은 별도의 메모리 영역에
함수의 인자를 저장하여 넘길 수 있도록 지원한다.

당연히 인자를 레지스터에 저장하여 넘기는 방식이 빠르기 때문에 (fastcall)
최적화 옵션을 켜고 컴파일하는 경우 인자를 레지스터를 통해 전달하도록
함수의 호출부와 구현부를 변경해 버릴 수 있다. (일반적인 최적화 방법)
이 경우 GCC를 통해 자동 생성되는 코드는 적절히 변환되므로 문제가 없을테지만
직접 작성한 어셈블리 코드에서 함수를 호출하는 경우 문제가 발생하게 된다.

이 경우를 방지하기 위해 어셈블리 코드와 링크되는 함수는
인자를 (레지스터를 이용하지 않고) 스택을 이용해서 전달하도록
선언하는 데, 이 때 asmlinkage가 사용된다.

위의 코드에서 <asm/linkage.h> 파일을 #include 하고 있는 것에 주의하자.
대부분의 아키텍처에서 이 파일은 asmlinkage를 정의하지 않지만
i386에서는 다음과 같이 정의한다.

#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
#define FASTCALL(x) x __attribute__((regparm(3)))
#define fastcall __attribute__((regparm(3)))

regparm 속성은 레지스터를 이용하여 전달한 인자의 수를 지정한다.
asmlinkage로 선언된 경우 모두 스택을 이용하고 (레지스터로 0개의 인자 전달)
fastcall로 선언된 경우 최대 3개의 인자를 레지스터로 전달한다.
(이 경우 EAX, EDX, ECX 레지스터를 이용하며, 인자는 정수형이어야 한다.)
by namhyung | 2009/05/15 03:26 | Kernel | 트랙백(1) | 핑백(4) | 덧글(9)
트랙백 주소 : http://studyfoss.egloos.com/tb/4951809
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from novum의 공유창고 at 2012/08/08 14:27

제목 : asmlinkage modifier in Linux..
컴파일러에서 최적화 할 때 메모리 공간에 대한 코드가 변경되는 문제를 방지(레지스터를 사용하지 않고 스택만 사용)...more

Linked at asmlinkage의 의미 |.. at 2013/09/10 19:32

... l로 선언된 경우 최대 3개의 인자를 레지스터로 전달한다. (이 경우 EAX, EDX, ECX 레지스터를 이용하며, 인자는 정수형이어야 한다.) 출처 : http://studyfoss.egloos.com/4951809 [C/C++] free(): invalid next size (normal): Leave a Reply Cancel reply Your email ... more

Linked at asmlinkage | 구름과.. at 2014/08/21 07:44

... d on 2014년 8월 21일 by cloudrain21 이는 http://studyfoss.egloos.com/4951809 를 참고하면 충분한 설명이 될 것 같다. 어셈블리 코드에 ... more

Linked at E4DEEN Official at 2014/11/12 13:46

... http://studyfoss.egloos.com/4951809</a> 를 참고하면 충분한 설명이 될 것 같습니다. 어셈블리 코드에서 C 함수를 호출할 때 함수 인자의 전달을 스택을 이용하도록 해주는 속성지정 매크로입니다. ARM 에서는 아무일도 하지 않고, x86 에서는 스택을 이용하여 인자를 전달하도록 속성을 지정해줍니다. x86 코드를 뒤져보니 아래와 같이 정의되어 있더군요. 인자를 넘겨줄 때 regparam (레지스터 파라미터)의 갯수를 0 개로 ... more

Linked at 함수선언부 관련 매크로 (__.. at 2016/03/21 17:23

... 함수를 호출할 때 함수 인자의 전달을 레지스터가 아닌 스택을 이용하도록 해주는 속성지정 매크로이다. extern &#8220;C&#8221;로 정의되어 있다. 참고: [Linux] asmlinkage &#8211; F/OSS 참고 Declaring Attributes of Functions | gcc.gnu.org Options That Con ... more

Commented by smartdolph at 2012/08/08 16:29
매일 배우고 가네요~ 블로그 너무 멋져요^^
Commented by namhyung at 2012/08/12 11:20
답글 남겨주셔서 감사합니다. ^^
Commented by insane00 at 2012/12/06 14:03
새로운 궁금증 또는 아주 약간의 새로운 지식이 생길때마다,
결국 찾는 곳이 이곳이네요-

6개월전에 읽은 글이 떠올라 다시 방문했는데,
그래도 그 동안 조금은 성장했는지

오늘 읽으니 느낌이 또 다릅니다.

오늘은 업무에 여유가 있어서
커널 카테고리에 있는 글을 다 읽어볼까 합니다.

늘 도둑처럼 읽고만 가기 송구스러워,
감사의 글을 남깁니다.

Commented by namhyung at 2012/12/12 23:28
답글 남겨주셔서 감사합니다.
다시 곱씹어 볼 만한 글인지 제가 더 부끄럽네요..
Commented by Ant at 2013/01/23 07:16
좋은글 보고 갑니다.

한가지 궁금한게 있는데 fastcall로 선언된 함수를 ECX 와 EDX 레지스터를 사용하지 않고, EAX 레지스터로만 인자값을 넘겨줄수 있나요 ?

mov eax, Arg1
call Function

이런식으로 EAX 레지스터의 값을 인자값으로 사용할 수 있는지 궁금합니다.
Commented by 김석범 at 2013/09/10 19:30
좋은 글 감사합니다~퍼갑니다~
Commented by PageOne at 2014/09/02 16:00
잘 정리해주셔서 감사합니다 퍼갈께요~
Commented by 정광조 at 2015/04/14 10:21
잘보고 갑니다. 링크걸겠습니다!
Commented by 이유비 at 2016/05/01 13:17
좋은 설명 감사드립니다.

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶

카테고리
General
Application
System
Kernel
Book
Tips
태그
sed emacs compiler CARM perf patch kernel gcc scm awk git elf build algorithm script x86 memory C documentation linux block-layer computer-architecture blktrace vcs SMP glibc synchronization CAaQA3 binutils bash
전체보기
이글루 파인더

최근 등록된 덧글
informsi yang bagus dan be..
by pordanaia at 08/05
Informsi yang bagus dan b..
by jamalsu at 08/01
as inforasi yang menarik http..
by jamalsu at 07/22
최근 등록된 트랙백
Tod's Ferrari Homme
by Tods Pas Cher,Kodak did ..
Mocassin Femme
by Mocassins Homme, I got so..
natural garcinia cambogia
by
rss

skin by jiinny


X