2017-12-14 49 views
0

nvme-cli (c로 작성되었으며 Linux에서 실행할 수 있음) 용 테스트 도구로 작업 중입니다. SSD 검증 목적 ioctl()이 드라이버 코드를 호출하는 방법

, 내가 실제로 ioctl() 기능을 읽기

을 (두 데이터가 동일 할 경우 비교 마지막으로 작성하고 다음 같은를 읽고, 예를 들어 I/O 명령의) 사용자 정의 명령을 찾고 있었다 아래 코드와 같이 사용됩니다.

struct nvme_user_io io = { 
    .opcode  = opcode, 
    .flags  = 0, 
    .control = control, 
    .nblocks = nblocks, 
    .rsvd  = 0, 
    .metadata = (__u64)(uintptr_t) metadata, 
    .addr  = (__u64)(uintptr_t) data, 
    .slba  = slba, 
    .dsmgmt  = dsmgmt, 
    .reftag  = reftag, 
    .appmask = appmask, 
    .apptag  = apptag, 
}; 
err = ioctl(fd, NVME_IOCTL_SUBMIT_IO, &io); 

읽기를 이해하려면 실행 제어가 정확히 어디로 갈 수 있습니까?

는 또한 내가 좋아하는

err = ioctl(fd,NVME_IOCTL_WRITE_AND_COMPARE_IO, &io);

그래서 쓰기를 할 내부적 수 있다는 것을 보이는 다른 명령을 갖고 싶어, 다음과 같은 위치를 읽고 마지막으로 디스크 만 포함되어 있는지 확인하기 위해 두 데이터를 비교 내가 쓰고 싶었던 데이터.

저는이 nvme/ioctl()에 익숙하지 않으므로 실수가 있으면 저를 수정하십시오.

+0

'NVME_IOCTL_SUBMIT_IO'에 대한 간단한'grep ': 주어진 ioctl 요청은 [drivers/nvme/host/core.c]에서 처리됩니다 (https://elixir.free-electrons.com/linux/latest/source/drivers). /nvme/host/core.c#L1042). 나는 그것이 작동하는지 몰라요'; \t \t 반환 nvme_submit_io (NS, (무효 __user *) 인수) : – Tsyvarev

+0

@Tsyvarev는, 내가 대신'의 경우 NVME_IOCTL_SUBMIT_IO의 NVME_IOCTL_WRITE_AND_COMPARE_IO라는 케이스를 추가하여 새 명령을 가질 수 있다는 것입니다. 사실''ioctl()'함수가'nvme_ioctl()'을 어떻게 호출하는지 이해하지 못했습니다. 바보 같은 질문인지는 모르겠지만,이 글을 처음 접한 이래로 나는 이해하지 못했습니다. –

+0

간단히 말해,'nvme_ioctl()'이 블록 장치에 할당되어 있습니다.이 장치는 사용자 공간에서'ioctl()'호출로 전달됩니다. 자세한 내용은 Linux 커널의 블록 장치 및 해당 장치의 writting 드라이버를 참조하십시오. 새로운 유형의 ioctl 요청에 대한 지원을 추가하기 원한다면 간단히'nvme_ioctl' 함수에서 지원하십시오. – Tsyvarev

답변

0

nvme_io()는 장치에 보낼 NVMe opcode를 매개 변수로 받아들이는 기본 명령 처리기입니다. 표준에 따르면 읽기, 쓰기 및 비교를위한 별도의 명령 (opcode)이 있습니다. 이 명령을 별도로 보내거나 공급 업체 특정 명령을 추가하여 필요한 것을 계산할 수 있습니다.

+0

우리가 도구를 만들고있는 SSD 유효성 검사 목적을 위해 디스크에 임의의 패턴을 쓰고 읽은 다음 디스크에 기록 된 데이터가 실제로 쓰고 싶은 것과 동일한 지 비교해야합니다. 우리가 임의 패턴을 작성하고 있기 때문에 내부적으로 쓰기를 보내고 같은 것을 읽는 커스텀 커맨드가 필요하다. 마지막으로 버퍼 내용을 검사하여 두 내용이 같은지 확인하십시오 –

+0

@ArjunGS "내부적으로"는 무엇을 의미합니까? 모든 블록에 대해 임의의 패턴을 생성하고 저장하고, 전송하고, 다시 읽고 비교하는 프로그램을 실행할 수 있습니다. 디스크에 내부적으로 수행해야하는 경우 SSD 장치에 코드를 구현해야하며 사용자 정의 명령을 보낼 수 있습니다. 아마도 SSD는 이미 그러한 명령을 지원합니다. – Ora

+0

내가 원했던 것은 새로운 명령을 nvme-cli에 추가하는 것인데, Write-compare는 쓰기, 읽기 및 비교를 수행합니다. 그러나'ioctl()'을 쓰레드에서 반복 할 수 없기 때문에'ioctl()'이 할 수없는 다른 전송 큐 ID를 지정해야합니다. 그래서 드라이버 모듈에 뭔가를 추가하고 싶습니다. –