嵌入式学习笔记(二)——初识驱动开发
2013-11-03 00:16
375 查看
前边粗略了解了下NAND FLASH,但是那些知识根本不够展开工作,现在开始学驱动开发。
照例,先百科:
参考书:
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(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版本号:
h@kk:/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》,研究研究众多英文单词怎么破
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
照例,先百科:
参考书:
《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版本号:
h@kk:/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》,研究研究众多英文单词怎么破
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
相关文章推荐
- 嵌入式学习-驱动开发-lesson3-混杂设备驱动模型与linux中断处理流程
- Android深度探索:HAL与驱动开发学习笔记--并发控制之顺序锁
- Android深度探索:HAL与驱动开发学习笔记--工作队列
- 嵌入式开发学习笔记 ( java - c/c++ :从入门到入门 )
- 驱动开发学习笔记1
- 嵌入式linux应用开发之:初识Qt - farsight嵌入式学习专栏 - CSDNBlog
- 嵌入式驱动开发的前期Linux 和 C学习(三)
- 驱动开发学习笔记1
- Android深度探索:HAL与驱动开发学习笔记--时间管理
- Audio驱动开发 之 音频链路学习笔记
- 嵌入式驱动开发笔记(裸机程序篇)---点亮LED灯
- Exynos 4412 Cortex-A9嵌入式Linux驱动开发学习笔记-第一期
- 嵌入式学习-驱动开发-lesson1-字符设备驱动模型
- 嵌入式开发之C基础学习笔记02--第一个例子分析
- 嵌入式开发学习笔记 ( java - c/c++ :从入门到入门 )
- 我的嵌入式学习笔记(1)-- 搭建开发环境
- {嵌入式学习笔记(一)}ubuntu下嵌入式开发环境搭建
- 嵌入式学习-驱动开发前奏-lesson1-内核模块相关知识
- 嵌入式开发之C基础学习笔记07--编译预处理