나는 ext2 (소위 myext2.ko라고 함)의 수정 된 버전을 만드는 데 성공했으며 마운트 및 umount와 다른 것을 테스트했습니다.일부 경고는 우분투에서 ext2 커널 모듈의 수정 된 버전을 만드는 동안 오류로 취급됩니다
ssize_t my_new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
{
struct iovec iov; //changed
struct kiocb kiocb;
struct iov_iter iter;
ssize_t ret;
//inserted by adward - begin
size_t i;
char buff[len];
for (i=0;i<len;i++){
buff[i] = buf[i]^1;
}
iov.iov_base = (void __user *)buff;
iov.iov_len = len;
printk("Inside my_new_sync_write");
//inserted by adward - end
init_sync_kiocb(&ki_nbytesocb, filp);
kiocb.ki_pos = *ppos;
kiocb.ki_nbytes = len;
iov_iter_init(&iter, WRITE, &iov, 1, len);
ret = filp->f_op->write_iter(&kiocb, &iter);
if (-EIOCBQUEUED == ret)
ret = wait_on_sync_kiocb(&kiocb);
*ppos = kiocb.ki_pos;
return ret;
}
ssize_t my_new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
{
struct iovec iov = { .iov_base = buf, .iov_len = len };
struct kiocb kiocb;
struct iov_iter iter;
ssize_t ret;
//inserted by adward - begin
size_t i;
//inserted by adward - end
init_sync_kiocb(&kiocb, filp);
kiocb.ki_pos = *ppos;
kiocb.ki_nbytes = len;
iov_iter_init(&iter, READ, &iov, 1, len);
ret = filp->f_op->read_iter(&kiocb, &iter);
if (-EIOCBQUEUED == ret)
ret = wait_on_sync_kiocb(&kiocb);
*ppos = kiocb.ki_pos;
//inserted by adward - begin
for (i=0;i<len;i++){
buf[i] ^= 1;
}
printk("inside my_new_sync_read");
//inserted by adward - end
return ret;
}
: 내 FS/myext2/file.c는 다음 코드를 추가하고 간단한 "암호화"FUNC를 구현하려고 할 때 문제가 발생, 그 읽기의 문자열의 마지막 비트를 부정한다 위의 두 함수의 프로토 타입은 실제로 fs/read_write.c에 있으며 커널 코드 버전 3.17.6의 거의 모든 파일 시스템 유형을 사용합니다. 방금 fs/myext2/file.c에 복사 한 다음 약간의 변경 사항을 주석으로 추가하여 Makefile을 변경하지 않고도 일부 테스트를 수행 할 수 있습니다.
하지만 내 file.c는 붙여 넣을 순간, "sudo는 메이크업"은 다음과 같은 오류 메시지가 있습니다 : 나는 FUNC 포인터를 변경하여 그들에 대해 참조하지 않은 경우에도 /home/adward/linux-3.17.6/fs/myext2/file.c:64:15: error: storage size of ‘kiocb’ isn’t known struct kiocb kiocb; ^ /home/adward/linux-3.17.6/fs/myext2/file.c:65:18: error: storage size of ‘iter’ isn’t known struct iov_iter iter; ^
및 cc1: some warnings being treated as errors
을 동일한 소스 코드 파일에 file_operations
에 있거나 말하면, 나는 그들을 사용하지 않았다!
P. 내 file_operation 구조체는 이제 다음과 같습니다
const struct file_operations myext2_file_operations = {
.llseek = generic_file_llseek,
.read = new_sync_read, //want to replace with my_new_sync_read
.write = new_sync_write, //want to replace with my_new_sync_write
...
}
가지고 비슷한 일이 같은 몇 가지 문제에 충돌 한 사람? 나에게 뭔가 잘못된 것을 한 경우 알려주십시오. 감사합니다.