Linux 2.6下Driver开发的34个变化[转贴]

来源:互联网 发布:JS确认框怎么设置 编辑:程序博客网 时间:2024/06/05 15:43


Linux2.6内核驱动移植嵌入式系统|linux|ARM|单片机'h7@!A-L5}7e[
I;H


    随着Linux2.6的发布,由于2.6内核做了教的改动,各个设备的驱动程序在不同程度上要进行改写。为了方便各位Linux爱好者我把自己整理的这分文档share出来。该文当列举了2.6内核同以前版本的绝大多数变化,可惜的是由于时间和精力有限没有详细列出各个函数的用法。
特别声明:该文档中的内容来自http://lwn.net,该网也上也有各个函数的较为详细的说明可供各位参考。如果需要该文档的word版的朋友, 请mail到weiriver@sohu.com索取。 www.51embed.comzf
FcX"F?

嵌入式系统|linux|ARM|单片机/D2WN'hl#?!A3V D
1、 使用新的入口 嵌入式系统|linux|ARM|单片机@ D;^-h0x;M-Z
必须包含 <linux/init.h>
module_init(your_init_func);www.51embed.com)T3YV'y L*g
module_exit(your_exit_func);www.51embed.comY9Whw5v _
|*p6C

老版本:int init_module(void);
void cleanup_module(voi);嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA'O,{;q7f8`7f,o4N5A&a#x
2.4中两种都可以用,对如后面的入口函数不必要显示包含任何头文件。gm$C&a,?gF

2、 GPL 
MODULE_LICENSE("Dual BSD/GPL");[4wGQ^d]&a?
老版本:MODULE_LICENSE("GPL"); 

