Linux 커 널 의 데이터 구조 -- 맵

머리말
리 눅 스 커 널 은 자주 사용 하 는 내장 데이터 구 조 를 실현 했다. 주로 링크 대기 열 맵 이 진 트 리 맵 도 관련 배열 이 라 고 부 르 는데 모든 유일한 id 가 사용자 정의 데이터 구조 지침 에 대응 하 는 것 이다.맵 에 대한 지식 이 복잡 하고 깊이 이해 하지 못 한 것 같 아서 자주 사용 하 는 조작 API 를 기록 합 니 다.idr 데이터 구 조 는 사용자 공간 을 비 추 는 UID 에 사 용 됩 니 다.
idr 초기 화
idr 를 만 드 는 과정 은 두 단계 로 나 뉘 는데 먼저 정적 정의 나 동적 으로 idr 데이터 구 조 를 만 든 다음 에 idr 를 호출 합 니 다.init():
struct idr id;    //    idr   
idr_init(&id);    //   idr   

UID 할당
새로운 UID 를 할당 하 는 것 도 두 단계 로 나 뉜 다. 첫 번 째 단 계 는 idr 에 게 새로운 UID 를 할당 하고 예비 트 리 의 크기 를 조정 해 야 한 다 는 것 을 알려 준다.
int idr_pre_get(struct idr *idp, gfp_t gfp_mask); 
//          1,     0。

두 번 째, 새로운 UID 가 져 오기
int idr_get_new(struct idr *idp, void *ptr, int *id);

이 방법 은 idp 가 가리 키 는 idr 를 사용 하여 새로운 UID 를 할당 하여 포인터 ptr 에 연결 합 니 다.성공 시 0 을 되 돌려 주 고 분 배 된 UID 를 id 에 저장 합 니 다.오류 시 0 이 아 닌 오류 코드 를 되 돌려 줍 니 다. - EAGAIN 은 idr 를 다시 호출 해 야 한다 고 표시 합 니 다.pre_get (), - enoSPC 는 idr 가 가득 찼 음 을 표시 합 니 다.예:
do {
    if (!idr_pre_get(&idp, GFP_KERNEL))
        return -ENOSPC;
    ret = idr_get_new(&idp, ptr, &id);
    printk(KERN_ALERT "id=%d
"
, id); } while(ret == -EAGAIN);

함수 idrget_new_above () 작용 과 idrget_new () 역할 이 같 습 니 다. 최소한 의 UID 제한 만 지 정 했 습 니 다. 새로운 UID 가 들 어 오 는 매개 변수 starting 보다 크 도록 확보 하 는 것 입 니 다.id. int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id);
UID 찾기
idr 에서 UID 를 찾 으 면 idr 는 해당 하 는 지침 을 되 돌려 줍 니 다.
void *idr_find(struct idr *idp, int id);    //  id     

id 에 대응 하 는 바늘 을 되 돌려 주 는 데 성공 하면 빈 바늘 을 되 돌려 줍 니 다.
UID 제거
idr 에서 UID 제거
void idr_remove(struct idr *idp, int id);   //  id  
void idr_remove_all(struct idr *idp);   //    id  

성공 하면 id 와 연 결 된 포인 터 를 맵 에서 삭제 합 니 다. 실패 하면 알림 을 주지 않 습 니 다.
idr 취소
void idr_destroy(struct idr *idp);  //  idr_layer      

이 함 수 는 idr 에서 사용 하지 않 은 메모 리 를 방출 합 니 다.UID 에 할 당 된 메모 리 를 사용 하지 않 습 니 다.

좋은 웹페이지 즐겨찾기