【驱动学习】Essential Linux Device Driver学习笔记(一)
2013-07-20 17:23
375 查看
Essential Linux Device Driver的配套网站为:http://elinuxdd.com/~elinuxdd/
由于Linux提供免费的源代码,因此可以Linux的源码,定制自己的内核,让设备在几秒钟之内启动。
一、Linux系统的演进
1991年,Linux Torvalds开发了Linux操作系统。第一次发布只支持Intel 386处理器
后来,内核复杂性逐步增加,支持众多体系架构、多处理器硬件和高性能集群(x86、IA64、ARM、PowerPC、Alpha、MIPS和SPARC等)
二、GNU Copyleft
GNU工程比Linux诞生还早,它发起的目标是定制一个免费的类Unix操作系统(GNU是GNU's Not Unix的递归缩写)。
一个完整的GNU操作系统基于Linux内核构建,但也包含其他一些组件(如库、编译器和实用程序(utility))。
GNU工程的主要发起者——自由软件基金会——创造了GNU公共许可证(GPL),其也被称为"版权左派(copyleft)",其防止有人中途将免费软件转换为商用软件。谁修改了copyleft的软件,就必须以copyleft的方式分享他的软件。
因此,若修改了内核, 就必须在社区分享此修改。
不过通过系统调用访问内核服务的Linux应用程序没有看做衍生的工作,因此并不受限于GPL。
三、kernel.org
Linux内核的源代码主要存放在www.kernel.org,该网站包含所有的已经发布的内核版本。
除了已经发布的内核以外,kernel.org还包含了有一线开发人员提供的补丁,这些补丁可以作为未来稳定版本的试验平台。
四、邮件列表和论坛
LKML(Linux kernel Mailing List,Linux内核邮件列表)是开发人员就开发问题进行辩论并决定Linux未来要包含哪些功能的论坛。可以在www.lkml.org看到实时的邮件列表。
内核的大部分子项目都拥有自己的邮件列表。
在http://lwn.net上可以获得Linux开发社区的最新消息。
五、查看源代码
在研究内核源代码之前,先下载Linux源代码,并学会如何打补丁,且要查看内核源代码树的布局。
首先,到www.kernel.org下载最新的稳定的源代码,
然后,进行解压缩。现在则拥有位于/usr/src/linux-X.Y.Z/目录的源代码树,下面通过打-mm补丁(Andrew Morton)启动一些实验性测试特性。运行如下命令:
1)下载补丁:
2)打上下载的补丁
命令中的-dc选项表示让bzip2将指定的文件解压缩到标准输出。它以管道方式输送到补丁实用程序,补丁程序会将补丁中的代码修改引用到源代码树中的每个需要修改的文件。
注:从2.6.24内核版本开始,i386和x86_64(与32位的i386系统对应的64位系统)架构源码树已经被统一到公共的arch/x86/目录中。
六、编译内核
下载了内核和补丁后,现在对代码稍作一点修改,并编译和运行它。
进入到顶层的init/目录总,对初始化文件main.c做一项小的修改,即在start_kernel()函数的开头加上一行打印信息。如下:
然后,如如下链接http://blog.csdn.net/wuxiaoer717/article/details/8624115中的方法进行比较编译 。
完成后,重启Linux并启动到新内核,启动后的第一条信息显示了添加的那句话。
七、可加载模块
在Linux内核中,所支持的设备可以以内核模块的形式提供其他的功能,在运行的时候,可以动态地按需加载模块。
为了生成模块,进入内核源代码根目录并运行
运行如下命令安装编译生成的模块
以下工具可用于操纵模块:insmod、rmmod、lsmod、modprobe、modinfo和depmod。
其中,insmod和rmmod用于加载和移除模块。
lsmod用于列出目前已经加载的模块,
modprobe是insmod的一个更智能的版本,它先分析/lib/modules/X.Y.Z/modules.dep文件再加载它所依赖的模块。
内核模块减小了内核的大小,并缩短了开发——编译——测试的周期。
由于Linux提供免费的源代码,因此可以Linux的源码,定制自己的内核,让设备在几秒钟之内启动。
一、Linux系统的演进
1991年,Linux Torvalds开发了Linux操作系统。第一次发布只支持Intel 386处理器
后来,内核复杂性逐步增加,支持众多体系架构、多处理器硬件和高性能集群(x86、IA64、ARM、PowerPC、Alpha、MIPS和SPARC等)
二、GNU Copyleft
GNU工程比Linux诞生还早,它发起的目标是定制一个免费的类Unix操作系统(GNU是GNU's Not Unix的递归缩写)。
一个完整的GNU操作系统基于Linux内核构建,但也包含其他一些组件(如库、编译器和实用程序(utility))。
GNU工程的主要发起者——自由软件基金会——创造了GNU公共许可证(GPL),其也被称为"版权左派(copyleft)",其防止有人中途将免费软件转换为商用软件。谁修改了copyleft的软件,就必须以copyleft的方式分享他的软件。
因此,若修改了内核, 就必须在社区分享此修改。
不过通过系统调用访问内核服务的Linux应用程序没有看做衍生的工作,因此并不受限于GPL。
三、kernel.org
Linux内核的源代码主要存放在www.kernel.org,该网站包含所有的已经发布的内核版本。
除了已经发布的内核以外,kernel.org还包含了有一线开发人员提供的补丁,这些补丁可以作为未来稳定版本的试验平台。
四、邮件列表和论坛
LKML(Linux kernel Mailing List,Linux内核邮件列表)是开发人员就开发问题进行辩论并决定Linux未来要包含哪些功能的论坛。可以在www.lkml.org看到实时的邮件列表。
内核的大部分子项目都拥有自己的邮件列表。
在http://lwn.net上可以获得Linux开发社区的最新消息。
五、查看源代码
在研究内核源代码之前,先下载Linux源代码,并学会如何打补丁,且要查看内核源代码树的布局。
首先,到www.kernel.org下载最新的稳定的源代码,
然后,进行解压缩。现在则拥有位于/usr/src/linux-X.Y.Z/目录的源代码树,下面通过打-mm补丁(Andrew Morton)启动一些实验性测试特性。运行如下命令:
1)下载补丁:
bash> cd /usr/src bash> wget www.kernel.org/pub/linux/kernel/people/akpm/patches/X.Y/X.Y.Z/X.Y.Z-mm2/X.Y.Z-mm2.bz2
2)打上下载的补丁
bash> cd /usr/src/linux-X.Y.Z/ bash> bzip2 -dc ../X.Y.Z-mm2.bz2 | patch -p1
命令中的-dc选项表示让bzip2将指定的文件解压缩到标准输出。它以管道方式输送到补丁实用程序,补丁程序会将补丁中的代码修改引用到源代码树中的每个需要修改的文件。
注:从2.6.24内核版本开始,i386和x86_64(与32位的i386系统对应的64位系统)架构源码树已经被统一到公共的arch/x86/目录中。
六、编译内核
下载了内核和补丁后,现在对代码稍作一点修改,并编译和运行它。
进入到顶层的init/目录总,对初始化文件main.c做一项小的修改,即在start_kernel()函数的开头加上一行打印信息。如下:
asmlinkage void __init start_kernel(void) { char * command_line; extern const struct kernel_param __start___param[], __stop___param[]; /* * Added by WXE */ printk("I like Linux, written by WXE!"); /* * Need to run as early as possible, to initialize the * lockdep hash: */ lockdep_init(); smp_setup_processor_id(); debug_objects_early_init(); ... ... }
然后,如如下链接http://blog.csdn.net/wuxiaoer717/article/details/8624115中的方法进行比较编译 。
完成后,重启Linux并启动到新内核,启动后的第一条信息显示了添加的那句话。
七、可加载模块
在Linux内核中,所支持的设备可以以内核模块的形式提供其他的功能,在运行的时候,可以动态地按需加载模块。
为了生成模块,进入内核源代码根目录并运行
bash> cd /usr/src/linux-X.Y.Z bash> make modules
运行如下命令安装编译生成的模块
bash> make modules_install
以下工具可用于操纵模块:insmod、rmmod、lsmod、modprobe、modinfo和depmod。
其中,insmod和rmmod用于加载和移除模块。
lsmod用于列出目前已经加载的模块,
modprobe是insmod的一个更智能的版本,它先分析/lib/modules/X.Y.Z/modules.dep文件再加载它所依赖的模块。
内核模块减小了内核的大小,并缩短了开发——编译——测试的周期。
相关文章推荐
- linux2.6驱动学习笔记之字符驱动
- Zynq-Linux移植学习笔记之13-i2c驱动配置
- Linux驱动LCD driver学习总结
- Linux驱动学习笔记之并发控制
- 老查的ARM学习笔记:chapter-2(linux总线设备驱动详解)
- Linux驱动开发之Platform_device和Platform_driver
- Linux驱动学习笔记之一——高精度定时器(1)
- Linux驱动中bus, platform_device, platform_driver三者的联系(转自whhq201108)
- 小松之LINUX 驱动学习笔记(二)
- 嵌入式linux驱动-bus-driver-device模型笔记
- linux网络设备应用与驱动编程学习笔记(2)——网络驱动基础
- linux 驱动学习笔记02--应用实例:在内核中新增驱动代码目录和子目录
- Linux内核部件分析 设备驱动模型之device-driver
- 我的内核学习笔记11:linux leds-gpio驱动应用实例
- Samsung_tiny4412(驱动笔记10)----mdev,bus,device,driver,platform
- linux学习笔记-驱动(1)
- Linux驱动学习笔记之一——高精度定时器(2)
- linux驱动学习笔记6
- Linux 驱动学习笔记1 -- HelloWorld
- 嵌入式Linux驱动学习笔记(一)------第一个LED驱动程序