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 에 할 당 된 메모 리 를 사용 하지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.