2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  一、 課程設(shè)計(jì)目的</b></p><p>  Linux 系統(tǒng)的開(kāi)源性使其在嵌入式系統(tǒng)的開(kāi)發(fā)中得到了越來(lái)越廣泛的應(yīng)用,但其本身并沒(méi)有對(duì)種類(lèi)繁多的硬件設(shè)備都提供現(xiàn)成的驅(qū)動(dòng)程序,特別是由于工程應(yīng)用中的靈活性,其驅(qū)動(dòng)程序更是難以統(tǒng)一,這時(shí)就需開(kāi)發(fā)一套適合于自己產(chǎn)品的設(shè)備驅(qū)動(dòng)。對(duì)用戶(hù)而言,設(shè)備驅(qū)動(dòng)程序隱藏了設(shè)備的具體細(xì)節(jié),對(duì)各種不同設(shè)備提供了一致的接口,一般來(lái)說(shuō)是把設(shè)

2、備映射為一個(gè)特殊的設(shè)備文件,用戶(hù)程序可以像對(duì)其它文件一樣對(duì)此設(shè)備文件進(jìn)行操作。</p><p>  通過(guò)這次課程設(shè)計(jì)可以了解linux的模塊機(jī)制,懂得如何加載模塊和卸載模塊,進(jìn)一步熟悉模塊的相關(guān)操作。加深對(duì)驅(qū)動(dòng)程序定義和設(shè)計(jì)的了解,了解linux驅(qū)動(dòng)的編寫(xiě)過(guò)程,提高自己的動(dòng)手能力。</p><p>  二、 課程設(shè)計(jì)內(nèi)容與要求</p><p><b>  

3、字符設(shè)備驅(qū)動(dòng)程序 </b></p><p>  1、設(shè)計(jì)目的:掌握設(shè)備驅(qū)動(dòng)程序的編寫(xiě)、編譯和裝載、卸載方法,了解設(shè)備文件的創(chuàng)建,并知道如何編寫(xiě)測(cè)試程序測(cè)試自己的驅(qū)動(dòng)程序是否能夠正常工作 </p><p><b>  2、設(shè)計(jì)要求: </b></p><p>  1) 編寫(xiě)一個(gè)簡(jiǎn)單的字符設(shè)備驅(qū)動(dòng)程序,該字符設(shè)備包括打開(kāi)、讀、寫(xiě)、I\O

4、控制與釋放五個(gè)基本操作。 </p><p>  2) 編寫(xiě)一個(gè)測(cè)試程序,測(cè)試字符設(shè)備驅(qū)動(dòng)程序的正確性。 </p><p>  3) 要求在實(shí)驗(yàn)報(bào)告中列出Linux內(nèi)核的版本與內(nèi)核模塊加載過(guò)程。</p><p>  三、 系統(tǒng)分析與設(shè)計(jì) </p><p><b>  1、系統(tǒng)分析</b></p><p&

5、gt;  系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核和應(yīng)用程序之間的接口,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的細(xì)節(jié),這樣在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,它完成以下的功能:</p><p>  1、對(duì)設(shè)備初始化和釋放;</p><p>  2、把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)

6、據(jù);</p><p>  3、讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù);</p><p>  4、檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。</p><p>  字符設(shè)備提供給應(yīng)用程序的是一個(gè)流控制接口,主要包括op e n、clo s e(或r ele as e)、r e ad、w r i t e、i o c t l、p o l l和m m a p等。在系統(tǒng)中添加

7、一個(gè)字符設(shè)備驅(qū)動(dòng)程序,實(shí)際上就是給上述操作添加對(duì)應(yīng)的代碼。對(duì)于字符設(shè)備和塊設(shè)備,L i n u x內(nèi)核對(duì)這些操作進(jìn)行了統(tǒng)一的抽象,把它們定義在結(jié)構(gòu)體fi le_operations中。</p><p><b>  2、系統(tǒng)設(shè)計(jì):</b></p><p><b>  2.1、模塊設(shè)計(jì):</b></p><p><b&g

