함수 ERPTR,PTR_ERR 그리고 ISERR 이해

1224 단어 assemblynull
많은 내부 핵 함수는 바늘을 되돌려야 하지만, 함수의 호출이 실패할 수 있습니다. 일반적으로 우리는 이러한 상황을 처리할 때 모두NULL 바늘을 되돌려줍니다.malloc나 kmalloc가 지정한 공간 신청을 받지 못했을 때의 되돌려주는 값과 같습니다.그러나 때때로 우리는 함수 실패의 원인을 알고 싶지만, NULL로 돌아오면 정보가 부족해 보인다.따라서 일부 함수는 오류를 일으키는 원인을 처리하기 위해 실제 오류 인코딩을 되돌려줍니다.많은 핵 인터페이스는 오류 값을 바늘 값에 인코딩해서 오류 정보를 되돌려줍니다.이러한 함수를 처리할 때 호출 성공 여부를 판단하는 것은 간단하게 NULL과 비교할 수 없다.이러한 유형의 인터페이스를 편리하게 사용하기 위해서 2.6의 핵은 linux/err에 있다.h에서는 세 개의 내연 함수를 실현했다.
#define MAX_ERRNO 4095
#ifndef __ASSEMBLY__
#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
static inline void *ERR_PTR(long error) { return (void *) error; }
static inline long PTR_ERR(const void *ptr) { return (long) ptr; }
static inline long IS_ERR(const void *ptr) { return IS_ERR_VALUE((unsigned long)ptr); }
다행히 커널이 반환되는 포인터는 일반적으로 페이지의 경계(4K 경계), 즉
ptr & 0xfff == 0

이렇게 하면 ptr의 값은 (0xffff000, 0xffffffff) 사이에 떨어질 수 없고 일반 핵의 오류 코드도 작은 음수로 -1000에서 0 사이에 unsigned long으로 바뀌어 (0xffffffff000, 0xffffffffffff) 사이에 있다.그래서
(unsigned long)ptr > (unsigned long)-1000L

내부 핵 함수의 반환 값이 유효한 지침인지 오류 코드인지 판단합니다.

좋은 웹페이지 즐겨찾기