static inline Linux 내 연 함수

전송:http://blog.csdn.net/buaaroid/article/details/7390415
 
asmlinkage/FASTCALL()/fastcall     이 세 개의 매크로 는 함수 매개 변수의 전달 방식 을 지정 했다.asmlinkage 수식 함수, 그 매개 변 수 는 스 택 을 통 해 전 달 됩 니 다.FASTCALL () / fastcall, 이 두 가 지 는 사실상 같은 역할 을 한다.Intel i386 구조 에서 이들 이 수식 하 는 함 수 는 앞의 세 가지 매개 변 수 는 각각 유 니 버 설 레지스터 EAX, ECX 와 EDX 를 통 해 전달 된다.include / asm - i386 / linkage. h: \ # define asmlinkage CPPASMLINKAGE __attribute__((regparm(0))) #define FASTCALL(x) x __attribute__((regparm(3))) #define fastcall __attribute__((regparm (3)) 함수 속성 regparm 을 이용 합 니 다.static inline 내 연 함수     내 연 함 수 는 매크로 와 유사 하 다.내 연 함수 의 코드 는 호출 된 곳 에 직접 박 혀 있 으 며, 몇 번 호출 하면 몇 번 박 혀 있 으 며, 콜 명령 을 사용 하지 않 습 니 다.이렇게 하면 함수 호출 시의 추가 비용 을 줄 일 수 있 습 니 다. 예 를 들 어 저장 과 복구 함수 가 주소 로 돌아 가 는 등 속 도 를 가속 화 할 수 있 습 니 다.그러나 호출 횟수 가 많 으 면 실행 가능 한 파일 을 크게 만들어 속 도 를 낮 출 수 있다.매크로 에 비해 커 널 개발 자 들 은 일반적으로 내 연 함 수 를 사용 하 는 것 을 더 좋아한다.내 연 함수 에 길이 제한 이 없 기 때문에 형식 제한 이 있 습 니 다.컴 파 일 러 는 오용 을 방지 하기 위해 함수 호출 방식 도 검사 할 수 있다.     static inline 의 내 연 함 수 는 일반적으로 함수 자체 의 코드 가 발생 하지 않 고 모두 호출 된 곳 에 삽 입 됩 니 다.static 를 추가 하지 않 으 면 이 함수 가 다른 컴 파일 유닛 에 의 해 호출 될 수 있 음 을 나타 내 므 로 함수 자체 의 코드 가 생 길 수 있 습 니 다.그래서 static 를 추가 하면 실행 가능 한 파일 을 작 게 만 들 수 있 습 니 다.커 널 에 서 는 일반적으로 inline 만 사용 하 는 경 우 를 볼 수 없 으 며, 모두 static inline 을 사용한다.     가끔 static 를 볼 수 있 습 니 다.inline__。gcc 컴 파일 매개 변수 '- ansi' 나 '- std = c89' 등 은 'asm', 'inline' 등 키 워드 를 사용 하지 않 습 니 다.이러한 상황 에서 내 연 함 수 를 사용 하기 위해 gcc 는 ' inline' 키 워드 를 제공 합 니 다.그러나 커 널 사용 기준 은 gnu 89 이기 때문에 'inline' 과 ' inline' 은 커 널 에서 모두 사용 할 수 있 습 니 다.현재 "inline" 은 이미 C99 표준 의 키워드 가 되 었 다.gcc 의 미래 부족 기준 도 C99 기반 gnu 99 가 될 것 입 니 다.그래서 지금 커 널 코드 를 쓸 때 'inline' 키 워드 를 사용 하 는 것 을 추천 합 니 다. ' line' 을 사용 하지 마 세 요.
 
리 눅 스 커 널 의 많은 규범 들 은 반복 적 으로 찾 고 읽 어야 최종 적 인 의미 와 목적 을 발견 할 수 있다.이 글 은 C 언어 용법 중 몇 가지 모호 하고 헷 갈 리 기 쉬 운 부분 을 수집 하고 분명하게 한다.
(1) asmlinkage
asmlinkage 는 컴 파일 러 에 게 부분 스 택 을 사용 하여 파 라 메 터 를 전달 해 야 한다 고 알려 주 었 고, 매크로 FASTCALL 은 컴 파일 러 에 게 유 니 버 설 레지스터 를 사용 하여 파 라 메 터 를 전달 하 라 고 알려 주 었 다.
다음은 include / linux / linkage. h 에서 온 코드 (2.4.0) 입 니 다.
#ifdef __cplusplus
#define CPP_ASMLINKAGE extern "C"
#else
#define CPP_ASMLINKAGE
#endif

