当前位置: 代码迷 >> 驱动开发 >> 嵌入式学习札记(二)——初识驱动开发
  详细解决方案

嵌入式学习札记(二)——初识驱动开发

热度:76   发布时间:2016-04-28 10:20:10.0
嵌入式学习笔记(二)——初识驱动开发

前边粗略了解了下NAND FLASH,但是那些知识根本不够展开工作,现在开始学驱动开发。


照例,先百科:

参考书:

《Linux设备驱动开发详解》

百科ref:

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Linux设备驱动的重点、难点

(1)编写Linux设备驱动要求工程师有非常好的硬件基础,懂得SRAM、Flash、SDRAM、磁盘的读写方式,UART、I2C、USB等设备的接口以及轮询、中断、DMA的原理,PCI总线的工作方式以及CPU的内存管理单元(MMU)等。
(2) 编写Linux设备驱动要求工程师有非常好的C语言基础,能灵活地运用C语言的结构体、指针、函数指针及内存动态申请和释放等。
(3)编写Linux设备驱动要求工程师有一定的Linux内核基础,虽然并不要求工程师对内核各个部分有深入的研究,但至少要明白驱动与内核的接口。尤其是对于块设备、网络设备、Flash设备、串口设备等复杂设备,内核定义的驱动体系架构本身就非常复杂。
(4) 编写Linux设备驱动要求工程师有非常好的多任务并发控制和同步的基础,因为在驱动中会大量使用自旋锁、互斥、信号量、等待队列等并发与同步机制。[1]

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

发现除了熟练C(最近还没练),Linux内核才开始接触,差距很大。


先搜帖子学吧:

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

“Linux操作系统内核编译详解”

Linux开源,所有内核源程序都在/usr/src/linux下。大部分遵循GPL。


版本:提到Linux大家都知道无数个版本,每个人都可以开发出来,各种各种。那么应对这种集市模型开发(bazaar,相对的有cathedral教堂模型),确保无需开发过程有序进行,Linux采用了双树系统,稳定树(stable tree)和非稳定树(unstable tree)(或者叫开发树(development tree)。很简单,后者用于各种改进尝试,合适的话两者同时改进,完成后开发树变成稳定树。具体的版本号形式x.y.z,稳定树y是偶数,开发树比稳定树大一(奇数)。“到目前为止”,稳定树最高版本2.2.16(够老的),Redhat7.0用的2.2.16内核,开发树最新版本2.3.99.网上诸如2.4.0-test9-pre7之类的不是正式版本。


为此我去截了个图,不用我们太麻烦去分辨,人家都提示了哪个是stable。

说到为什么重新编译内核,因为linux内核不断更新(例如更多的硬件支持,更好的进程管理,更快的速度和更好的稳定性),用户想利用新内核,或者定制自己需要的高效稳定的内核,就需要重新编译内核。

一般有四个特性:

运行更快(内核精简啊,代码少);

内存更多(内核部分将不会被提交到虚拟内存中——何解?);

更安全(少了多余的功能,漏洞也少);

将某种功能编译为模块方式会比编译到内核内的方式速度更慢一些(什么考量?)。


内核编译模式:

要增加某种支持,比如网络,可以把相应部分编译到内核中(build-in),也可以把该部分编译成模块(module),动态调用。前者开机启动,速度快,缺点是内核庞大,冗余,整体速度也会慢——window惯用无脑招数。反之肯定是另一个极端,所以,计算机中常用的理念就是取得平衡,达到中庸,英语里应该叫economy,经济。

所以特别有用、频率高的build-in,其他的编译成.o文件,使用的时候动态加载,这样做的缺点就是需要自己调用。

新版本获取和更新:

下载完整内核版本,或者补丁(patch)文件,前者大后者小。

下边有个流程,我先照猫画虎手打一下加点印象(具体可行性不可知,我先熟悉熟悉再做这个事):

首先需要root用户,然后把要升级的内核拷贝到/usr/src/下

#cp linux-2.4.0test8.tar.gz

当前/usr/src里有一个linux的符号链接(我反正没找到),指向一个类似于linux-2.2.14(你现在版本)的目录,删除这个链接:

#cd /usr/src

#rm -f linux

现在解压下载的源程序(网速不好的可以先下俩预备着)

#tar -xzvf linux-2.4.0test8.tar.gz

如果是bz2文件

#bzip2 -d linux-2.4.0test8.tar.bz2

#tar -xvf linux.2.4.0.test8.tar

据说此时/usr/src下有了一个linux目录,前边那个名为linux的链接就是防止升级内核的时候不慎把原来版本内核源程序覆盖掉。

#mv linux linux-2.4.0test8

#ln -s linux-2.4.0test8 linux

这样也制作了一个防覆盖的linux符号(目前我对系统的了解只能是不明觉厉,怎么个防覆盖,link我不熟,我只停留在快捷方式上,至少在我的ubuntu上文件布局和这里说的不一样,/usr/src下不是linux,而是各linux版本号:

[email protected]:/usr/src$ ls
linux-headers-2.6.38-10          linux-headers-2.6.38-8
linux-headers-2.6.38-10-generic  linux-headers-2.6.38-8-generic


如果你还下载了patch,比如patch-2.4.0test8,并且位于/usr/src目录下

#patch -p0 < patch-2.4.0test8

这就算升级完了。


下边是内核编译,blabla,命令太多了,一眼扫不懂,有点超出我知识范围了,或者照猫画虎太多也受不了。先研究研究再搞。

土逼continue

ios7真但疼,我都看不到我浏览的网页地址,总不能就是it.com.cn吧,我靠还得点开地址栏,闹惨的设定

www.it.com.cn/f/edu/0411/30/53807.htm


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下边回到我的课程上,再扫几眼《Understanding the Linux Kernel》,研究研究众多英文单词怎么破







----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------














  相关解决方案