8、t;  2.2數(shù)據(jù)結(jié)構(gòu)說(shuō)明</b></p><p>  字符設(shè)備驅(qū)動(dòng)主要應(yīng)用了三種數(shù)據(jù)結(jié)構(gòu):①file_operations結(jié)構(gòu),這是設(shè)備驅(qū)動(dòng)程序所提供的一組用一個(gè)結(jié)構(gòu)向系統(tǒng)進(jìn)行說(shuō)明的入口點(diǎn);②file結(jié)構(gòu),主要用于與文件系統(tǒng)對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序。代表一個(gè)打開(kāi)的文件,它由內(nèi)核在open時(shí)創(chuàng)建,并傳遞給在該文件上進(jìn)行操作的所有函數(shù),直到碰到最后的close函數(shù)。在文件的所有實(shí)例都被關(guān)閉之后,內(nèi)核會(huì)釋放這個(gè)

9、數(shù)據(jù)結(jié)構(gòu);③ inode結(jié)構(gòu),提供了關(guān)于特殊設(shè)備文件/dev/mydev的信息。</p><p>  各個(gè)結(jié)構(gòu)的定義如下:</p><p> ?。?)file_operations結(jié)構(gòu):</p><p>  static const struct file_operations my_fops ={</p><p>  .owner = TH

10、IS_MODULE,</p><p>  .llseek = my_llseek,</p><p>  .read = my_read,</p><p>  .write = my_write,</p><p>  .open = my_open,</p><p>  .release = my_release,<

11、;/p><p>  .unlocked_ioctl = ioctl,</p><p><b>  };</b></p><p> ?。?)file結(jié)構(gòu):</p><p><b>  1)讀</b></p><p>  static ssize_t my_read(struct f

12、ile *filp, char __user *buf, size_t size, loff_t *ppos) </p><p><b>  2)寫(xiě)</b></p><p>  static ssize_t my_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)

13、</p><p>  3)seek文件定位</p><p>  static loff_t my_llseek(struct file *filp, loff_t offset, int whence)</p><p><b>  4)I\O控制</b></p><p>  static int ioctl (struc

14、t file *file, unsigned int cmd, unsigned long arg)</p><p>  (3)inode結(jié)構(gòu):</p><p><b>  1) 打開(kāi)</b></p><p>  int my_open(struct inode *inode, struct file *filp)</p><

15、;p><b>  2) 釋放</b></p><p>  int my_release(struct inode *inode, struct file *filp)</p><p>  2.3、算法流程圖:</p><p>  四、系統(tǒng)測(cè)試與調(diào)試分析</p><p><b>  4.1 系統(tǒng)測(cè)試<

16、/b></p><p>  4.1.1啟動(dòng)超級(jí)管理員模式并輸入密碼</p><p>  命令:sudo su</p><p>  4.1.2對(duì)源程序進(jìn)行編譯</p><p><b>  命令:make</b></p><p>  4.1.3加載驅(qū)動(dòng)程序并查看</p><p

17、>  命令:insmod lydev.ko和lsmod</p><p>  4.1.4顯示主設(shè)備號(hào)</p><p>  命令:cat /proc/devices</p><p>  4.1.5創(chuàng)建節(jié)點(diǎn)并查看</p><p>  命令:mknod /dev/lydev 55 0和cd /dev</p><p>  

18、4.1.6編譯測(cè)試程序</p><p>  命令:gcc –o t test.c</p><p>  4.1.7運(yùn)行測(cè)試函數(shù)</p><p><b>  命令:./t</b></p><p>  4.1.8進(jìn)行打開(kāi)設(shè)備操作</p><p><b>  命令:1</b><

19、/p><p>  4.1.9進(jìn)行寫(xiě)操作并輸入hello</p><p><b>  命令:2</b></p><p>  4.1.10進(jìn)行讀操作</p><p><b>  命令:3</b></p><p>  4.1.11進(jìn)行I/O控制</p><p>

20、<b>  命令:4</b></p><p>  4.1.12進(jìn)行釋放設(shè)備操作</p><p><b>  命令:5</b></p><p>  4.1.13進(jìn)行退出操作</p><p><b>  命令:6</b></p><p>  4.1.14卸載