#if defined __i386__
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
#elif defined __ia64__
#define asmlinkage CPP_ASMLINKAGE __attribute__((syscall_linkage))
#else
#define asmlinkage CPP_ASMLINKAGE
#endif

(2) UL
UL 은 수치 상수 뒤에 이 상 수 를 'unsigned long' 형식 으로 표시 하 는데 자주 사용 되 며, UL (L 대표 long) 은 컴 파일 러 에 이 수 치 를 log 형 수치 로 처리 하 라 고 알려 준다.따라서 UL 을 사용 하면 특정 시스템 구조 내의 데이터 가 데이터 유형 에 규정된 범 위 를 넘 치지 않도록 보장 할 필요 가 있다.큰 숫자 나 긴 비트 마스크 와 관련 될 때 UL 을 사용 하면 시스템 구조 와 무관 한 코드 를 만 드 는 데 도움 이 됩 니 다.
Linux 코드 에는 다음 과 같은 예 가 있 습 니 다.
include/linux/kernel.h
#define INT_MAX ((int)(~0U>>1))
#define INT_MIN (-INT_MAX - 1)
#define UINT_MAX (~0U)
#define LONG_MAX ((long)(~0UL>>1))
#define LONG_MIN (-LONG_MAX - 1)
#define ULONG_MAX (~0UL)

(3)inline
키워드 inline 은 함수 의 실행 가능 코드 를 최적화 하 겠 다 고 밝 혔 습 니 다. 이것 은 함수 의 코드 를 호출 프로그램의 코드 에 합 쳐 실현 할 수 있 습 니 다.Linux 커 널 에서 사용 하 는 inline 함 수 는 대부분 static 형식 으로 정의 된다."static inline" 함 수 는 컴 파일 러 가 모든 호출 프로그램 에 코드 를 삽입 하려 고 시도 하도록 합 니 다.
이 합병 은 함수 호출 의 모든 비용 을 면제 할 수 있 습 니 다. \ # define 구문 도 추가 함수 호출 을 제거 할 수 있 습 니 다.
또한 inline 을 사용 하면 바 이 너 리 이미지 의 크기 가 증가 하고 CPU 캐 시 에 접근 하 는 속 도 를 낮 출 수 있 기 때문에 모든 함수 정의 에서 사용 할 수 없습니다.
(4) const 와 volatile
const 는 반드시 상수 만 을 대표 하 는 것 이 아니 라, 때때로 그것 은 '읽 기 전용' 이라는 뜻 을 나타 낸다.예 를 들 어 'const int * x' 에서 x 는 const 정 수 를 가리 키 는 지침 이기 때문에 지침 을 수정 할 수 있 지만 이 정 수 를 수정 할 수 없습니다.그러나 'int const * x' 에서 x 는 정 수 를 가리 키 는 const 지침 이기 때문에 이 정 수 는 바 꿀 수 있 지만 지침 x 는 바 꿀 수 없다.
 키워드 volatile 은 변 수 를 경고 없 이 수정 할 수 있 음 을 나타 낸다. 컴 파일 러 가 이 변 수 를 사용 할 때마다 복사 본 을 저장 하고 접근 하 는 것 이 아니 라 값 을 다시 불 러 오 라 고 알려 준다.인 터 럽 트 처리, 하드웨어 레지스터, 병렬 프로 세 스 간 에 공 유 된 변 수 는 모두 volatile 로 표 시 된 전형 적 인 예 입 니 다.
include/asm-i386/spinlock.h
typedef struct {
volatile unsigned int lock;
#if SPINLOCK_DEBUG
unsigned magic;
#endif
} spinlock_t;

 
끝나다

좋은 웹페이지 즐겨찾기