커널 소스에서 일부 함수 호출을하는 커널 모듈의 코드를 이해하려고합니다. 코드는 device-mapper.h입니다.리눅스 커널의 dm_per_bio_data 기능은 무엇을합니까?
struct dm_target_io {
struct dm_io *io;
struct dm_target *ti;
unsigned target_bio_nr;
unsigned *len_ptr;
struct bio clone;
};
static inline void *dm_per_bio_data(struct bio *bio, size_t data_size)
{
return (char *)bio - offsetof(struct dm_target_io, clone) - data_size;
}
는 우리는 "dm_per_bio_data 데이터의 위치를 반환한다."고, device_mapper.h의 의견에, 다른 말된다 이것이 왜 그런지 나는 확신하지 못한다.
먼저 dm_per_bio_data는 구조체 bio *를 취해 offsetof (struct dm_target_io, clone)로 감산합니다.이 구조체는 둘러싸는 dm_target_io 구조체의 시작을 제공해야합니다. 그런 다음 data_size를 뺍니다.이 포인터는 - 어디로?
dm_target_io가 data_size로 빼는 것이 나를 차지할 수있는 다른 구조체 내에서 선언 된 위치를 찾고자했습니다. 그런 행운은 지금까지는 없습니다.