21、驅(qū)動(dòng)程序</p><p>  命令:rmmod lydev</p><p>  4.1.15查看日志</p><p><b>  命令:dmesg</b></p><p>  4.1.16刪除節(jié)點(diǎn)并查看</p><p>  命令:rm lydev和ls</p><p>&l

22、t;b>  4.2調(diào)試分析</b></p><p>  最開(kāi)始的時(shí)候沒(méi)有啟用sudo模式,導(dǎo)致很多命令不能執(zhí)行,啟用模式的時(shí)候需要輸入密碼,但是輸入密碼的時(shí)候是不顯示東西的以為出錯(cuò),查閱資料之后才知道是應(yīng)有的現(xiàn)象。</p><p>  程序測(cè)試一遍之后再次測(cè)試很多命令不能執(zhí)行,原因是第一次測(cè)試之后產(chǎn)生的各種文件沒(méi)有刪除,再次測(cè)試會(huì)顯示已存在。</p><

23、;p>  有一次測(cè)試程序,不能卸載驅(qū)動(dòng),用lsmod查看有兩個(gè)進(jìn)程使用,后來(lái)強(qiáng)制關(guān)機(jī)才能正常使用,原因不明,以后要加強(qiáng)學(xué)習(xí)。</p><p><b>  五、程序清單</b></p><p><b>  1.主程序</b></p><p>  #include <linux/module.h></p

24、><p>  #include <linux/types.h></p><p>  #include <linux/fs.h></p><p>  #include <linux/errno.h></p><p>  #include <linux/mm.h></p><p>

25、;  #include <linux/sched.h></p><p>  #include <linux/init.h></p><p>  #include <linux/cdev.h></p><p>  #include <linux/slab.h></p><p>  #include

26、 <asm/io.h></p><p>  #include <asm/system.h></p><p>  #include <asm/uaccess.h></p><p>  #include "lydev.h"</p><p>  #define SCULL_IOC_MAGIC

27、'k'</p><p>  #define SCULL_IOCRESET _IO(SCULL_IOC_MAGIC, 0)</p><p>  #define SCULL_IOCSQUANTUM _IOW(SCULL_IOC_MAGIC, 1, int)</p><p>  #define SCULL_IOCSQSET _IOW(SCULL_IOC_M

28、AGIC, 2, int)</p><p>  #define SCULL_IOCTQUANTUM _IO(SCULL_IOC_MAGIC, 3)</p><p>  #define SCULL_IOCTQSET _IO(SCULL_IOC_MAGIC, 4)</p><p>  #define SCULL_IOCGQUANTUM _IOR(SCULL_IOC_MA

29、GIC, 5, int)</p><p>  #define SCULL_IOCGQSET _IOR(SCULL_IOC_MAGIC, 6, int)</p><p>  #define SCULL_IOCQQUANTUM _IO(SCULL_IOC_MAGIC, 7)</p><p>  #define SCULL_IOCQQSET _IO(SCULL_IOC_M

30、AGIC, 8)</p><p>  #define SCULL_IOCXQUANTUM _IOWR(SCULL_IOC_MAGIC, 9, int)</p><p>  #define SCULL_IOCXQSET _IOWR(SCULL_IOC_MAGIC,10, int)</p><p>  #define SCULL_IOCHQUANTUM _IO(SCUL

31、L_IOC_MAGIC, 11)</p><p>  #define SCULL_IOCHQSET _IO(SCULL_IOC_MAGIC, 12)</p><p>  #define SCULL_IOC_MAXNR 14</p><p>  static int ly_major = 55;</p><p>  module_param(l

32、y_major, int, S_IRUGO);</p><p>  struct ly_dev *ly_devp; /*設(shè)備結(jié)構(gòu)體指針*/</p><p>  struct cdev cdev;</p><p>  static int ioctl (struct file *file, unsigned int cmd, unsigned long arg);

