linux内核驱动
⑴ 求教怎么学习linux内核驱动
1.首先要了解为什么要学习内核?下图已表明,如果要从事驱动开发或系统研究,就要学习内核。
2.内核的知识就像下面的绳结一样,一环扣一环,我们要解开它们,就必须要先找到线头也就是内核中的函数接口。初学阶段,我们一般不深入的研究内核代码,会使用内核的接口函数就不错了。
3.下面提供了如何学习这些内核函数的方法,就像解绳子一样
4.学习内核的四步法则,思维导图的设计尤为重要,这也是能否学习好内核的关键
5.语言基础也需要扎实,所以需要把C语言巩固巩固
⑵ Linux内核开发与Linux驱动开发有什么关系
驱动装在系统上,有的会跟内核有交互,但是驱动一般是针对设备
⑶ 怎么学linux内核驱动
怎么学linux内核驱动?1. 分享Linux内核学习和驱动开发的经验。
内核学习
Linux 内核功能越来越完善,如果没有充裕的时间,深入内核并不是很现实。所以建议先读一本内核的书,
第一遍是读,会读的很迷糊;之后反省一下,然后再浏览一下;可以想象一个 OS 是如何运行的,这样可以不
陷入 Linux 内核的细节;最后可以深入自己感兴趣或者需要的那一子系统
推荐 《Linux Kernel Development》
即便是子系统,也是很庞大的。一个省力的方式是网上搜一些相关的文章,便于快速了解这个子系统的运作;
然后结合代码,形成自己的认知,最后做一下总结。如果仅仅是快速了解某一子系统的运作,可以参考一些早期
代码的注解书籍,再深入的时候看看最新的代码实现
对内核的认知是一个反复的过程,一开始并不完善,可能需要反复纠正。不要陷入这种纠错中;而是以后继续
使用和学习过程中,发现了没有弄清楚的地方再深入,毕竟 Linux 内核是不断变化的
还有一个很好的方式是,从系统调用入手,现在这方面的数据不少,而且对系统调用的语义都有讲解,这样可以
间接了解 Linux 系统的一些概念。对系统调用熟悉了,可以根据系统调用的执行过程,来大体了解内核的一个
运作过程;但是跟踪系统调用的时候要注意抓主线,现在内核系统很复杂,一些 code path 上可能会涉及多个
子系统,可以从名字上猜测它们是干什么的,不需要深入,否则会发现精力完全被分散掉了
学习 Linux 内核,一个很重要的是抽象的能力,所谓的抽象这里仅仅是指分清接口和接口的实现。因为 Linux
内核子系统很多,有很多子系统相互渗透,这样 code path 看上去很复杂。阅读代码的时候,为了排除干扰,
需要分清哪些是自己需要看的,哪些是其它子系统的接口,对于其它子系统的接口,先当作它们功能完善不会
出问题好了,这样可以关注重点;打个比方,一个应用程序的代码可能量很大,比如一个 apache 项目,它
包含很多组件,有时候阅读代码的时候会看到不同组件的 API,深入看相关组件实现并不现实,这时候分清主次
对于代码的阅读就很有帮助了,总不能看到了 malloc 就要先把它的实现弄清楚吧,系统调用多者呢
⑷ linux下内核,驱动有什么关联吗
1 驱动程序需要加载到内核中才能运行 。
2 编译驱动模块时,驱动需要调用内核中有关函数。
内核和驱动程序都是运行在内核空间。
⑸ linux内核驱动占用时间多久会导致内核崩溃
设置
1.安装kexec-tools工具,至于如何安装,在此不再多 说。
2.编译支持kmp的系统内核,我们叫他primary kernel。
确认以下内核选项已经被打开并重编内核。
1) 使能"kexec system call => Processor type and features." ,使内核支持kexec系统调用
CONFIG_KEXEC=y
2) 使能"Filesystem" => "Pseudo
filesystems."=> "sysfs file system support"
CONFIG_SYSFS=y
注意:如果"General Setup."=>"Configure standard kernel features (for small system)" 没有打开的话,"sysfs file system support"可能并不会在"Pseudo
filesystems."中出现,如果是 这种情况,可以直接检nfig文件,确认CONFIG_SYSFS是不是已经开启。
grep 'CONFIG_SYSFS'nfig
3)使能"Kernel hacking."=>"Compile the kernel with debug info" ,保证编译出的内核带有调试符号。因为mp分析工具在读取和分析mp文件时需要这些调试符号。
CONFIG_DEBUG_INFO=Y
3. 编译mp-capture kernel
针对不同的架构,内核选项也有不同,但是不论哪种架构,以下两个选项是必选的
"Processor type and features"=> "kernel crash mps"
CONFIG_CRASH_DUMP=y
"Filesystems" => "Pseudo filesystems"=>"/proc/vmcore support"
CONFIG_PROC_VMCORE=y
(当 CONFIG_CRASH_DUMP 被选中时,CONFIG_PROC_VMCORE会被自动选中)
下面我们看一下针对不同的架构,编 译内核还有哪些特殊的选项
1)i386 和x86_64
*在i386上,使能高内存支持"Processor type and features"=>"high memory support"
CONFIG_HIGHMEM64G=y
or
CONFIG_HIGHMEM4G
* 在i386 和x86_64上,关闭"Processor type and features"=>"symmetric multi-processing support"
CONFIG_SMP=n
如果没有将该选项设为n,则需要在加载mp- capture kernel时指定参数maxcpus=1。
*如果想编译一个加载地址可浮动的内核,则选中"Processor type and features"=>"Build a relocatable kernel"
CONFIG_RELOCATABLE=y
* 设置合适的值给"Processor type and features"=>"Physical address where the kernel is loaded"
该值的设置与内核加载地址是否是可浮动的(即是否选中CONFIG_RELOCATABLE)有关。
如 果内核加载地址不可浮动, 则该值必须与crashkernel=Y@X中的X相同(至于crashkernel=Y@X的含义即如何使用将在后面讲到),例 如:crashkernel=64M@16M,则CONFIG_PHYSICAL_START=0x100000
0。
如果内核加载地址可 浮动,则CONFIG_PHYSICAL_START的值便可不必在意,使用默认的即可。不过为了保险起见,为了能使kmp正确执 行,CONFIG_PHYSICAL_START的值不论在何时,都要于X的值相同。
2)ppc64
除了前面两个必须的选项,其 余选项默认即可。
3)ia64
除了前面两个必须的选项,其余选项默认即可。
4.准备好两个内核后,即可按如下步 骤使用kmp
1)使用primary kernel启动系统,但是要在启动参数中加入“crashkernel=Y@X”,Y表示为mp-capture kernel 预留了多少内存空间,X该段空间的起始地址,即内核选项中CONFIG_PHYSICAL_START的值。
对于x86和x86_64架构,一般 使用crashkernel=64M@16M,CONFIG_PHYSICAL_START=0x1000000
对于ppc64架构,一般使用 crashkernel=128M@32M,CONFIG_PHYSICAL_START=0x2000000
对于ia64架构,通常使用 crashkernel=256M@256M。
2)加载mp-capture kernel
系统启动后,即可加载mp- capture kernle。
不同的架构,可以选择使用为压缩的mp-capture kernle (vmlinux) 或者压缩过的mp-capture kernle(bzImage/vmlinuz)。
i386 和x86_64:
如果mp-capture kernel编译时未选中CONFIG_RELOCATABLE,则只能使用vmlinux
如果mp-capture kernel编译时打开了CONFIG_RELOCATABLE,则可以使用bzImage/vmlinuz
ppc64 :
只能使用vmlinux
ia64:
可以使用vmlinux或者vmlinuz.gz
加载方法:
kexec -p <mp-capture-kernel-vmlinux-image> \
--initrd=<initrd-for-mp-capture-kernel> --args-linux \
--append="root=<root-dev> <arch-specific-options>"
mp- capture-kernel-vmlinux-image:表示存放mp-capture kernel 的路径
initrd-for- mp-capture-kernel:表示initrd的路径,如果没有,可以省略该参数
--args-linux:表示Pass linux kernel style options,没看明白什么意思,但是ia64架构不需要加这个参数,其他架构都要有。
--append: 该参数后跟内核启动参数。
arch-specific-options:内核启动参数的一部分,该处根据不同架构,填写不同参数。 i386, x86_64 和 ia64 填"1 irqpoll maxcpus=1 reset_devices",ppc64填"1 maxcpus=1 noirqdistrib reset_devices"。
注:
默认情况下,ELF文件头采用ELF64格式存储以支持那些拥有超过 4GB内存的系统。但是可以指定“--elf32-core-headers”标志以 强制使用ELF32格式的ELF文件头。这个标志是有必要注意的,一个重要的原因就是:当前版本的GDB不能在一个32位系统上打开一个使用ELF64格 式的vmcore文件。ELF32格式的文件头不能使用在一个“没有物理地址扩展”(non-PAE)的系统上。(即是说,少于4GB内存的系统)
1 这个参数,将启动“转储捕捉内核”到一个没有网络支持的单用户模式。如果你希望有网络支持,那么使用“init 3”
maxcpus=1,这个前 面说过,如果CONFIG_SMP=n,则需要在启动参数中加入maxcpus=1。
irqpoll 的启动参数可以减低由于在“转储捕获内核”中使用了“共享中断”技术而导致出现驱动初始化失败这种情况发生的概率。
举例:
kexec -p /boot/vmlinux_capture --args-linux --append="root=/dev/nfs rw nfsroot=128.224.149.6:/tftpboot/cxu/15554/rootfs ip=dhcp console=ttyS0,115200 1 maxcpus=1 noirqdistrib reset_devices"
3)测试 kmp是否成功
手动产生一个crash:echo c > /proc/sysrq-trigger。
或者可以些一个强制产生 crash的模块。
如果成功,系统将会进入热启动过程,系统启动完成后,可以执行一下uname -a ,看看内核的名字是不是有-kmp的标签呢?
然后就可以把生成的转储文件vmcore拷贝出来了,直接cp即可:
cp /proc/vmcore <anywhere>
也可以通过/dev/oldmem这个设备将其考出:
cd ~
mknod /dev/oldmem c 1 12
dd if=/dev/oldmem of=oldmem.001
成功将vmcore 拷贝出来后即可重启系统了。
4)分析vmcore文件
在开始分析“转储文件”之前,应该确定重启到一个稳定的内核。
可以 使用GDB在‘转储文件’上做有限的分析。分析的时候需要“带有调试信息的vmlinux文件”(编译的时候带有-g选项),运行如下命令:
gdb vmlinux vmcore
注意:GDB不能分析x86平台上以ELF64格式产生的“内核转储文件”。在一个最大内存为4GB的系统上,可 以通过在“转储捕捉内核”上指定“--elf32-core-headers”标志来使用ELF32格式的文件头。
也可以使用Crash工具集来 分析Kmp产生的“内核转储文件”,crash 工具可以到网上下载:
~anderson/
以上文档主要是翻译自内核自带文档linux/Documentation/kmp/kmp.txt,部分使用自己的语言表达。如有错误,请指正。
标签: 内核崩溃转储机制 Linux
⑹ 嵌入式linux内核驱动。怎么办
第一:前景是很好的,可是不是那么容易就能学好的,你所说的培训不知道是哪种?假如高质量的培训都有严格的入学要求,估计这样一来就刷掉一大批人吧,假如是那普通的培训又学不到啥,再者培训费目前木有低于1W的,首先你得有这资金,有时间。
第二:培训出来后是啥?这个不敢说,看你学的怎麽样吧,看你是不是这方面比较擅长。嵌入式内核驱动(Drive)出来的不能叫程序员了吧,那太局限了,应当叫工程师了,程序员精通的编程,而工程师既要编程又要熟悉硬件,因此说起来2个不能混为一谈。
第三:研究内核的实用性不大(个人认为,除了科研),去公司不能整天让你研究开发内核吧,关键是要熟悉了解里边的进程调度,资源分配等,这现对于普通的编程而言难度又要加大。
总之,前景是好,可是学起来也不容易,设计知识面广,核心东东比较难懂。以上仅代表个人看法。
⑺ 如何分析一个linux内核驱动
首先,要理解操作系统的概念,操作系统是用户和硬件之间的一层媒介程序。不管是Linux还是Windows或者安卓、IOS,它的主要功能有两点:1、有效管理硬件。
2、方便用户操作。
其次,Linux内核是Linux系统的核心程序,主要完成任务调度、内存管理、IO设备管理等等功能,主要目的是为了应用程序提供一个稳定良好的运行环境,这是一个基础。
再次,驱动程序是操作系统有效管理硬件的一个途径。应用程序是方便用户操作提供的程序,比如Shell,Linux中的bash shell以及KDE、gnome等图形Shell都是应用程序。 你可以简单的理解为驱动程序实现了操作系统对硬件的有效管理,应用程序实现了操作系统方便用户操作的目的。
最后,从编程角度来看,Linux内核就是一个调用库,应用程序通过调用Linux提供的API函数来实现操作,Linux内核通过与驱动通信实现对硬件的有效管理。具体的编程细节,需要自己在实践编程中体会。这是一个整体的描述。
⑻ 什么叫Linux驱动程序
linux发行版本是什么呢,一般来说无需格外安装,都完美解决
⑼ 什么叫内核驱动 LINUX 内核驱动
上海尚观Linux嵌入式研究室:内核是用于管理系统资源的程序。内核将应用程序与系统硬件隔离,并为它们提供基本系统服务,如输入/输出 (input/output, I/O) 管理、虚拟内存和调度。内核由需要时动态装入内存的对象模块组成。
Linux内核在逻辑上可分为两个部分: 第一部分称为内核,用于管理文件系统、调度和虚拟内存。第二部分称为 I/O 子系统,用于管理物理组件。
内核提供了一组接口,供可通过系统调用访问的应用程序使用。Reference Manual Collection 的第 2 部分对系统调用进行了介绍。某些系统调用用于调用设备驱动程序以执行 I/O 操作。设备驱动程序是可装入的内核模块,用于管理数据传输,同时将内核的其余部分与设备硬件隔离。为了与操作系统兼容,设备驱动程序需要能够提供多线程、虚拟内存寻址以及 32 位和 64 位操作之类的功能。
⑽ linux内核,驱动,应用程三者的概念和之间的关系
首先,要理解操作系统的概念,操作系统是用户和硬件之间的一层媒介程序。不管是Linux还是Windows或者安卓、IOS,它的主要功能有两点:
1、有效管理硬件。
2、方便用户操作。
其次,Linux内核是Linux系统的核心程序,主要完成任务调度、内存管理、IO设备管理等等功能,主要目的是为了应用程序提供一个稳定良好的运行环境,这是一个基础。
再次,驱动程序是操作系统有效管理硬件的一个途径。应用程序是方便用户操作提供的程序,比如Shell,Linux中的bash shell以及KDE、gnome等图形Shell都是应用程序。 你可以简单的理解为驱动程序实现了操作系统对硬件的有效管理,应用程序实现了操作系统方便用户操作的目的。
最后,从编程角度来看,Linux内核就是一个调用库,应用程序通过调用Linux提供的API函数来实现操作,Linux内核通过与驱动通信实现对硬件的有效管理。具体的编程细节,需要自己在实践编程中体会。这是一个整体的描述。