求教linux 内核读写硬盘/U盘扇区的函数

rockhard 2023-07-14 00:23:50

自家的硬件平台和开发的嵌入式LINUX系统 ,想对U盘进行加密。

把第一个扇区用工具提前对内容进行加密,放在自家的平台上面,在LINUX内核最底层读写扇区的函数地方,判断如果是第一个扇区,就对读出来的数据进行解密 。对上层,以及内核其它部分,都没有影响,还是相当于没加密一样,这样,这个U盘只能在自家平台上面使用,在其它平台,就需要重新格式化,才能识别出来。求教内核最底层读写硬盘/U盘的代码,在哪个文件?多谢!
 

...全文
564 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
rockhard 2023-07-31
  • 打赏
  • 举报
回复

折腾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) );

剩下都是简单的自定义数据处理了。

  • 打赏
  • 举报
回复

插眼。应该也是在总线那部分吧?

rockhard 2023-07-14
  • 举报
回复
@这是一个正经昵称 能说具体一点点吗?多谢,平时不在LINUX下面做开发。
  • 举报
回复
@rockhard 我也不敢打包票,我只是最近恰好在做SD卡的应用优化,走mmc,卡里有个固件,这个我没做过卡,只能猜测是类似磁盘驱动的东西。linux通过mmc驱动可以读SD卡flash上的内容。硬盘、U盘应该都是类似的,估计需要把各类驱动都做了解密。

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