33、</p><p>  /*文件打開(kāi)函數(shù)*/</p><p>  int ly_open(struct inode *inode, struct file *filp)</p><p><b>  {</b></p><p>  struct ly_dev *dev;</p><p>  /*獲取次

34、設(shè)備號(hào)*/</p><p>  int num = MINOR(inode->i_rdev);</p><p>  if (num >= MYDEV_NR_DEVS)</p><p>  return -ENODEV;</p><p>  dev = &ly_devp[num];</p><p> 

35、 /*將設(shè)備描述結(jié)構(gòu)指針賦值給文件私有數(shù)據(jù)指針*/</p><p>  filp->private_data = dev;</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  /*文件釋放函數(shù)*/</p><p

36、>  int ly_release(struct inode *inode, struct file *filp)</p><p><b>  {</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>&l

37、t;b>  /*讀函數(shù)*/</b></p><p>  static ssize_t ly_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)</p><p><b>  {</b></p><p>  unsigned long p = *

38、ppos;</p><p>  unsigned int count = size;</p><p>  int ret = 0;</p><p>  struct ly_dev *dev = filp->private_data; /*獲得設(shè)備結(jié)構(gòu)體指針*/</p><p>  /*判斷讀位置是否有效*/</p><

39、;p>  if (p >= MYDEV_SIZE)</p><p><b>  return 0;</b></p><p>  if (count > MYDEV_SIZE - p)</p><p>  count = MYDEV_SIZE - p;</p><p>  /*讀數(shù)據(jù)到用戶(hù)空間*/<

40、/p><p>  if (copy_to_user(buf, (void*)(dev->data + p), count))</p><p><b>  {</b></p><p>  ret = - EFAULT;</p><p><b>  }</b></p><p>

41、<b>  else</b></p><p><b>  {</b></p><p>  *ppos += count;</p><p>  ret = count; </p><p>  printk(KERN_INFO "read %d bytes(s) from %lx\n"

42、;, count, p);</p><p><b>  }</b></p><p>  return ret;</p><p><b>  }</b></p><p><b>  /*寫(xiě)函數(shù)*/</b></p><p>  static ssize_t

43、ly_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)</p><p><b>  {</b></p><p>  unsigned long p = *ppos;</p><p>  unsigned int count = size;<

44、;/p><p>  int ret = 0;</p><p>  struct ly_dev *dev = filp->private_data; /*獲得設(shè)備結(jié)構(gòu)體指針*/</p><p>  /*分析和獲取有效的寫(xiě)長(zhǎng)度*/</p><p>  if (p >= MYDEV_SIZE)</p><p><

45、;b>  return 0;</b></p><p>  if (count > MYDEV_SIZE - p)</p><p>  count = MYDEV_SIZE - p;</p><p>  /*從用戶(hù)空間寫(xiě)入數(shù)據(jù)*/</p><p>  if (copy_from_user(dev->data + p

46、, buf, count))</p><p>  ret = - EFAULT;</p><p><b>  else</b></p><p><b>  {</b></p><p>  *ppos += count;</p><p>  ret = count;</p

47、><p>  printk(KERN_INFO "written %d bytes(s) from %lx\n", count, p);</p><p><b>  }</b></p><p>  return ret;</p><p><b>  }</b></p>

