4,465
社区成员




自家的硬件平台和开发的嵌入式LINUX系统 ,想对U盘进行加密。
把第一个扇区用工具提前对内容进行加密,放在自家的平台上面,在LINUX内核最底层读写扇区的函数地方,判断如果是第一个扇区,就对读出来的数据进行解密 。对上层,以及内核其它部分,都没有影响,还是相当于没加密一样,这样,这个U盘只能在自家平台上面使用,在其它平台,就需要重新格式化,才能识别出来。求教内核最底层读写硬盘/U盘的代码,在哪个文件?多谢!
折腾N天,终于搞定,总结一下,以备其它人需要。
在get_protocol函数中,确定USB的传输协议,在get_transport函数,确定USB的传输方式。
U盘(至少我要处理的U盘)是BULK ONLY + usb_stor_transparent_scsi_command 方式。因些,所有的访问U盘的SCSI 命令,都会通过usb_stor_transparent_scsi_command函数调用,在usb_stor_transparent_scsi_command函数中,根据传输方式,调用了usb_stor_invoke_transport 在usb_stor_invoke_transport中语句:result = us->transport(srb, us); 就是用函数指针调用了 usb_stor_Bulk_transport函数,usb_stor_Bulk_transport分三个步骤,分别为传输CBW,DATA,CSW, 因此只需要在DATA完成阶段,对取得的数据进行解密,这样对整个文件系统,上层 ,都是隐藏的,不需要对它们做任何改动。因为这是在最接近物理层,对取得的数据做了转变,对整个LINUX内核都是看不到的。
值得注意,SCSI命令的数据缓冲区是一个scatterlist结构体,要对数据进行读写,需要转换为 VIRTUAL ADDRESS
char * data;
data = page_address( sg_page(srb->sdb.table.sgl) );
剩下都是简单的自定义数据处理了。