关于非标准U盘在BSD下的使用

来源:岁月联盟 编辑:zhu 时间:2008-01-18
关于非标准U盘在BSD下的使用内容简介:【FreeBSD教程】 由于M$过分的纵容,使很多硬件制造商以兼容 win 为目标,而不是以国际标准来制作一些硬件,从而引起在FB下很多希罕古怪的问题,比如ACPI 引用一段话:我们的长期目标是让每一个人都能够在不需要

  【FreeBSD教程】由于M$过分的纵容,使很多硬件制造商以兼容 win 为目标,而不是以国际标准来制作一些硬件,从而引起在FB下很多希罕古怪的问题,比如ACPI

  引用一段话:我们的长期目标是让每一个人都能够在不需要任何用户干预的情况下使用 ACPI。 然而, 目前我们仍然在开发绕过 BIOS 制造商常见错误的方法。 Microsoft 解释器 (acpi.sys 和 acpiec.sys) 并不会严格地检查是否遵守了标准, 因此许多只在 Windows 中测试 ACPI 的 BIOS 制造商很可能永远不会修正他们的 ASL。我们希望不断地找出并用文档说明 Microsoft 的解释器到底答应那些不标准的行为, 并在 FreeBSD 进行对应的修改使它能够正常工作而不需要用户修正 ASL。

  我想 USB 也同样如此,现在回到正题,在很多朋友使用U盘过程中,会出现类似以下的情况(根据不同环境会有所不同,但不影响全局)

  接上时...
  da0 at umass-sim0 bus 0 tgrget 0 lun 0
  da0:<YOUR COMPANY USB Mass Storage> Removable Direct Access SCSI-0 device
  da0:1.000MB/s transfers
  da0:31MB (63744 512byte seators:64H 32S/T 31C)
  umass0:Phase Error , residne = 0
  (da0:umass-sim0:0:0:0):Synchronize
  cache failed, status == 0x4,scsi status = = 0x0

  然后死机或出现系统不稳定的情况

  拨出时...
  Fatal trap 12: page fault while in kernel mode
  fault virtual address = 0x1c
  fault code = supervisor read, page not present
  instruction pointer = 0x8:0xc04f499e
  stack pointer = 0x10:0xcde46c78
  frame pointer = 0x10:0xcde46c88
  code segment = base 0x0, limit 0xfffff, type 0x1b= DPL 0, pres 1, def32 1, gran 1
  processor eflags = interrupt enabled, resume, IOPL = 0
  current process = 22 (irq11: cbb0 cbb1 *)
  trap number = 12
  panic: page fault
  Uptime: 57s
  Cannot dump. No dump device defined.
  Shutting down ACPI
  stray irq9
  Automatic reboot in 15 seconds - press a key on the console to abort
  自动重启

  先说说标准情况下,U盘的配置,在kernel中配置

  # SCSI peripherals
  device scbus # SCSI bus (required for SCSI)
  device da # Direct Access (disks)
  device pass # Passthrough device (direct SCSI access)

  # USB support
  device uhci # UHCI PCI->USB interface
  device ohci # OHCI PCI->USB interface
  device usb # USB Bus (required)
  device umass # Disks/Mass storage - Requires scbus and da

  注重:虽然在核心中 umass 依靠于 scbus 和 da,但是假如你没有 pass 则一样无法使用U盘

  使用U盘的方式

  例:
  
  假如你的U盘映射设备是da0,且只有一个FAT分区

  装载
  
  # mount -t msdos /dev/da0s1 /mnt

  移除(确定你不在 /mnt 或你自定的U盘目录下,且也没有打开相关的文件)
  
  # umount /mnt

  然后直接拨出来就可以了

  
  假如你按照以上配置并重编译核心后就可以正常使用U盘的话,那么恭喜你,下面的部分,你可以忽略过去

  回到主题,似乎看这帖的各位就是冲下面这部分来的 XD,谁叫咱用方块字的人制作标准乱用呢。。

  解决本帖主题出现的问题(我是 FB5.3R,其它版本系统依情况不同,自行修改,假如有问题请跟帖),step by step

  注重:初学者请慎重考虑,以下部分涉及核心代码修改,假如在你不明白或不理解的情况下修改后造成的后果,偶不负任何责任

  1.先想法使你的U盘可以接上(就是能不死机就行)
  
  # usbdevs -v
  Controller /dev/usb0:
  addr 1: full speed, self powered, config 1, UHCI root hub(0x0000), Intel(0x0000), rev 1.00
  port 1 addr 2: full speed, self powered, config 1, General Purpose USB Hub(0x2036), Texas Instruments(0x0451), rev 1.01
  port 1 addr 3: full speed, power 100 mA, config 1, USB Mass Storage(0x8001), YOUR_COMPANY(0x09a6), rev 1.00
  port 2 powered
  port 2 powered

  记下红色的部分,非凡是 USB Mass Storage 部分、0x8001(代表产品编号) 和 0x09a6(代表制造厂家),假如你真的是衰到家了,一接U盘就死,那么你要想尽办法弄到这两个编号和产品名

  2.修改核心

  /usr/src/sys/dev/usb/usbdevs (记得备份哈)
  在适当的地方加入(其中的 0x09a6 是厂商编号,根据情况自行修改)
  vendor USBFLASH 0x09a6 China USB

  在文件尾加入(其中的 0x8001 是产品编号,根据情况自行修改)
  /* China USB flash ram */
  product USBFLASH USBFLASH 0x8001 China USB flash ram

  3.修改核心/usr/src/sys/dev/usb/umass.c (记得备份哈)
  在大约 464 行的 [color=green:4f5b304787]{ VID_EOT, PID_EOT, RID_EOT, 0, 0 } 代码前面插入

  { USB_VENDOR_USBFLASH, USB_PRODUCT_USBFLASH_USBFLASH, RID_WILDCARD,
   UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
   IGNORE_RESIDUE
  },

  4.修改核心/usr/src/sys/cam/scsi/scsi_da.c (记得备份哈)
  
  在大约 321 行插入(其中的 USB Mass Storage 修改成你在第一步中所获得的产品名)
   {
   /*
   * China USB Driver
   */
   {T_DIRECT, SIP_MEDIA_REMOVABLE, "*", "*USB Mass Storage*", "*"},
   /*quirks*/ DA_Q_NO_SYNC_CACHE
   },

  
  5. 重编译核心

  假如你一切都修改正确,操作也没问题的话,那么,一切都平静了,FB又回到了原来的宁静与稳定——祝大家平安夜顺心圣诞快乐

图片内容