|
《linux设备驱动编程 第三版》(LDD3) 中的块设备例子sbull。实际设备是一块内存。
request处理函数最后会调用下面这个函数来实现读写:其中dev->data是那块实际的内存。
本来很正常。但如果我想把数据加密,使得在内存中的数据是加密的。即在写前加密,读后解密。加解密过程在驱动中实现,对内核是透明的。如下面这个函数中注释掉的两行。
static void sbull_transfer(struct sbull_dev *dev, unsigned long sector,
unsigned long nsect, char *buffer, int write)
{
unsigned long offset = sector*KERNEL_SECTOR_SIZE;
unsigned long nbytes = nsect*KERNEL_SECTOR_SIZE;
if ((offset + nbytes) > dev->size) {
printk (KERN_NOTICE "Beyond-end write (%ld %ld)\n", offset, nbytes);
return;
}
if (write) {
//encrypt((unsigned char *)buffer, nbytes);
memcpy(dev->data + offset, buffer, nbytes);
} else {
memcpy(buffer, dev->data + offset, nbytes);
//decrypt((unsigned char *)buffer, nbytes);
}
}
问题就出现了。装载这个驱动模块后,对设备 fdisk,正常。mkfs正常。但mount时,报 错误的文件系统 的错误。
在 /var/log/message中的信息是:
May 2 21:09:08 wub kernel: EXT2-fs error (device vdefsa1): ext2_check_descriptors: Block bitmap for group 0 not in group (block 4260704353)!
May 2 21:09:08 wub kernel: EXT2-fs: group descriptors corrupted!
好像是元数据越界。
我觉得加解密对内核是透明的,为什么会报错呢? |
|