48、<p>  /*I\O控制函數(shù)*/</p><p>  static int ioctl (struct file *file, unsigned int cmd, unsigned long arg)</p><p><b>  {</b></p><p>  if(_IOC_TYPE(cmd)!=SCULL_IOC_MAGIC)&

49、lt;/p><p><b>  {</b></p><p>  return -EFAULT;</p><p><b>  }</b></p><p>  if(_IOC_NR(cmd)>SCULL_IOC_MAXNR)</p><p><b>  {</b

50、></p><p>  return -EFAULT;</p><p><b>  }</b></p><p>  switch(cmd)</p><p><b>  {</b></p><p>  case SCULL_IOCRESET:</p><

51、;p>  printk("SCULL_IOCRESET + %lx",arg);</p><p><b>  break;</b></p><p>  case SCULL_IOCSQUANTUM: /* Set: arg points to the value */</p><p>  printk("SC

52、ULL_IOCSQUANTUM + %lx",arg);</p><p><b>  break;</b></p><p>  case SCULL_IOCTQUANTUM: /* Tell: arg is the value */</p><p>  printk("SCULL_IOCTQUANTUM + %lx"

53、;,arg);</p><p><b>  break;</b></p><p>  case SCULL_IOCGQUANTUM: /* Get: arg is pointer to result */</p><p>  printk("SCULL_IOCGQUANTUM + %lx",arg);</p>

54、<p><b>  break;</b></p><p>  case SCULL_IOCQQUANTUM: /* Query: return it (it's positive) */</p><p>  printk("SCULL_IOCQQUANTUM + %lx",arg);</p><p><

55、;b>  break;</b></p><p>  case SCULL_IOCXQUANTUM: /* eXchange: use arg as pointer */</p><p>  printk("SCULL_IOCXQUANTUM + %lx",arg);</p><p><b>  break;</b

56、></p><p>  case SCULL_IOCHQUANTUM: /* sHift: like Tell + Query */</p><p>  printk("SCULL_IOCHQUANTUM + %lx",arg);</p><p><b>  break;</b></p><p>

57、;<b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  /* seek文件定位函數(shù) */</p><p>  static loff_t ly_llseek(struct file *filp

58、, loff_t offset, int whence)</p><p><b>  {</b></p><p>  loff_t newpos;</p><p>  switch(whence) {</p><p>  case 0: /* SEEK_SET */</p><p>  newpo

59、s = offset;</p><p><b>  break;</b></p><p>  case 1: /* SEEK_CUR */</p><p>  newpos = filp->f_pos + offset;</p><p><b>  break;</b></p>

60、<p>  case 2: /* SEEK_END */</p><p>  newpos = MYDEV_SIZE -1 + offset;</p><p><b>  break;</b></p><p>  default: /* can't happen */</p><p>  return

61、-EINVAL;</p><p><b>  }</b></p><p>  if ((newpos<0) || (newpos>MYDEV_SIZE))</p><p>  return -EINVAL; </p><p>  filp->f_pos = newpos;</p><

62、p>  return newpos;</p><p><b>  }</b></p><p>  /*文件操作結(jié)構(gòu)體*/</p><p>  static const struct file_operations ly_fops =</p><p><b>  {</b></p>

63、<p>  .owner = THIS_MODULE,</p><p>  .llseek = ly_llseek,</p><p>  .read = ly_read,</p><p>  .write = ly_write,</p><p>  .open = ly_open,</p><p>  .r

64、elease = ly_release,</p><p>  .unlocked_ioctl = ioctl,</p><p><b>  };</b></p><p>  /*設(shè)備驅(qū)動(dòng)模塊加載函數(shù)*/</p><p>  static int lydev_init(void)</p><p>&

65、lt;b>  {</b></p><p>  int result;</p><p><b>  int i;</b></p><p>  dev_t devno = MKDEV(ly_major, 0);</p><p>  /* 靜態(tài)申請(qǐng)?jiān)O(shè)備號(hào)*/</p><p>  if

66、(ly_major)</p><p>  result = register_chrdev_region(devno, 2, "lydev");</p><p>  else /* 動(dòng)態(tài)分配設(shè)備號(hào) */</p><p><b>  {</b></p><p>  result = alloc_chrd

67、ev_region(&devno, 0, 2, "lydev");</p><p>  ly_major = MAJOR(devno);</p><p><b>  }</b></p><p>  if (result < 0)</p><p>  return result;</

68、p><p>  /*初始化cdev結(jié)構(gòu)*/</p><p>  cdev_init(&cdev, &ly_fops);</p><p>  cdev.owner = THIS_MODULE;</p><p>  cdev.ops = &ly_fops;</p><p>  /* 注冊(cè)字符設(shè)備 */&

69、lt;/p><p>  cdev_add(&cdev, MKDEV(ly_major, 0), MYDEV_NR_DEVS);</p><p>  /* 為設(shè)備描述結(jié)構(gòu)分配內(nèi)存*/</p><p>  ly_devp = kmalloc(MYDEV_NR_DEVS * sizeof(struct ly_dev), GFP_KERNEL);</p>

70、<p>  if (!ly_devp) /*申請(qǐng)失敗*/</p><p><b>  {</b></p><p>  result = - ENOMEM;</p><p>  goto fail_malloc;</p><p><b>  }</b></p><p>

71、;  memset(ly_devp, 0, sizeof(struct ly_dev));</p><p>  /*為設(shè)備分配內(nèi)存*/</p><p>  for (i=0; i < MYDEV_NR_DEVS; i++)</p><p><b>  {</b></p><p>  ly_devp[i].size

72、= MYDEV_SIZE;</p><p>  ly_devp[i].data = kmalloc(MYDEV_SIZE, GFP_KERNEL);</p><p>  memset(ly_devp[i].data, 0, MYDEV_SIZE);</p><p><b>  }</b></p><p>  printk

73、("模塊加載成功!\n");</p><p><b>  return 0;</b></p><p>  fail_malloc:</p><p>  unregister_chrdev_region(devno, 1);</p><p>  return result;</p><

74、;p><b>  }</b></p><p>  /*模塊卸載函數(shù)*/</p><p>  static void lydev_exit(void)</p><p><b>  {</b></p><p>  cdev_del(&cdev); /*注銷(xiāo)設(shè)備*/</p>&

75、lt;p>  kfree(ly_devp); /*釋放設(shè)備結(jié)構(gòu)體內(nèi)存*/ unregister_chrdev_region(MKDEV(ly_major, 0), 2); /*釋放設(shè)備號(hào)*/</p><p>  printk("模塊卸載成功!\n");</p><p><b>  }</b></p><p>  MO

76、DULE_LICENSE("GPL");</p><p>  module_init(lydev_init);</p><p>  module_exit(lydev_exit);</p><p><b>  2.測(cè)試程序</b></p><p>  #include <stdio.h>&

77、lt;/p><p>  #include<sys/types.h></p><p>  #include<unistd.h></p><p>  #include<fcntl.h></p><p>  #include<linux/rtc.h></p><p>  #incl

78、ude<linux/ioctl.h></p><p>  #include <string.h></p><p>  #include <stdlib.h></p><p>  #define MAXBUF 20</p><p>  #define SCULL_IOC_MAGIC 'k'&l

79、t;/p><p>  #define SCULL_IOCRESET _IO(SCULL_IOC_MAGIC, 0)</p><p>  #define SCULL_IOCSQUANTUM _IOW(SCULL_IOC_MAGIC, 1, int)</p><p>  #define SCULL_IOCSQSET _IOW(SCULL_IOC_MAGIC, 2, int)

80、</p><p>  #define SCULL_IOCTQUANTUM _IO(SCULL_IOC_MAGIC, 3)</p><p>  #define SCULL_IOCTQSET _IO(SCULL_IOC_MAGIC, 4)</p><p>  #define SCULL_IOCGQUANTUM _IOR(SCULL_IOC_MAGIC, 5, int)&

81、lt;/p><p>  #define SCULL_IOCGQSET _IOR(SCULL_IOC_MAGIC, 6, int)</p><p>  #define SCULL_IOCQQUANTUM _IO(SCULL_IOC_MAGIC, 7)</p><p>  #define SCULL_IOCQQSET _IO(SCULL_IOC_MAGIC, 8)</

82、p><p>  #define SCULL_IOCXQUANTUM _IOWR(SCULL_IOC_MAGIC, 9, int)</p><p>  #define SCULL_IOCXQSET _IOWR(SCULL_IOC_MAGIC,10, int)</p><p>  #define SCULL_IOCHQUANTUM _IO(SCULL_IOC_MAGIC,

83、11)</p><p>  #define SCULL_IOCHQSET _IO(SCULL_IOC_MAGIC, 12)</p><p>  #define SCULL_IOC_MAXNR 14</p><p>  int main()</p><p><b>  {</b></p><p> 

84、 int testdev;</p><p>  int i,flag = 1,t,len = -1;</p><p><b>  char sel;</b></p><p>  char buf[MAXBUF],tmp[MAXBUF];</p><p>  printf("1、打開(kāi)設(shè)備\n2、寫(xiě)操作\n3、讀操

85、作\n4、I/O控制\n5、釋放設(shè)備\n6、退出\n");</p><p>  while(1) {</p><p>  printf("請(qǐng)輸入要執(zhí)行的操作:");</p><p>  sel = getchar();</p><p>  getchar();</p><p>  swit

86、ch(sel) { </p><p>  case '1':testdev = open("/dev/lydev",O_RDWR);</p><p>  if ( testdev < 0 ) {</p><p>  printf("設(shè)備打開(kāi)失敗 \n");</p><p>&

87、lt;b>  break;</b></p><p><b>  }</b></p><p><b>  flag = 0;</b></p><p>  printf("設(shè)備打開(kāi)成功!\n"</p><p><b>  break; </b>

88、;</p><p>  /*case '2':if (flag) {</p><p>  printf("請(qǐng)先打開(kāi)設(shè)備!\n");</p><p><b>  break;</b></p><p><b>  }</b></p><p> 

89、 printf("請(qǐng)輸入寫(xiě)入的字符串:");</p><p>  gets(tmp);</p><p>  len = strlen(tmp);</p><p>  printf("len = %d\n",len);</p><p>  t = write(testdev,tmp,len);</p

90、><p>  if (t < 0) {</p><p>  printf("寫(xiě)操作失??!\n");</p><p><b>  break;</b></p><p><b>  }</b></p><p>  printf("%s字符串寫(xiě)入成功

91、!\n",tmp);</p><p><b>  break;</b></p><p>  case '3':if (flag) {</p><p>  printf("請(qǐng)先打開(kāi)設(shè)備!\n");</p><p><b>  break;</b></

92、p><p><b>  }</b></p><p>  if (len < 0) {</p><p>  printf("請(qǐng)先進(jìn)行寫(xiě)操作!\n");</p><p><b>  break;</b></p><p><b>  }</b&

93、gt;</p><p>  t = read(testdev,buf,len);</p><p>  if (t < 0) {</p><p>  printf("讀操作失敗!\n");</p><p><b>  break;</b></p><p><b>

94、  }</b></p><p>  printf("讀操作成功!結(jié)果為:%s\n",buf);</p><p><b>  break;*/</b></p><p>  case '2':if (flag) {</p><p>  printf("請(qǐng)先打開(kāi)設(shè)備!\

95、n");</p><p><b>  continue;</b></p><p><b>  }</b></p><p>  printf("請(qǐng)輸入要寫(xiě)入的字符串:");</p><p>  gets(tmp);</p><p>  len =

96、sizeof(tmp);//strlen(tmp);</p><p>  t = write(testdev,tmp,len);</p><p>  if(t < 0) {</p><p>  perror("寫(xiě)操作失??!\n");</p><p><b>  exit(-1);</b><

97、/p><p><b>  }</b></p><p>  printf("字符串:%s寫(xiě)入成功!\n",tmp);</p><p><b>  break;</b></p><p>  case '3':if (flag) {</p><p>

98、  printf("請(qǐng)先打開(kāi)設(shè)備!\n");</p><p><b>  continue;</b></p><p><b>  }</b></p><p>  lseek(testdev,0,SEEK_SET);</p><p>  t = read(testdev,buf,l

99、en);</p><p>  if(t < 0) {</p><p>  perror("讀操作失?。n");</p><p><b>  exit(-1);</b></p><p><b>  }</b></p><p>  printf(&qu

100、ot;讀操作成功!結(jié)果為:%s\n",buf);</p><p><b>  break;</b></p><p>  case '4':if (flag) {</p><p>  printf("請(qǐng)先打開(kāi)設(shè)備!\n");</p><p><b>  break;&

101、lt;/b></p><p><b>  }</b></p><p>  t = ioctl(testdev,SCULL_IOCTQUANTUM,3);</p><p>  if(t < 0) {</p><p>  printf("IO控制失敗\n");</p><p

102、><b>  } else {</b></p><p>  printf("IO控制成功\n");</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case '5':if (

103、flag) {</p><p>  printf("請(qǐng)先打開(kāi)設(shè)備!\n");</p><p><b>  break;</b></p><p><b>  }</b></p><p>  //release(testdev);</p><p>  clos

104、e(testdev);</p><p>  printf("設(shè)備釋放成功!\n");</p><p><b>  flag = 1;</b></p><p><b>  break;</b></p><p>  case '6':close(testdev);&l

105、t;/p><p><b>  exit(0);</b></p><p>  default:printf("輸入有誤!\n");</p><p><b>  break;</b></p><p><b>  }</b></p><p>&

106、lt;b>  }</b></p><p><b>  }</b></p><p><b>  六、體會(huì)與自我評(píng)價(jià)</b></p><p>  在這次課程設(shè)計(jì)之前從沒(méi)有接觸過(guò)Linux系統(tǒng),Linux系統(tǒng)這個(gè)詞作為計(jì)算機(jī)系的學(xué)生都不會(huì)陌生,多多少少也知道些它的歷史,知道它是開(kāi)放的免費(fèi)的操作系統(tǒng),支持開(kāi)源軟件

107、的開(kāi)發(fā),但是,Linux系統(tǒng)到底是怎樣的一個(gè)系統(tǒng),甚至對(duì)它的界面都從未見(jiàn)過(guò)。這次課程設(shè)計(jì)使我接觸并了解了Linux系統(tǒng),見(jiàn)識(shí)了它的界面以及種種與Windos系統(tǒng)不同之處,增長(zhǎng)了見(jiàn)識(shí)。</p><p>  驅(qū)動(dòng)相較于Linux系統(tǒng)是更加熟悉的一個(gè)名詞,每次重裝系統(tǒng)都要安裝各種各樣的驅(qū)動(dòng),不然計(jì)算機(jī)就不能正常運(yùn)行,各個(gè)硬件就不能發(fā)揮作用,通過(guò)這次課程設(shè)計(jì),對(duì)Linux系統(tǒng)的驅(qū)動(dòng)有了比較深入的認(rèn)識(shí):。Linux下的設(shè)備

108、驅(qū)動(dòng)程序分為字符設(shè)備驅(qū)動(dòng)、快設(shè)備驅(qū)動(dòng)和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序。驅(qū)動(dòng)程序在硬件和軟件之間起紐帶的作用,用戶(hù)進(jìn)程是通過(guò)設(shè)備文件來(lái)與實(shí)際的硬件打交道.每個(gè)設(shè)備文件都有其文件屬性(c/b),表示是字符設(shè)備還塊設(shè)備。另外每個(gè)文件都有兩個(gè)設(shè)備號(hào),第一個(gè)是主設(shè)備號(hào),標(biāo)識(shí)驅(qū)動(dòng)程序,第二個(gè)是從設(shè)備號(hào),標(biāo)識(shí)使用同一個(gè)設(shè)備驅(qū)動(dòng)程序的不同的硬件設(shè)備。</p><p>  這次的課程設(shè)計(jì)提高了自己的自我學(xué)習(xí)能力和交流能力,Linux系統(tǒng)是以前學(xué)

109、習(xí)從未接觸到的東西,為了完成設(shè)計(jì),需要自己查詢(xún)各種資料,并且與同學(xué)交流學(xué)習(xí)心得,討論程序運(yùn)行的細(xì)節(jié),完善自己的程序。</p><p>  這次課程設(shè)計(jì)使我反省很多,無(wú)論Linux還是驅(qū)動(dòng)程序都是掛在嘴邊的東西,但是對(duì)于這些自己并沒(méi)有進(jìn)行過(guò)深入的了解,導(dǎo)致這次課程設(shè)計(jì)一切都要從頭開(kāi)始,進(jìn)行的并不順利,以后對(duì)于一些經(jīng)常提起,在將來(lái)有可能用的到的東西要未雨綢繆,先做了解,將來(lái)的時(shí)候才能輕松應(yīng)對(duì),事半功倍。</p&

110、gt;<p><b>  七、參考文獻(xiàn)</b></p><p>  [1] 湯子瀛 編著,《計(jì)算機(jī)操作系統(tǒng)(修訂版)》,西安電子科技大學(xué)出版社,2001年</p><p>  [2] Alessandro Rubini.Linux設(shè)備驅(qū)動(dòng)程序[M].魏永明,耿兵,鐘書(shū)毅,譯.北京:中國(guó)電力出版社,2006.</p><p>  [

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論