errata
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. While most  of the source  code printed in  the  book is part  of real
  2. program files, a few of  the examples are  standalone excerpts I wrote
  3. out of  my mind. Unfortunately, I  managed to fit  a pair of errors in
  4. these code lines.
  5. Page XXX
  6. ========
  7. In chapter  9 ("Interrupt Handling"),  in the section called "Going to
  8. Sleep Without Races", the code shown has a subtle bug.
  9. The correct implementation of the trick looks like the following:
  10. add_wait_queue(&short_queue, &wait);
  11.         do {
  12.             current->state = TASK_INTERRUPTIBLE;
  13.             schedule();
  14.         }
  15.         while ((short_head == short_tail)
  16. && !(current->signal & ~current->blocked) );
  17.         remove_wait_queue(&short_queue, &wait);
  18.         if (current->signal & ~current->blocked) /* a signal arrived */
  19.             return -ERESTARTSYS;
  20. This is different from the version shown in the printed text as signal
  21. decoding must be performed *after* calling remove_wait_queue().
  22. Page YYY
  23. ========
  24. In chapter 17, in the  section called "Using  the New Interface",  the
  25. ioctl() implementation  shown includes a  stupid  mistake: "retval" is
  26. not initilized. A correct implementation is:
  27. int another_ioctl(struct inode *inode, struct file *filp,
  28.               unsigned int cmd, unsigned long arg);
  29. {
  30. int retval = -EINVAL, size = _IOC_SIZE(cmd);
  31. if (_IOC_DIR(cmd) & _IOC_READ) {
  32.     if (!access_ok(VERIFY_WRITE, (void *)arg, size))
  33. retturn -EFAULT;
  34.     }
  35. else if (_IOC_DIR(cmd) & _IOC_WRITE) {
  36.     if (!access_ok(VERIFY_READ, (void *)arg, size))
  37. return -EFAULT
  38. switch(cmd) {
  39.     case NEW_GETVALUE:
  40.         retval = __put_user(another_value,arg);
  41.         break;
  42.     case NEW_SETVALUE:
  43.         retval = __get_user(another_value,arg);
  44.         break;
  45.     }
  46. return retval;
  47. }
  48. Another possibility is just stating "retval = 1"  and leaving the code
  49. as shown,  but I don't like   the unadorned boolean  value. Naturally,
  50. there are a lot of alternatives to this setup of ioctl().
  51. ----------------------------------------------------------------------
  52. The following notes are about two differences between my intentions,
  53. as stated in the printed book, and the actual outcome of the sample
  54. files as you find them on the ftp site.
  55. Allocating DMA memory
  56. =====================
  57. In  the section called "Allocating the  DMA buffer",  in chapter 13, I
  58. refer   to  an  "allocator.c"   module,  which    performs  aggressive
  59. allocation.  After using  such a module  in practice, I  found that it
  60. didn't  get reliable results,    so  I dropped   it altogether.    The
  61. implementation you find in the sample files (misc-modules/allocator.c)
  62. uses high memory to allocate  the DMA buffer,  in the way explained in
  63. the same section of chapter 13. misc-modules/README.allocator explains
  64. the issue to a finer detail.
  65. Decoding Oops messages
  66. ======================
  67. The version of "oops"  you find on the ftp  site only decodes messages
  68. generated on the  Intel platform. I didn't manage  to find the time to
  69. implement it on the Alpha and the Sparc, as I intended to. As a matter
  70. of fact, Oops messages on RISC platforms include less information than
  71. Intel ones,  and they are harder to   use.