在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux2.6內(nèi)核驅(qū)動(dòng)移植參考

            Linux2.6內(nèi)核驅(qū)動(dòng)移植參考

            作者: 時(shí)間:2011-02-25 來(lái)源:網(wǎng)絡(luò) 收藏

            Linux2.6內(nèi)核驅(qū)動(dòng)移植參考


            作者:晏渭川
            隨著Linux2.6的發(fā)布,由于2.6內(nèi)核做了教的改動(dòng),各個(gè)設(shè)備的驅(qū)動(dòng)程序在不同程度上要
            進(jìn)行改寫。為了方便各位Linux愛(ài)好者我把自己整理的這分文檔share出來(lái)。該文當(dāng)列舉
            了2.6內(nèi)核同以前版本的絕大多數(shù)變化,可惜的是由于時(shí)間和精力有限沒(méi)有詳細(xì)列出各個(gè)
            函數(shù)的用法。
            特別聲明:該文檔中的內(nèi)容來(lái)自http:/lwn.net,該網(wǎng)也上也有各個(gè)函數(shù)的較為詳細(xì)的
            說(shuō)明可供各位參考。如果需要該文檔的word版的朋友, 請(qǐng)mail到[email protected]
            取。

            1、 使用新的入口
            必須包含 linux/init.h>
            module_init(your_init_func);
            module_exit(your_exit_func);
            老版本:int init_module(void);
            void cleanup_module(voi);
            2.4中兩種都可以用,對(duì)如后面的入口函數(shù)不必要顯示包含任何頭文件。
            2、 GPL
            MODULE_LICENSE("Dual BSD/GPL");
            老版本:MODULE_LICENSE("GPL");
            3、 模塊參數(shù)
            必須顯式包含linux/moduleparam.h>
            module_param(name, type, perm);
            module_param_named(name, value, type, perm);
            參數(shù)定義
            module_param_string(name, string, len, perm);
            module_param_array(name, type, num, perm);
            老版本:MODULE_PARM(variable,type);
            MODULE_PARM_DESC(variable,type);
            4、 模塊別名
            MODULE_ALIAS("alias-name");
            這是新增的,在老版本中需在/etc/modules.conf配置,現(xiàn)在在代碼中就可以實(shí)現(xiàn)。
            5、 模塊計(jì)數(shù)
            int try_module_get(module);
            module_put();
            老版本:MOD_INC_USE_COUNT 和 MOD_DEC_USE_COUNT
            6、 符號(hào)導(dǎo)出
            只有顯示的導(dǎo)出符號(hào)才能被其他模塊使用,默認(rèn)不導(dǎo)出所有的符號(hào),不必使用EXPORT_NO
            _SYMBOLS
            老板本:默認(rèn)導(dǎo)出所有的符號(hào),除非使用EXPORT_NO_SYMBOLS
            7、 內(nèi)核版本檢查
            需要在多個(gè)文件中包含linux/module.h>時(shí),不必定義__NO_VERSION__
            老版本:在多個(gè)文件中包含linux/module.h>時(shí),除在主文件外的其他文件中必須定義_
            _NO_VERSION__,防止版本重復(fù)定義。
            8、 設(shè)備號(hào)
            kdev_t被廢除不可用,新的dev_t拓展到了32位,12位主設(shè)備號(hào),20位次設(shè)備號(hào)。
            unsigned int iminor(struct inode *inode);
            unsigned int imajor(struct inode *inode);
            老版本:8位主設(shè)備號(hào),8位次設(shè)備號(hào)
            int MAJOR(kdev_t dev);
            int MINOR(kdev_t dev);
            9、 內(nèi)存分配頭文件變更
            所有的內(nèi)存分配函數(shù)包含在頭文件linux/slab.h>,而原來(lái)的linux/malloc.h>不存在
            老版本:內(nèi)存分配函數(shù)包含在頭文件linux/malloc.h>
            10、 結(jié)構(gòu)體的初試化
            gcc開(kāi)始采用ANSI C的struct結(jié)構(gòu)體的初始化形式:
            static struct some_structure = {
            .field1 = value,
            .field2 = value,
            ..
            };
            老版本:非標(biāo)準(zhǔn)的初試化形式
            static struct some_structure = {
            field1: value,
            field2: value,
            ..
            };
            11、 用戶模式幫助器
            int call_usermodehelper(char *path, char **argv, char **envp,
            int wait);
            新增wait參數(shù)
            12、 request_module()
            request_module("foo-device-%d", number);
            老版本:
            char module_name[32];
            printf(module_name, "foo-device-%d", number);
            request_module(module_name);
            13、 dev_t引發(fā)的字符設(shè)備的變化
            1、取主次設(shè)備號(hào)為
            unsigned iminor(struct inode *inode);
            unsigned imajor(struct inode *inode);
            2、老的register_chrdev()用法沒(méi)變,保持向后兼容,但不能訪問(wèn)設(shè)備號(hào)大于256的設(shè)備
            。
            3、新的接口為
            a)注冊(cè)字符設(shè)備范圍
            int register_chrdev_region(dev_t from, unsigned count, char *name);
            b)動(dòng)態(tài)申請(qǐng)主設(shè)備號(hào)
            int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, char
            *name);
            看了這兩個(gè)函數(shù)郁悶吧^_^!怎么和file_operations結(jié)構(gòu)聯(lián)系起來(lái)?。縿e急!
            c)包含 linux/cdev.h>,利用struct cdev和file_operations連接
            struct cdev *cdev_alloc(void);
            void cdev_init(struct cdev *cdev, struct file_operations *fops);
            int cdev_add(struct cdev *cdev, dev_t dev, unsigned count);
            (分別為,申請(qǐng)cdev結(jié)構(gòu),和fops連接,將設(shè)備加入到系統(tǒng)中!好復(fù)雜?。。?
            d)void cdev_del(struct cdev *cdev);
            只有在cdev_add執(zhí)行成功才可運(yùn)行。
            e)輔助函數(shù)
            kobject_put(cdev->kobj);
            struct kobject *cdev_get(struct cdev *cdev);
            void cdev_put(struct cdev *cdev);
            這一部分變化和新增的/sys/dev有一定的關(guān)聯(lián)。
            14、 新增對(duì)/proc的訪問(wèn)操作
            linux/seq_file.h>
            以前的/proc中只能得到string, seq_file操作能得到如long等多種數(shù)據(jù)。
            相關(guān)函數(shù):
            static struct seq_operations 必須實(shí)現(xiàn)這個(gè)類似file_operations得數(shù)據(jù)中得各個(gè)成
            員函數(shù)。
            seq_printf();
            int seq_putc(struct seq_file *m, char c);
            int seq_puts(struct seq_file *m, const char *s);
            int seq_escape(struct seq_file *m, const char *s, const char *esc);
            int seq_path(struct seq_file *m, struct vfsmount *mnt,
            struct dentry *dentry, char *esc);
            seq_open(file, ct_seq_ops);
            等等
            15、 底層內(nèi)存分配
            1、linux/malloc.h>頭文件改為linux/slab.h>
            2、分配標(biāo)志GFP_BUFFER被取消,取而代之的是GFP_NOIO 和 GFP_NOFS
            3、新增__GFP_REPEAT,__GFP_NOFAIL,__GFP_NORETRY分配標(biāo)志
            4、頁(yè)面分配函數(shù)alloc_pages(),get_free_page()被包含在linux/gfp.h>中
            5、對(duì)NUMA系統(tǒng)新增了幾個(gè)函數(shù):
            a) struct page *alloc_pages_node(int node_id,
            unsigned int gfp_mask,
            unsigned int order);
            b) void free_hot_page(struct page *page);
            c) void free_cold_page(struct page *page);
            6、 新增Memory pools
            linux/mempool.h>
            mempool_t *mempool_create(int min_nr,
            mempool_alloc_t *alloc_fn,
            mempool_free_t *free_fn,
            void *pool_data);
            void *mempool_alloc(mempool_t *pool, int gfp_mask);
            void mempool_free(void *element, mempool_t *pool);
            int mempool_resize(mempool_t *pool, int new_min_nr, int gfp_mask);
            16、 per-CPU變量
            get_cpu_var();
            put_cpu_var();
            void *alloc_percpu(type);
            void free_percpu(const void *);
            per_cpu_ptr(void *ptr, int cpu)
            get_cpu_ptr(ptr)
            put_cpu_ptr(ptr)
            老版本使用
            DEFINE_PER_CPU(type, name);
            EXPORT_PER_CPU_SYMBOL(name);
            EXPORT_PER_CPU_SYMBOL_GPL(name);
            DECLARE_PER_CPU(type, name);
            DEFINE_PER_CPU(int, mypcint);
            2.6內(nèi)核采用了可剝奪得調(diào)度方式這些宏都不安全。
            17、 內(nèi)核時(shí)間變化
            1、現(xiàn)在的各個(gè)平臺(tái)的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的變化,原來(lái)的jiffies計(jì)數(shù)器很快就溢出了,引入了新的計(jì)數(shù)器jiffies_64
            3、#include linux/jiffies.h>
            u64 my_time = get_jiffies_64();
            4、新的時(shí)間結(jié)構(gòu)增加了納秒成員變量
            struct timespec current_kernel_time(void);
            5、他的timer函數(shù)沒(méi)變,新增
            void add_timer_on(struct timer_list *timer, int cpu);
            6、新增納秒級(jí)延時(shí)函數(shù)
            ndelay();
            7、POSIX clocks 參考kernel/posix-timers.c
            18、 工作隊(duì)列(workqueue)
            1、任務(wù)隊(duì)列(task queue )接口函數(shù)都被取消,新增了workqueue接口函數(shù)
            struct workqueue_struct *create_workqueue(const char *name);
            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,
            void (*function)(void *), void *data);
            2、申明struct work_struct結(jié)構(gòu)
            int queue_work(struct workqueue_struct *queue,
            struct work_struct *work);
            int queue_delayed_work(struct workqueue_struct *queue,
            struct work_struct *work,
            unsigned long delay);
            int cancel_delayed_work(struct work_struct *work);
            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);
            19、 新增創(chuàng)建VFS的"libfs"
            libfs給創(chuàng)建一個(gè)新的文件系統(tǒng)提供了大量的API.
            主要是對(duì)struct file_system_type的實(shí)現(xiàn)。
            參考源代碼:
            drivers/hotplug/pci_hotplug_core.c
            drivers/usb/core/inode.c
            drivers/oprofile/oprofilefs.c
            fs/ramfs/inode.c
            fs/nfsd/nfsctl.c (simple_fill_super() example)
            20、 DMA的變化
            未變化的有:
            void *pci_alloc_consistent(struct pci_dev *dev, size_t size,
            dma_addr_t *dma_handle);
            void pci_free_consistent(struct pci_dev *dev, size_t size,
            void *cpu_addr, dma_addr_t dma_handle);
            變化的有:
            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、列舉了映射方向:
            enum dma_data_direction {
            DMA_BIDIRECTIONAL = 0,
            DMA_TO_DEVICE = 1,
            DMA_FROM_DEVICE = 2,
            DMA_NONE = 3,
            };
            3、單映射
            dma_addr_t dma_map_single(struct device *dev, void *addr,
            size_t size,
            enum dma_data_direction direction);
            void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
            size_t size,
            enum dma_data_direction direction);
            4、頁(yè)面映射
            dma_addr_t dma_map_page(struct device *dev, struct page *page,
            unsigned long offset, size_t size,
            enum dma_data_direction direction);
            void dma_unmap_page(struct device *dev, dma_addr_t dma_addr,
            size_t size,
            enum dma_data_direction direction);
            5、有關(guān)scatter/gather的函數(shù):
            int dma_map_sg(struct device *dev, struct scatterlist *sg,
            int nents, enum dma_data_direction direction);
            void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
            int nhwentries, enum dma_data_direction direction);
            6、非一致性映射(Noncoherent DMA mappings)
            void *dma_alloc_noncoherent(struct device *dev, size_t size,
            dma_addr_t *dma_handle, int flag);
            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,
            void *cpu_addr, dma_addr_t dma_handle);
            7、DAC (double address cycle)
            int pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask);
            void pci_dac_dma_sync_single(struct pci_dev *dev,
            dma64_addr_t dma_addr,
            size_t len, int direction);
            21、 互斥
            新增seqlock主要用于:
            1、少量的數(shù)據(jù)保護(hù)
            2、數(shù)據(jù)比較簡(jiǎn)單(沒(méi)有指針),并且使用頻率很高
            3、對(duì)不產(chǎn)生任何副作用的數(shù)據(jù)的訪問(wèn)
            4、訪問(wèn)時(shí)寫者不被餓死
            linux/seqlock.h>
            初始化
            seqlock_t lock1 = SEQLOCK_UNLOCKED;
            或seqlock_t lock2; seqlock_init(lock2);
            void write_seqlock(seqlock_t *sl);
            void write_sequnlock(seqlock_t *sl);
            int write_tryseqlock(seqlock_t *sl);
            void write_seqlock_irqsave(seqlock_t *sl, long flags);
            void write_sequnlock_irqrestore(seqlock_t *sl, long flags);
            void write_seqlock_irq(seqlock_t *sl);
            void write_sequnlock_irq(seqlock_t *sl);
            void write_seqlock_bh(seqlock_t *sl);
            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);
            int read_seqretry_irqrestore(seqlock_t *sl, unsigned int iv, long
            flags);
            22、 內(nèi)核可剝奪
            linux/preempt.h>
            preempt_disable();
            preempt_enable_no_resched();
            preempt_enable_noresched();
            preempt_check_resched();
            23、 眠和喚醒
            1、原來(lái)的函數(shù)可用,新增下列函數(shù):
            prepare_to_wait_exclusive();
            prepare_to_wait();
            2、等待隊(duì)列的變化
            typedef int (*wait_queue_func_t)(wait_queue_t *wait,
            unsigned mode, int sync);
            void init_waitqueue_func_entry(wait_queue_t *queue,
            wait_queue_func_t func);
            24、 新增完成事件(completion events)
            linux/completion.h>
            init_completion(my_comp);
            void wait_for_completion(struct completion *comp);
            void complete(struct completion *comp);
            void complete_all(struct completion *comp);
            25、 RCU(Read-copy-update)
            rcu_read_lock();
            void call_rcu(struct rcu_head *head, void (*func)(void *arg),
            void *arg);
            26、 中斷處理
            1、中斷處理有返回值了。
            IRQ_RETVAL(handled);
            2、cli(), sti(), save_flags(), 和 restore_flags()不再有效,應(yīng)該使用local_save
            _flags() 或local_irq_disable()。
            3、synchronize_irq()函數(shù)有改動(dòng)
            4、新增int can_request_irq(unsigned int irq, unsigned long flags);
            5、 request_irq() 和free_irq() 從 linux/sched.h>改到了 linux/interrupt.h>
            27、 異步I/O(AIO)
            linux/aio.h>
            ssize_t (*aio_read) (struct kiocb *iocb, char __user *buffer,
            size_t count, loff_t pos);
            ssize_t (*aio_write) (struct kiocb *iocb, const char __user *buffer,
            size_t count, loff_t pos);
            int (*aio_fsync) (struct kiocb *, int datasync);
            新增到了file_operation結(jié)構(gòu)中。
            is_sync_kiocb(struct kiocb *iocb);
            int aio_complete(struct kiocb *iocb, long res, long res2);
            28、 網(wǎng)絡(luò)驅(qū)動(dòng)
            1、struct net_device *alloc_netdev(int sizeof_priv, const char *name,
            void (*setup)(struct net_device *));
            struct net_device *alloc_etherdev(int sizeof_priv);
            2、新增NAPI(New API)
            void netif_rx_schedule(struct net_device *dev);
            void netif_rx_complete(struct net_device *dev);
            int netif_rx_ni(struct sk_buff *skb);
            (老版本為netif_rx())
            29、 USB驅(qū)動(dòng)
            老版本struct usb_driver取消了,新的結(jié)構(gòu)體為
            struct usb_class_driver {
            char *name;
            struct file_operations *fops;
            mode_t mode;
            int minor_base;
            };
            int usb_submit_urb(struct urb *urb, int mem_flags);
            int (*probe) (struct usb_interface *intf,
            const struct usb_device_id *id);
            30、 block I/O 層
            這一部分做的改動(dòng)最大。不祥敘。
            31、 mmap()
            int remap_page_range(struct vm_area_struct *vma, unsigned long from,
            unsigned long to, unsigned long size,
            pgprot_t prot);
            int io_remap_page_range(struct vm_area_struct *vma, unsigned long from,
            unsigned long to, unsigned long size,
            pgprot_t prot);
            struct page *(*nopage)(struct vm_area_struct *area,
            unsigned long address,
            int *type);
            int (*populate)(struct vm_area_struct *area, unsigned long address,
            unsigned long len, pgprot_t prot, unsigned long pgoff,
            int nonblock);
            int install_page(struct mm_struct *mm, struct vm_area_struct *vma,
            unsigned long addr, struct page *page,
            pgprot_t prot);
            struct page *vmalloc_to_page(void *address);
            32、 零拷貝塊I/O(Zero-copy block I/O)
            struct bio *bio_map_user(struct block_device *bdev,
            unsigned long uaddr,
            unsigned int len,
            int write_to_vm);
            void bio_unmap_user(struct bio *bio, int write_to_vm);
            int get_user_pages(struct task_struct *task,
            struct mm_struct *mm,
            unsigned long start,
            int len,
            int write,
            int force,
            struct page **pages,
            struct vm_area_struct **vmas);
            33、 高端內(nèi)存操作kmaps
            void *kmap_atomic(struct page *page, enum km_type type);
            void kunmap_atomic(void *address, enum km_type type);
            struct page *kmap_atomic_to_page(void *address);
            老版本:kmap() 和 kunmap()。
            34、 驅(qū)動(dòng)模型
            主要用于設(shè)備管理。
            1、 sysfs
            2、 Kobjects

            推薦文章:
            http:/www-900.ibm.com/developerWorks/cn/linux/kernel/l-kernel26/index.shtml
            http:/www-900.ibm.com/developerWorks/cn/linux/l-inside/index.shtml

            2.6里不需要再定義“__KERNEL__”和“MODULE”了。
            用下面的Makefile文件編譯:

            代碼:

            obj-m := hello.o

            KDIR := /lib/modules/$(shell uname -r)/build
            PWD := $(shell pwd)
            default:
            $(MAKE) -C $(KDIR) M=$(PWD) modules

            linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