나는 커널 모듈의 구현을 읽으려고 노력해 왔고, 나는이 코드 조각에 걸려 넘어지고있다. 다음과 같이리눅스 커널의 IS_ALIGNED 매크로는 무엇을합니까?
unsigned long addr = (unsigned long) buf;
if (!IS_ALIGNED(addr, 1 << 9)) {
DMCRIT("@%s in %s is not sector-aligned. I/O buffer must be sector-aligned.", name, caller);
BUG();
}
IS_ALIGNED 매크로는 커널 소스에 정의되어
#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0)
나는 데이터가 작동하는 데이터 타입의 크기에 따라 정렬되어야 이해하지만, 난 아직도 이해가 안 돼요 코드가하는 일.
1 씩 9 시프트 한 다음 1을 빼면 111111111이됩니다. 그러면 111111111은 비트와 - 및 x를 사용합니다.
왜이 코드가 작동합니까? 바이트 정렬을 어떻게 확인합니까?
예, 커널 모듈은 HDD에 대한 쓰기 저장 SSD 캐시를 만드는 데 사용됩니다. 따라서 응용 프로그램은 플래시 메모리를 사용합니다. 쓰기간에 플래시를 지워야한다는 것을 이해합니다. 마지막 몇 비트가 0인지 확인해야하는 이유에 대해 자세히 설명해 주시겠습니까? – user6337
죄송합니다. 왜 메모리 주소가 512 바이트 경계에 정렬되도록 메모리 주소가 마지막 9 개의 항목을 0으로 가져야하는지 알 수 있습니다. 블록인지 또는 512 바이트인지 여부를 알고 있습니까? – user6337
"sector-aligned"오류 메시지에서 hat이 사용되었습니다. 나는 블록 대 섹터 대 페이지의 정의의 차이점을 잊어 버렸다. 지금 당장 살펴보면, 페이지는 가장 작은 WRITE 단위입니다. 섹터 또는 블록은 최소 ERASE 단위입니다. – Dmitri