3、 模块参数 [-?qi dd
W%E

必须显式包含<linux/moduleparam.h>9f8y6a%?,yfh#yj"S
module_param(name, type, perm);._7Q:X,M+j l2I#~
module_param_named(name, value, type, perm);
参数定义www.51embed.comM"u        k3[.s5YH
module_param_string(name, string, len, perm);
module_param_array(name, type, num, perm);
老版本:MODULE_PARM(variable,type);
MODULE_PARM_DESC(variable,type); 
嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA(U!a/A6a(d!x4z0E
4、 模块别名 嵌入式系统|linux|ARM|单片机6Q*`:uuM5oUw
MODULE_ALIAS("alias-name");嵌入式系统,linux,VxWorks,ARM,单片机-c0`)Ydi-_?
这是新增的,在老版本中需在/etc/modules.conf配置,现在在代码中就可以实现。 嵌入式系统,linux,VxWorks,ARM,单片机nRT]"Y+a

5、 模块计数 -y(N5[iUg
int try_module_get(&module);
module_put();嵌入式系统,linux,VxWorks,ARM,单片机 p9M7RI8Dh7f} }.U;L
老版本:MOD_INC_USE_COUNT 和 MOD_DEC_USE_COUNT 

6、 符号导出 
只有显示的导出符号才能被其他模块使用,默认不导出所有的符号,不必使用EXPORT_NO_SYMBOL*
老板本:默认导出所有的符号,除非使用**PORT_NO_SYMBOLS 嵌入式系统|linux|ARM|单片机gd[        su        ?P6qztG:Y:n
嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAP#Y3C#`*f@0g+^9j
7、 内核版本检查 嵌入式系统|linux|ARM|单片机2dj5Y-my0zrblN
需要在多个文件中包含<linux/module.h>时,不必定义__NO_VERSION__嵌入式系统|linux|ARM|单片机@ddJM(@w+r/V2U
老版本:在多个文件中包含<linux/module.h>时,除在主文件外的其他文件中必须定义__NO_VERSION__,防止版本重复定义。 嵌入式系统,linux,VxWorks,ARM,单片机+h;IpU
HU


8、 设备号 嵌入式系统|linux|ARM|单片机O"l        d*eO2O
kdev_t被废除不可用,新的dev_t拓展到了32位,12位主设备号,20位次设备号。
unsigned int iminor(struct inode *inode);
unsigned int imajor(struct inode *inode);
老版本:8位主设备号,8位次设备号
int MAJOR(kdev_t dev);
int MINOR(kdev_t dev); 嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA4b/K&J%zqP8bl3@
嵌入式应用论坛? [Iu6ch
9、 内存分配头文件变更 嵌入式应用论坛~ Va(GR|@
所有的内存分配函数包含在头文件<linux/slab.h>,而原来的<linux/malloc.h>不存在|/]-nd
s J
v

老版本:内存分配函数包含在头文件<linux/malloc.h>嵌入式应用论坛@8H#[0g6[

10、 结构体的初试化 
gcc开始采用ANSI C的struct结构体的初始化形式:嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAn-nE,HS S%D
static struct some_structure = {嵌入式应用论坛YS_,_9FP:k
p

.field1 = value,嵌入式系统|linux|ARM|单片机x_y5@8X.K2y
.field2 = value,嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAK5d ]#rw A2b4G`\5Z
...嵌入式应用论坛'C7K^.e't
};
老版本:非标准的初试化形式嵌入式系统,linux,VxWorks,ARM,单片机/@3MN
CL;~$K/?
]|

static struct some_structure = {
field1: value,嵌入式系统|linux|ARM|单片机#_S4Z${b:M]&Z
field2: value,嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA1k
Rmzl6K

...
}; 
www.51embed.com mjLq tPF|
11、 用户模式帮助器
int call_usermodehelper(char *path, char **argv, char **envp,
int wait);www.51embed.com)nu6C'Q8P
bj

新增wait参数 
嵌入式系统,linux,VxWorks,ARM,单片机I-H8[;R/uvZ [
12、 request_module() 
request_module("foo-device-%d", number);
老版本:#ot {;L+]*|
char module_name[32];
printf(module_name, "foo-device-%d", number);
request_module(module_name); 
www.51embed.comUH'B o+w0` [
13、 dev_t引发的字符设备的变化 

1、取主次设备号为
unsigned iminor(struct inode *inode);
unsigned imajor(struct inode *inode);嵌入式应用论坛9Y#a)|NGO$C ^0[

2、老的register_chrdev()用法没变,保持向后兼容,但不能访问设备号大于256的设备。嵌入式系统,linux,VxWorks,ARM,单片机W7a.p[L.{o \
x


3、新的接口为
嵌入式系统,linux,VxWorks,ARM,单片机LC7{SIW
a)注册字符设备范围嵌入式应用论坛2_+Nb+Oa        o0c
int register_chrdev_region(dev_t from, unsigned count, char *name); 嵌入式应用论坛$LN~M9|:x

b)动态申请主设备号
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, char *name);
看了这两个函数郁闷吧^_^!怎么和file_operations结构联系起来啊?别急!嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA&pI
C;nJ&Md|*X!Z

嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA?i1{*S^
c)包含 <linux/cdev.h>,利用struct cdev和file_operations连接
struct cdev *cdev_alloc(void);.j        XN;r)[
void cdev_init(struct cdev *cdev, struct file_operations *fops);
int cdev_add(struct cdev *cdev, dev_t dev, unsigned count);嵌入式系统|linux|ARM|单片机1[6rm        Z7@9C"H
(分别为,申请cdev结构,和fops连接,将设备加入到系统中!好复杂啊!)嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAQ]M!PY

d)void cdev_del(struct cdev *cdev);www.51embed.com h ^Ka
YAt

只有在cdev_add执行成功才可运行。 
嵌入式应用论坛
Y#W/zSC

e)辅助函数嵌入式应用论坛
jp1sw#]#c

kobject_put(&cdev->kobj);
struct kobject *cdev_get(struct cdev *cdev);
void cdev_put(struct cdev *cdev);www.51embed.com^J[        mFG
这一部分变化和新增的/sys/dev有一定的关联。

14、 新增对/proc的访问操作 
i4~
x7l$aV,H

<linux/seq_file.h>嵌入式系统,linux,VxWorks,ARM,单片机!MH,k9|I[E7~
以前的/proc中只能得到string, seq_file操作能得到如long等多种数据。
相关函数:嵌入式应用论坛&`$[D+s'G9a
static struct seq_operations 必须实现这个类似file_operations得数据中得各个成员函数。
seq_printf();
int seq_putc(struct seq_file *m, char c);
int seq_puts(struct seq_file *m, const char *s);www.51embed.com0S3h:kF
u-h,\

int seq_escape(struct seq_file *m, const char *s, const char *esc);嵌入式系统,linux,VxWorks,ARM,单片机,WjE8A1^8B;h
int seq_path(struct seq_file *m, struct vfsmount *mnt,www.51embed.comWB'x+S'W`J}fd
struct dentry *dentry, char *esc);
seq_open(file, &ct_seq_ops);嵌入式应用论坛$F$EInn:V\oV
等等 嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAj6w
mr
G9T&V;g"ebp:}]&D&j

嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA+xY6cb_        U%Oc-J
15、 底层内存分配 
1、<linux/malloc.h>头文件改为<linux/slab.h>
2、分配标志GFP_BUFFER被取消,取而代之的是GFP_NOIO 和 GFP_NOFSwww.51embed.com#b0Y4Nmh^X;JZIP#H
3、新增__GFP_REPEAT,__GFP_NOFAIL,__GFP_NORETRY分配标志嵌入式应用论坛,id7wo8p
4、页面分配函数alloc_pages(),get_free_page()被包含在<linux/gfp.h>中
5、对NUMA系统新增了几个函数:`3wZ.h swr
a) struct page *alloc_pages_node(int node_id,
unsigned int gfp_mask,
unsigned int order);
b) void free_hot_page(struct page *page);嵌入式系统,linux,VxWorks,ARM,单片机/Uas"J@(c }"u3a
c) void free_cold_page(struct page *page);
6、 新增Memory pools
<linux/mempool.h>嵌入式系统|linux|ARM|单片机6`Rx9w#lN`f}
mempool_t *mempool_create(int min_nr,
mempool_alloc_t *alloc_fn,
mempool_free_t *free_fn,嵌入式应用论坛.Q        K%Sa'HZ
void *pool_data);嵌入式应用论坛u2Y4\*{"Rk-Ds3d
void *mempool_alloc(mempool_t *pool, int gfp_mask);
void mempool_free(void *element, mempool_t *pool);        \@KMp
int mempool_resize(mempool_t *pool, int new_min_nr, int gfp_mask); www.51embed.com*C2}&Ob`2f2N        w
www.51embed.comHa0Q JA4t%U1V
16、 per-CPU变量 
get_cpu_var();
put_cpu_var();www.51embed.comkCYJ*^1~2p8uG
void *alloc_percpu(type);
void free_percpu(const void *);嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA5WU6A8L        TJG
per_cpu_ptr(void *ptr, int cpu)嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAPe$~1}5s
GZ:x6wM|

get_cpu_ptr(ptr)
put_cpu_ptr(ptr)
老版本使用
DEFINE_PER_CPU(type, name);
EXPORT_PER_CPU_SYMBOL(name);嵌入式系统,linux,VxWorks,ARM,单片机;H!|MJ:WC
EXPORT_PER_CPU_SYMBOL_GPL(name);
DECLARE_PER_CPU(type, name);嵌入式应用论坛 ?Dr@L3u2k
DEFINE_PER_CPU(int, mypcint);
2.6内核采用了可剥夺得调度方式这些宏都不安全。 
嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA3E)] D;t0b8{.j+S
x

17、 内核时间变化 嵌入式系统,linux,VxWorks,ARM,单片机Q&i,f.O4VzT

1、现在的各个平台的HZ为
Alpha: 1024/1200; ARM: 100/128/200/1000; CRIS: 100; i386: 1000; IA-64: 1024; M68K: 100; M68K-nommu: 50-1000; MIPS: 100/128/1000; MIPS64: 100; PA-RISC: 100/1000; PowerPC32: 100; PowerPC64: 1000; S/390: 100; SPARC32: 100; SPARC64: 100; SuperH: 100/1000; UML: 100; v850: 24-100; x86-64: 1000.
2、由于HZ的变化,原来的jiffies计数器很快就溢出了,引入了新的计数器jiffies_64
3、#include <linux/jiffies.h>
u64 my_time = get_jiffies_64();
4、新的时间结构增加了纳秒成员变量嵌入式应用论坛[S"luOty
struct timespec current_kernel_time(void);嵌入式应用论坛8xb%c
t+Kg:O

5、他的timer函数没变,新增
void add_timer_on(struct timer_list *timer, int cpu);
6、新增纳秒级延时函数
ndelay();
7、POSIX clocks 参考kernel/posix-timers.c 

18、 工作队列(workqueue)嵌入式系统|linux|ARM|单片机H~ b9R#U0La
www.51embed.comU U3\`9y$g
1、任务队列(task queue )接口函数都被取消,新增了workqueue接口函数嵌入式系统,linux,VxWorks,ARM,单片机7j&j(@4sp7jh-SA
struct workqueue_struct *create_workqueue(const char *name);嵌入式应用论坛
CRYo1K.w,Z%U%v:o

DECLARE_WORK(name, void (*function)(void *), void *data);
INIT_WORK(struct work_struct *work,
void (*function)(void *), void *data);
PREPARE_WORK(struct work_struct *work,嵌入式系统,linux,VxWorks,ARM,单片机k        d7~&B3BZ:n#xM;D
void (*function)(void *), void *data);嵌入式系统|linux|ARM|单片机8~/] u        L_%{NH6G
2、申明struct work_struct结构
int queue_work(struct workqueue_struct *queue,
struct work_struct *work);嵌入式系统,linux,VxWorks,ARM,单片机0|fhkqt JHdld
int queue_delayed_work(struct workqueue_struct *queue,www.51embed.com5h,no.f O}-K.Y
struct work_struct *work,
unsigned long delay);
int cancel_delayed_work(struct work_struct *work);嵌入式应用论坛qX0QOQ@;w
void flush_workqueue(struct workqueue_struct *queue);
void destroy_workqueue(struct workqueue_struct *queue);
int schedule_work(struct work_struct *work);
int schedule_delayed_work(struct work_struct *work, unsigned long delay); 嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAC.{%S3y{Oga
嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA|ecuWy6x
19、 新增创建VFS的"libfs"嵌入式应用论坛:e5t_ z_)Oe u&l
嵌入式系统,linux,VxWorks,ARM,单片机h0HZ0kK%tS|+Y
libfs给创建一个新的文件系统提供了大量的API.嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAn^DQ7S*WZ}
主要是对struct file_system_type的实现。
参考源代码:www.51embed.comw;]#uk+u
\(_1I0B

drivers/hotplug/pci_hotplug_core.c
drivers/usb/core/inode.c
drivers/oprofile/oprofilefs.cwww.51embed.compAiy#H#Q'wA
fs/ramfs/inode.c
fs/nfsd/nfsctl.c (simple_fill_super() example) 嵌入式系统|linux|ARM|单片机#Fh[qpJ~'e
嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA%e GqFjWw?1a
20、 DMA的变化 
嵌入式系统,linux,VxWorks,ARM,单片机h0?|o;i b[
未变化的有:嵌入式应用论坛z\3w&e@ uL
void *pci_alloc_consistent(struct pci_dev *dev, size_t size,
dma_addr_t *dma_handle);嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAKqK0j4?W@.R
void pci_free_consistent(struct pci_dev *dev, size_t size,
void *cpu_addr, dma_addr_t dma_handle);嵌入式应用论坛U*W:V8\XW
变化的有:
1、 void *dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, int flag);
void dma_free_coherent(struct device *dev, size_t size,
void *cpu_addr, dma_addr_t dma_handle);
2、列举了映射方向:嵌入式系统|linux|ARM|单片机_$Qmg%x0OA
enum dma_data_direction {
DMA_BIDIRECTIONAL = 0,
DMA_TO_DEVICE = 1,g/t YP"O9_|C N
DMA_FROM_DEVICE = 2,
DMA_NONE = 3,www.51embed.com5CfU1W/S
};www.51embed.compj`%oQ5F\ W{
f

3、单映射
dma_addr_t dma_map_single(struct device *dev, void *addr,
size_t size,www.51embed.com
uW(G/K6vk+M

enum dma_data_direction direction);
void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,J4nmki
K7k#?:Y.l|F

size_t size,嵌入式系统|linux|ARM|单片机D0}{#|pM5`
enum dma_data_direction direction);
4、页面映射
dma_addr_t dma_map_page(struct device *dev, struct page *page,
s({%Xv6}Z!k

unsigned long offset, size_t size,de,et(C
enum dma_data_direction direction);
void dma_unmap_page(struct device *dev, dma_addr_t dma_addr,嵌入式系统|linux|ARM|单片机e9w?;\~
size_t size,www.51embed.com-Ra0w;~$op
enum dma_data_direction direction);
5、有关scatter/gather的函数:www.51embed.comD*}g1Q(r:tt [
int dma_map_sg(struct device *dev, struct scatterlist *sg,嵌入式系统|linux|ARM|单片机*xN ~;lq
int nents, enum dma_data_direction direction);www.51embed.com/^"qT sq-j
void dma_unmap_sg(struct device *dev, struct scatterlist *sg,嵌入式系统|linux|ARM|单片机S#A-@,Ch'd6jT
int nhwentries, enum dma_data_direction direction);
6、非一致性映射(Noncoherent DMA mappings)EOo:UMc
void *dma_alloc_noncoherent(struct device *dev, size_t size,www.51embed.com)]Is$}sXW9\        L
dma_addr_t *dma_handle, int flag);嵌入式应用论坛(tp+R0SMb0N
void dma_sync_single_range(struct device *dev, dma_addr_t dma_handle,
unsigned long offset, size_t size,
enum dma_data_direction direction);
void dma_free_noncoherent(struct device *dev, size_t size,www.51embed.comHQwO/[1M4g
void *cpu_addr, dma_addr_t dma_handle);嵌入式系统|linux|ARM|单片机,Z'S"M'RI
7、DAC (double address cycle)
int pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask);www.51embed.com%R7yS9gJL
void pci_dac_dma_sync_single(struct pci_dev *dev,
dma64_addr_t dma_addr,嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAMUR
^8@/K

size_t len, int direction); 嵌入式系统,linux,VxWorks,ARM,单片机M'D]
},@+WZ:m4F1]


21、 互斥 
嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA+h1]r4h1lks
新增seqlock主要用于:嵌入式应用论坛%]8R Pw!K#Vez~
1、少量的数据保护
2、数据比较简单(没有指针),并且使用频率很高,j Jsi2g        {+Y$sU
3、对不产生任何副作用的数据的访问
4、访问时写者不被饿死
<linux/seqlock.h>嵌入式系统|linux|ARM|单片机O0x/k{1|
初始化#mES+}$A
Y n

seqlock_t lock1 = SEQLOCK_UNLOCKED;
或seqlock_t lock2; seqlock_init(&lock2);
void write_seqlock(seqlock_t *sl);www.51embed.com0N#R)E9Y.\X
void write_sequnlock(seqlock_t *sl);
int write_tryseqlock(seqlock_t *sl);嵌入式应用论坛d
A+ddE'nj

void write_seqlock_irqsave(seqlock_t *sl, long flags);www.51embed.com%v~;bt(d1wa7J J
void write_sequnlock_irqrestore(seqlock_t *sl, long flags);
void write_seqlock_irq(seqlock_t *sl);嵌入式系统|linux|ARM|单片机xe8DtrB        hG I
void write_sequnlock_irq(seqlock_t *sl);www.51embed.comkeje3I        O-_p#~/a
void write_seqlock_bh(seqlock_t *sl);嵌入式应用论坛%i9],WxP"V
void write_sequnlock_bh(seqlock_t *sl);
unsigned int read_seqbegin(seqlock_t *sl);
int read_seqretry(seqlock_t *sl, unsigned int iv);
unsigned int read_seqbegin_irqsave(seqlock_t *sl, long flags);ZM.P;XRu4z:x
int read_seqretry_irqrestore(seqlock_t *sl, unsigned int iv, long flags); 

22、 内核可剥夺 
嵌入式系统|linux|ARM|单片机*| U y?u'N
<linux/preempt.h>
preempt_disable();嵌入式系统,linux,VxWorks,ARM,单片机T$WIN1r/_R,u"eo
preempt_enable_no_resched();嵌入式应用论坛GBw%GDY&o
preempt_enable_noresched();
preempt_check_resched(); 
嵌入式应用论坛'xf0L"Bv4P
23、 眠和唤醒 
www.51embed.com&Hq
^Y ?bg+x

1、原来的函数可用,新增下列函数:
prepare_to_wait_exclusive();嵌入式系统,linux,VxWorks,ARM,单片机4~ M6\/qzD4NW8Ph-?
prepare_to_wait();
2、等待队列的变化
typedef int (*wait_queue_func_t)(wait_queue_t *wait,嵌入式系统,linux,VxWorks,ARM,单片机n0K$WD,LVxl
unsigned mode, int sync);
void init_waitqueue_func_entry(wait_queue_t *queue,
wait_queue_func_t func); 
www.51embed.com(W _Me-|)^%BL0nE
24、 新增完成事件(completion events) www.51embed.comc        bh8^(G%h"H GQ^7}
www.51embed.come%l.w9[;fR9Ow.vM(oAf
<linux/completion.h>&G0K8w1\ca7R8P
init_completion(&my_comp);
void wait_for_completion(struct completion *comp);
void complete(struct completion *comp);
void complete_all(struct completion *comp); 
嵌入式系统,linux,VxWorks,ARM,单片机CF%F{j)}"]
25、 RCU(Read-copy-update)嵌入式应用论坛9];Y/g2q d}s
s,mt-Ip#Uy&]
rcu_read_lock();
void call_rcu(struct rcu_head *head, void (*func)(void *arg),
void *arg);
嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA        e*Z.Ba.BA.E
26、 中断处理 嵌入式系统|linux|ARM|单片机vo8Eb6\-qDc1Wzb#t
嵌入式应用论坛4?7q7Ki,z^y
1、中断处理有返回值了。6V tB._fAC+D4V\
IRQ_RETVAL(handled);www.51embed.com q-k:F,Y-|
2、cli(), sti(), save_flags(), 和 restore_flags()不再有效,应该使用local_save_flags() 或local_irq_disable()。
3、synchronize_irq()函数有改动
4、新增int can_request_irq(unsigned int irq, unsigned long flags);嵌入式应用论坛[2Z-W[T        lzl
5、 request_irq() 和free_irq() 从 <linux/sched.h>改到了 <linux/interrupt.h> 
嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAMZnGv r$T$w
27、 异步I/O(AIO) 
嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAnq%U[a|
<linux/aio.h>嵌入式应用论坛        AV0Y.N)J
ssize_t (*aio_read) (struct kiocb *iocb, char __user *buffer,嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAl-p8tGaOAl?:K
size_t count, loff_t pos);嵌入式系统,linux,VxWorks,ARM,单片机&t%?SfR
b

ssize_t (*aio_write) (struct kiocb *iocb, const char __user *buffer,嵌入式系统|linux|ARM|单片机,uQw|+b#vK
size_t count, loff_t pos);嵌入式应用论坛;d3aGX'o
int (*aio_fsync) (struct kiocb *, int datasync);嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA0p3O?N+]8mI
新增到了file_operation结构中。*CfPNz+u
is_sync_kiocb(struct kiocb *iocb);
int aio_complete(struct kiocb *iocb, long res, long res2);嵌入式应用论坛3r R#b2\0pN+O
嵌入式应用论坛luI5JV @:bi/rc
28、 网络驱动 www.51embed.comEw0}bNar

1、struct net_device *alloc_netdev(int sizeof_priv, const char *name,嵌入式应用论坛`*IcWi$qx
void (*setup)(struct net_device *));www.51embed.com`PEy
y
I(y

struct net_device *alloc_etherdev(int sizeof_priv);.XUBJ*zC+N(M
2、新增NAPI(New API)嵌入式系统|linux|ARM|单片机~
t
vY+HI0[y

void netif_rx_schedule(struct net_device *dev);
void netif_rx_complete(struct net_device *dev);www.51embed.comvB,^'f]v`e'^;I7Oz
int netif_rx_ni(struct sk_buff *skb);嵌入式应用论坛}Vb%Pp.Gd
(老版本为netif_rx())

29、 USB驱动 嵌入式应用论坛U9`/z `@3I

老版本struct usb_driver取消了,新的结构体为
struct usb_class_driver {
char *name;
struct file_operations *fops;嵌入式系统,linux,VxWorks,ARM,单片机f3Og"Yj7q]
mode_t mode;嵌入式应用论坛?s9YW2d"l*~
int minor_base;
};
int usb_submit_urb(struct urb *urb, int mem_flags);嵌入式系统|linux|ARM|单片机(De0^.s d&R!x
int (*probe) (struct usb_inte***ce *intf,www.51embed.comu Se-T7P'U
const struct usb_device_id *id);嵌入式应用论坛.LHGxR1D
嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA6uQPj-aR+x3iQ
30、 block I/O 层 
嵌入式系统,linux,VxWorks,ARM,单片机L
M|:Og|k6T,E#E0K

这一部分做的改动最大。不祥叙。www.51embed.com#p8}I}"mC*ZE4O,w
嵌入式系统|linux|ARM|单片机0@_!N6_3l!Nic
31、 mmap()嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGAXm_i)]$c
嵌入式应用论坛CJ0}].l3mQ0zVh^
int remap_page_range(struct vm_area_struct *vma, unsigned long from,嵌入式系统|linux|ARM|单片机;N6]n
G        B)xO"\yy,b

unsigned long to, unsigned long size,嵌入式应用论坛N-C.XGI3q
hC1]1j;E

