免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3890 | 回复: 13
打印 上一主题 下一主题

[硬件及驱动] 绕过pagecache/块设备/scsi/驱动,直接读写磁盘的方法 [复制链接]

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-22 12:39 |只看该作者 |倒序浏览
本帖最后由 humjb_1983 于 2014-07-24 12:51 编辑

需要绕过pagecache、块设备、scsi和驱动直接读写磁盘,不知具体需要考虑哪些问题?具体如何操作?哪位大侠有相关经验,请指点!!
详细描述下我的需求,再贴一下:
-----------
其实我的目的是需要,在磁盘中划分一块区域出来做黑匣子用,我们知道,当系统出现严重问题时,系统日志经常已不能正常工作,
因为依赖太多,比如调度和冗长的IO流程。
因此向利用现有的硬盘做黑匣子,记录内核关键的异常信息,信息量小,循环写入,不考虑删除、不考虑碎片、不考虑性能、不考
虑复杂的管理算法。

目前想到的方法有二:
1、利用BIOS INT13接口。
我们知道内核boot时,MBR和boot相关的数据通常是通过BIOS INT13接口读取的,通过该接口可以实现硬盘指定扇区范围的读写,看似
可以满足我的需求,但其实不然,因为BIOS接口只能在实模式下使用,保护模式下无法直接使用,因为实模式下中断的处理方式和地址
宽度跟保护模式都不同,如果要在保护模式中调用BIOS中断接口,只能:
  a、定制idt表,并弄清楚实模式下BIOS中断接口的处理方式,估计难度非常大。
  b、通过vm86()接口进入VM86模式,可以调用BIOS中断接口,但问题是vm86只在32位环境中支持,64位不支持。
综上,这个方法的可行性很小。

2、定制简化的硬件驱动,直接操作硬件。
这种方法,需要深入理解硬件。通常硬盘底层驱动都是厂商自己维护的,算是硬件的核心技术之一了,改写驱动的难度也不小,而且面临
如下问题:
1、硬件种类众多,难以做到兼容。
2、定制驱动和原驱动的竞争和互斥问题。比如中断和DMA的竞争
3、对系统IO性能影响问题。我们知道磁盘IO的时间大部分花在寻道上,而块设备层的各种合并和优化算法,其实就是为了减少寻道时间,
而如果系统正常IO期间,穿插了定制驱动的直接IO操作的话,应该会对系统的IO产生影响。
------------
欢迎大家讨论和提供宝贵意见,谢谢!

论坛徽章:
0
2 [报告]
发表于 2014-07-23 13:06 |只看该作者
你这个也太牛逼了吧,绕过驱动怎么操作硬件?
使用sg 层倒是可以绕过前面两个。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
3 [报告]
发表于 2014-07-23 15:12 |只看该作者
回复 2# hmsghnh
自己写驱动呗

   

论坛徽章:
0
4 [报告]
发表于 2014-07-23 15:23 |只看该作者
只晓得direct io把page cache绕过了 其他还真不知道

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
5 [报告]
发表于 2014-07-23 18:05 |只看该作者
hmsghnh 发表于 2014-07-23 13:06
你这个也太牛逼了吧,绕过驱动怎么操作硬件?
使用sg 层倒是可以绕过前面两个。

至少需要自己写驱动。。。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
6 [报告]
发表于 2014-07-23 18:38 |只看该作者
chenyu105 发表于 2014-07-23 15:23
只晓得direct io把page cache绕过了 其他还真不知道

这个估计要用最原始的方法了。

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
7 [报告]
发表于 2014-07-23 21:02 |只看该作者
直接注册虚拟块设备,make_request自己实现,直接翻译bio为scsi cmd后,直接丢给scsi host

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
8 [报告]
发表于 2014-07-24 12:49 |只看该作者
瀚海书香 发表于 2014-07-23 15:12
回复 2# hmsghnh
自己写驱动呗

昨晚回了一大篇,结果系统问题,丢了,郁闷了半天,今天重新写一下。趁 瀚海兄 也在,一起讨论下。
其实我的目的是需要,在磁盘中划分一块区域出来做黑匣子用,我们知道,当系统出现严重问题时,系统日志经常已不能正常工作,
因为依赖太多,比如调度和冗长的IO流程。
因此向利用现有的硬盘做黑匣子,记录内核关键的异常信息,信息量小,循环写入,不考虑删除、不考虑碎片、不考虑性能、不考
虑复杂的管理算法。

目前想到的方法有二:
1、利用BIOS INT13接口。
我们知道内核boot时,MBR和boot相关的数据通常是通过BIOS INT13接口读取的,通过该接口可以实现硬盘指定扇区范围的读写,看似
可以满足我的需求,但其实不然,因为BIOS接口只能在实模式下使用,保护模式下无法直接使用,因为实模式下中断的处理方式和地址
宽度跟保护模式都不同,如果要在保护模式中调用BIOS中断接口,只能:
  a、定制idt表,并弄清楚实模式下BIOS中断接口的处理方式,估计难度非常大。
  b、通过vm86()接口进入VM86模式,可以调用BIOS中断接口,但问题是vm86只在32位环境中支持,64位不支持。
综上,这个方法的可行性很小。

2、定制简化的硬件驱动,直接操作硬件。
这种方法,需要深入理解硬件。通常硬盘底层驱动都是厂商自己维护的,算是硬件的核心技术之一了,改写驱动的难度也不小,而且面临
如下问题:
1、硬件种类众多,难以做到兼容。
2、定制驱动和原驱动的竞争和互斥问题。比如中断和DMA的竞争
、对系统IO性能影响问题。我们知道磁盘IO的时间大部分花在寻道上,而块设备层的各种合并和优化算法,其实就是为了减少寻道时间,
而如果系统正常IO期间,穿插了定制驱动的直接IO操作的话,应该会对系统的IO产生影响。

欢迎大家讨论和提供宝贵意见,谢谢!

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
9 [报告]
发表于 2014-07-24 12:52 |只看该作者
镇水铁牛 发表于 2014-07-23 21:02
直接注册虚拟块设备,make_request自己实现,直接翻译bio为scsi cmd后,直接丢给scsi host

感谢,但这个还是要经过scsi层和驱动层的,流程还是有点长。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
10 [报告]
发表于 2014-07-25 08:20 |只看该作者
回复 8# humjb_1983
2、定制简化的硬件驱动,直接操作硬件。
这种方法,需要深入理解硬件。通常硬盘底层驱动都是厂商自己维护的,算是硬件的核心技术之一了,改写驱动的难度也不小,而且面临
如下问题:
1、硬件种类众多,难以做到兼容。
2、定制驱动和原驱动的竞争和互斥问题。比如中断和DMA的竞争
、对系统IO性能影响问题。我们知道磁盘IO的时间大部分花在寻道上,而块设备层的各种合并和优化算法,其实就是为了减少寻道时间,
而如果系统正常IO期间,穿插了定制驱动的直接IO操作的话,应该会对系统的IO产生影响。


按照你黑匣子的思路来说,驱动的方式貌似也有问题了。
因为你希望的是两个驱动同时工作(一个是自带驱动,一个是绕过操作系统层的驱动)。


抛开写磁盘这个问题不说,实现黑匣子功能的最好方式,应该是双kernel更简单一些吧。一个主系统,一个检测系统。检测系统可以就跑在一个低功耗的芯片上,甚至都没有操作系统。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP