linux内核与驱动
shujuliu818
Where my heart get peace, where my self get home.
展开
-
warning:ISO C90 forbids mixed declarations and code
warning:ISO C90 forbids mixed declarations and code转载 2014-11-07 16:57:17 · 554 阅读 · 0 评论 -
container_of()宏
container_of()宏在学习Linux驱动的过程中,遇到一个宏叫做container_of。该宏定义在include/linux/kernel.h中,首先来贴出它的代码:/** * container_of - cast a member of a structure out to the containing structure * @ptr: th转载 2014-11-07 08:22:20 · 375 阅读 · 0 评论 -
The Magical container_of() Macro and typeof()
When you begin with the kernel, and you start to look around and read thecode, you will eventually come across this magical preprocessor construct.What does it do? Well, precisely what its name indi转载 2014-11-07 08:29:07 · 581 阅读 · 0 评论 -
init_MUTEX 替换为 sema_init(sem,1)
2.6.25及以后的linux内核版本废除了init_MUTEX函数新版本使用sema_init函数 平台:X86 32位内核:2.6.24定义: 引用static inline void init_MUTEX (struct semaphore *sem) { sema_init(sem, 1); }说明:I转载 2014-11-07 18:00:00 · 1148 阅读 · 0 评论 -
Linux利用list_head结构实现双向链表
转自:http://www.cnblogs.com/bastard/archive/2012/10/19/2731107.html通常实现双向链表的数据结构:struct list_node1{ struct list_node1 *next,*prev; type1 m1; type2 m2;};struct list_node2{ s转载 2016-02-17 14:24:48 · 334 阅读 · 0 评论 -
Linux内存管理之mmap详解
一. mmap系统调用1. mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,wri转载 2016-02-17 17:18:52 · 313 阅读 · 0 评论 -
socket阻塞与非阻塞 同步与异步 select poll epoll
socket阻塞与非阻塞,同步与异步作者:huangguisu1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等转载 2016-02-18 12:43:54 · 308 阅读 · 0 评论 -
字符设备 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()
转自:http://blog.csdn.net/tommy_wxie/article/details/71954711. 字符设备结构体 内核中所有已分配的字符设备编号都记录在一个名为 chrdevs 散列表里。该散列表中的每一个元素是一个 char_device_struct 结构,它的定义如下: static struct char_device_struct转载 2016-02-18 15:21:03 · 309 阅读 · 0 评论 -
linux驱动开发 主设备号与次设备号
一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。例如一个嵌入式系统,有两个LED指示灯,LED灯需要独立的打开或者关闭。那么,可以写一个LED灯的字符设备驱动程序,可以将其主设备号注册成5号设备,次设备号分别为1和2。这里,次设备号就分别表示两个LED灯。1.主转载 2016-02-18 15:24:46 · 411 阅读 · 0 评论 -
linux 下各个头文件的作用
转自:http://www.cnblogs.com/qiaoge/archive/2012/03/30/2425058.html2.6.30.4的头文件的位置和2.6.25.8的不一样,除去内核源码下的include目录外,在arch/arm/mach-s3c2410/和arch/arm/plat-s3c24xx/目录下都有include目录的。#include转载 2016-02-19 10:15:31 · 315 阅读 · 0 评论 -
size_t ssize_t loff_t 的区别
转自:http://blog.csdn.net/xiaocaichonga/article/details/7837567Ssize_t 与size_t跟踪linux源码得到以下宏: #ifndef _SIZE_T#define _SIZE_Ttypedef __kernel_size_t size_t;#endif #ifndef _S转载 2016-02-19 10:46:16 · 9426 阅读 · 2 评论 -
netlink---Linux下基于socket的内核和上层通信机制(上)
我最近有一个项目需求,需要在Linux网卡驱动中加入一个自己的驱动,实现在内核态完成一些报文处理(这个过程可以实现一种零COPY的网络报文截获),对于复杂报文COPY下必要的数据交给用户态来完成(因为过于复杂的报文消耗CPU太大,会导致中断占用时间太长)。因此需要一种内核和用户态配合的通信机制,尝试了很多方式都不太理想,最后采用netlink+内存映射的模式很好的解决了这个问题。Netlink是一转载 2017-02-22 10:06:47 · 500 阅读 · 0 评论 -
ioctl 变成了 unlocked_ioctl
kernel 2.6.35 及之前的版本中struct file_operations 一共有3个ioctl :ioctl,unlocked_ioctl和compat_ioctl现在只有unlocked_ioctl和compat_ioctl 了在kernel 2.6.36 中已经完全删除了struct file_operations 中的ioctl 函数指针,取而代之的是unl转载 2014-11-04 15:52:45 · 547 阅读 · 0 评论 -
linux-2.6.14内核移植
下载linux-2.6.14.1.tar.bz2 tar -zxvf linux-2.6.14.1.tar.bz2 下载arm-linux-3.4.1.tar.jz tar -jxvf arm-linux-3.4.1.tar.jz 修改内核目录树根下的的 Makefile,指明交叉编译器 [arm@localhost linux-2.6.14]# vi Makefile 找转载 2014-11-04 11:34:31 · 443 阅读 · 0 评论 -
class_create()
在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点,当然前提条件是用户空间移植了udev。内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_cre转载 2014-11-10 12:02:50 · 391 阅读 · 0 评论 -
模块加载过程代码分析2
一、前言对于现在编译的一些module要insmod在系统上时,可能会报各种各样的错误。这些错误仔细研读内核源码,都能找出原因。2.6 内核以前的insmod部分主要依赖于modutils源码包,在用户层基本将工作完成,加载过程参考前一篇文章。2.6 内核以后的做法是将大部分的原来用户级操作纳入内核中来处理,无论是逻辑上还是代码量上都比原来减少了许多,通过busybox中的insmod命令与内转载 2014-10-31 21:09:26 · 1062 阅读 · 0 评论 -
关于内核模块签名的问题
(1)今天第一个遇到的比较棘手的问题就是编译模块wr_thread WARNING: "mcount" [/home/ams/Music/test/kernel_test/wr_thread/wr_thread.ko] 解决的方法是升级了gcc 从gcc4.4 升级到gcc4.8 update-alternatives --install /usr转载 2014-10-31 20:34:40 · 4071 阅读 · 0 评论 -
模块加载过程代码分析1
一、概述模块是作为ELF对象文件存放在文件系统中的,并通过执行insmod程序链接到内核中。对于每个模块,系统都要分配一个包含以下数据结构的内存区。一个module对象,表示模块名的一个以null结束的字符串,实现模块功能的代码。在2.6内核以前,insmod模块过程主要是通过modutils中的insmod加载,大量工作都是在用户空间完成。但在2.6内核以后,系统使用busybox的in转载 2014-10-31 21:11:36 · 857 阅读 · 0 评论 -
Linux 设备驱动的第一个例子:Hello World
一. 源程序( hello.c ) #include #include MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello, world/n"); return 0; } static void hel转载 2014-10-31 20:36:03 · 391 阅读 · 0 评论 -
Ubuntu编译内核树
obj-m := hello.o KERNELDIR := /lib/modules/2.6.20/build PWD := $(shell pwd) modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules modules_install: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_转载 2014-10-31 20:56:40 · 396 阅读 · 0 评论 -
第二章 第三节 Linux设备驱动程序之--模块参数
由于系统不同,驱动程序需要的参数也许会发生变化。这包括设备编号以及其他的一些用来控制驱动程序操作方式的参数。例如,用户向驱动程序传递一些硬件的的I/O端口后者I/O内存地址的位置之类的信息时就有可能会用到内核参数。内核允许对驱动程序指定参数,这些参数在装载驱动程序模块时可以改变的。以前面第二节中的hello.c为例:改变后的hello.c:#include #include转载 2014-11-02 10:33:49 · 386 阅读 · 0 评论 -
error: unknown field 'ioctl' specified in initializer问题
error: unknown field 'ioctl' specified in initializer问题是由于2.6.36内核之后 去掉了原来的ioctl,添加两个新的成员,所以会出错long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct fil转载 2014-11-04 10:23:11 · 444 阅读 · 0 评论 -
udev 以及 class_create()
在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点,当然前提条件是用户空间移植了udev。内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_cre转载 2014-11-04 10:20:39 · 474 阅读 · 0 评论 -
一个字符设备实例,以及自动建立设备节点
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include转载 2014-11-04 11:02:59 · 381 阅读 · 0 评论 -
linux-2.6.20内核移植 busybox1.9.2 并移植USB驱动
内核版本: linux2.6.20 buxybox版本: busybox1.9.2 交叉编译器: arm-gcc-3.4.1************************************************************************************* linux2.6.20转载 2014-11-04 11:39:39 · 534 阅读 · 0 评论 -
Ubuntu 12.04安装带调试功能的Bochs 2.6.2, 调试linux 0.11 内核
转自:http://shenan1984.blog.163.com/blog/static/25308510201362465220720/要下载的软件包:bochs-2.6.2linux-0.11-081030.tar.gz linux-0.11-devel-060625.zip(hdc-0.11-new.img 文件系统)(hdc-0.11-new.img 只用这一转载 2017-03-13 23:04:15 · 614 阅读 · 0 评论