pgprot_t prot);嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA@1}:|!G)b(sJs
int io_remap_page_range(struct vm_area_struct *vma, unsigned long from,
unsigned long to, unsigned long size,www.51embed.comdaz!sC6m
pgprot_t prot);嵌入式系统,linux,VxWorks,ARM,单片机 }%l]4]!E/\qy
struct page *(*nopage)(struct vm_area_struct *area,嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA        W4^mUZlki6m
unsigned long address,
int *type);嵌入式应用论坛.J#A@K$I3|
int (*populate)(struct vm_area_struct *area, unsigned long address,嵌入式系统,linux,VxWorks,ARM,单片机!E        nj
KZ^

unsigned long len, pgprot_t prot, unsigned long pgoff,嵌入式应用论坛+X.f1Rl.UF]
int nonblock);
int install_page(struct mm_struct *mm, struct vm_area_struct *vma,
unsigned long addr, struct page *page,a#F(Q)q&He
T`

pgprot_t prot);
struct page *vmalloc_to_page(void *address); 嵌入式系统|linux|ARM|单片机:F.W;jJYY/@
嵌入式应用论坛B \*y
L!g9N,i

32、 零拷贝块I/O(Zero-copy block I/O) 
www.51embed.com
q:@1Zd        |;rw'pS

struct bio *bio_map_user(struct block_device *bdev,
unsigned long uaddr,
unsigned int len,嵌入式系统|linux|ARM|单片机!J f(vw2XB
int write_to_vm);
void bio_unmap_user(struct bio *bio, int write_to_vm);www.51embed.comb~y.C m_5h
int get_user_pages(struct task_struct *task,
struct mm_struct *mm,嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA"GitAS.HpB
unsigned long start,嵌入式系统|linux|ARM|单片机n+ktx/Q)@B2W&M
int len,
int write,rIY)vp'h
int force,
struct page **pages,
struct vm_area_struct **vmas); 嵌入式系统,linux,VxWorks,ARM,单片机@{;F1tv.}
fT)IhY y$I
33、 高端内存操作kmaps www.51embed.com m:J$O\)qp!?t!j
嵌入式系统,linux,VxWorks,ARM,单片机Q0tR~|/H$KGX
void *kmap_atomic(struct page *page, enum km_type type);
void kunmap_atomic(void *address, enum km_type type);www.51embed.com:v c2I-N        op
struct page *kmap_atomic_to_page(void *address);
老版本:kmap() 和 kunmap()。

34、 驱动模型

主要用于设备管理。
1、 sysfs嵌入式系统|linux|ARM|单片机j1}1@nh|!Y5@
2、 Kobjects 嵌入式系统,linux,VxWorks,ARM,单片机c&i{ KI_9U.Q

A unified device number allocator 
4Ind$Z1CDw4O
Traditionally, device drivers have added their devices to the system with calls to register_chrdev() or register_blkdev(). These functions served two functions: allocating a portion of the device number space, and ****** specific devices available to user space. In 2.6, things changed a bit. For character devices, register_chrdev() was replaced by the combination of alloc_chrdev_region(), which allocates device numbers, and cdev_add(), which attaches a device to a specific number. On the block side, register_blkdev() has become optional, but it can still be used to allocate a block major number. The association of block devices with numbers is done with add_disk(). 

In other words, the allocation of device number space and the association of specific numbers with devices have been split in the 2.6 kernel. Matt Mackall was looking at the allocation side recently, where he notice* * **ir amount of duplicated code between the char and block implementations. The current code is also unable to perform dynamic allocation of major numbers outside of the traditional 0..255 range. So Matt put together a patch which cleans things up a bit. 
嵌入式系统,linux,VxWorks,ARM,单片机#XY(|}3jbQnV5{0b
The new allocation scheme relies on simple linked lists. When a new device number request comes in, the code searches the (sorted) list to see if the request can be satisfied. If so, a new entry is added to the list, and the starting device number is returned. This work is done by the new function register_dev(): 
嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA2b5e \R8d#K-CE&Pr
  int register_dev(dev_t base, dev_t top, int size, const char *name,
           struct list_head *list, dev_t *ret);
This function requests that a range of size numbers be allocated from the given list. The first number should fall between base and top; if a suitable range is found, that first number will be returned in ret. The list is a simple, list_head structure which is initially empty; the caller must provide locking to prevent concurrent calls to register_dev() using the same list. 嵌入式系统,linux,VxWorks,ARM,单片机,DSP,FPGA4_        I*B        r0p
|8}:bRI


The new inte***ce works; it also replaces a fair amount of common code in the char and block code. Other than some quibbles about potential performance problems resulting from the linear list search algorithm (which should not really matter, since device number allocation is a rare operation), there seem to be no real objections to the new scheme. So it may find its way into a -mm kernel before too long. 

A future change would allow the dynamic allocation of device numbers in the expanded range; for now, dynamic major n
原创粉丝点击