📄 first_report.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head> <meta http-equiv="content-type" content="text/html; charset=GB2312"> <title>First Report</title></head><body><pre></pre><div style="text-align: center;"><big><big style="color: rgb(255, 0, 0); font-weight: bold;"><big><big>开 题 报 告</big></big></big></big><br> </div><pre> <big><big style="font-weight: bold; color: rgb(102, 102, 204);">毕业设计课题:</big> 实现一个事实上的USB设备及其GNU/Linux驱动程序 并相关内核代码的分析 <big style="font-weight: bold; color: rgb(102, 102, 204);">关键词:</big> 1 USB设备 2 Linux驱动程序 3 内核 <big style="color: rgb(102, 102, 204);"><span style="font-weight: bold;">破题分析:</span></big> 1 USB虽然在技术上并没有什么太令人激动的地方,但其设计者显然借鉴了计算机网络所使用的某些设计原则。比如分层。然而这也使得设计一个USB外围设备不再能够仅仅应用接口电路级的知识——为了处理复杂的USB协议,任何一个USB外设必须也是“智能”的 在这个项目中,可能采用Cypress公司提供的CY7C63xxx系列单片机,该片支持USB接口及包括有专为USB优化的指令,同时提供两组通用的I/O端口。需要完成的工作是:按芯片手册设计好电路并完成使用汇编语言的固件代码,理解USB关键协议。基于USB1.1,并且不打算使用USB2.0 *对“事实上”一词的解释:也许就是一个可以软件控制的灯。但我希望“最终”产品会有一些通用的输入和输出模块,比如光/热探测头,比如小风扇/空调遥控等等,或许那时她的名字是“USB-Mini-Nurse” *整个项目并没有工程/学术背景,但我以为毕业设计毋须过于功利,重要的是有意思并且能够提高水平 2 和USB相比,Linux带给我们更多心动。一个真正的黑客,掌握并灵活运用Linux内核是最基础但也是最能傲世的能力。希望能通过这个项目初步掌握编写核心代码的技术 在这个项目中,会采用模块机制完成驱动程序。需要完成的工作有:学习基本的模块技术,学习驱动程序的概念,学习USB相关的核心调用,完成驱动程序的0.1版本。基于Kernel version 2.4.25,并可能向2.6移植 3 对内核的分析是大拿们的专利,因此除了尽力而为外,不能再说什么了 <big style="font-weight: bold; color: rgb(102, 102, 204);">可能遇到的问题:</big> 因为都是从头学起,所以几乎全是问题,否则我就不会选择此作为毕业设计了。择其要者: 1 对于硬件开发我一无所知,不知道如何下手/调试,甚至不知道如何购买所需要的零件 2 对于USB外设,似乎开发它比使用它要困难得多 3 对于软件方面,这是重点,至少想重点研究,但不知道对硬件问题的处理是否会影响它 <big style="font-weight: bold; color: rgb(102, 102, 204);"> 细节:</big> 1 内核模块 .vs. 用户空间程序 *从名字上就可以看到第一个不同:前者运行在内核空间,而后者运行在受限的用户空间 *以Unix哲学的观点,前者通常提供机制而后者则部署策略,机制与策略的分离是隐藏在Unix设计后最好的思想之一(另一些可以参考《the Art of Unix Programming》) *前者在从硬盘向内存转移后向操作系统链入某种机制(函数和变量)以便为其它程序服务,后者则在加载后顺着main()一直前行并在到达位部后退出,其间通过不同的系统调用顺序达到部署策略的目的 *在核心代码里不时使用一个人们已经忘却但还存在的C语言指令:goto!此常用于处理错误 2 作为驱动程序的Linux动态可加载内核模块 *提供机制(而非策略)正是驱动程序的全部 *编写一个模块并没有想象的那么困难,困难在于理解设备并优化其性能 3 一个真正的内核模块(还不能成为驱动,它的功能仅仅是在被加载和移除时叫唤一声): #define MODULE #include <linux/module.h> int init_module(void) {printk("<1>Hi! This is kernel talk to you.\n");return 0;} void cleanup_module(void) {printk("<1>Bey! Welcome to be a Hacker.\n");} 与用户空间程序的又一个不同是,模块在载入时才被连接(至内核而非libc),因此最终的编译指令一定含参数-c 4 设备号: 对计算机而言,更擅长的是整数而非字符串。传统的Unix为每一类经典设备文件分配了一个固定的整数,用来 钩上相应的驱动程序。次设备号只是由那些主设备号已经确定的驱动程序使用,内核的其他部分不会用到它, 而只是把它传递给驱动程序:一个驱动程序控制多个设备是常有的事情,而次设备号为驱动程序提供了一个区 分设备的方法。 5 第一个重要的数据结构:file_struct *Unix中,everything is file *设备也不例外 *设备驱动程序实现了系统可能对该设备的所有操作 *file_struct中的每个元素正是指向这些操作的函数指针 *最终调用这些操作的系统调用函数被命名为open/read/write... *对不同的字符设备文件进行某种同名操作(比如对MODEM和TTY分别进行open),操作系统根据register_chrdev的定义和file_operations的实现来作出具体执行何代码的判断 6 第二个重要的数据结构:file *不是ANSI C中的FILE,file存在于内核空间并由内核自行维护 *file结构代表一个Unix广义文件 *当执行open系统调用时,系统创建该结构实例,并在close时刷新或释放该结构实例 *驱动程序毋须填写file结构,readonly 7 关于USB协议及设备在开题报告中的体现,将另附一文(Cypress芯片手册的翻译) <big style="color: rgb(102, 102, 204);"><span style="font-weight: bold;"> 参考文献:</span></big> 1 Alessandro Rubini和Jonathan Corbet著 魏永明/骆刚和姜君译 《Linux设备驱动程序》第二版 中国电力出版社 2002 2 Peter Jay Salzman和Ori Pomerantz著 《Linux Kernel Module Programming Guide》2.4.0 LDP 2003 3 Detlef Fliegl著 《Programming Guide for Linux USB Device Drivers》 http://usb.cs.tum.edu 2000 4 Eric Steven Raymond著 《The Art oh Unix Programming》 Internet FAQ Archives 2003 5 毛德操和胡希明著 《Linux内核源代码情景分析》 浙江大学出版社 2002 6 》http://www.cypress.com《 7 》the documents and sources of Linux Kernel《 8 》http://www.ibm.com/developerwork/cn《 <span style="color: rgb(51, 204, 0); font-style: italic;">.end</span></big></pre></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -