freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

linux下pci設(shè)備驅(qū)動程序開發(fā)-文庫吧資料

2025-08-10 09:47本頁面
  

【正文】 read: demo_read, /* 讀設(shè)備操作*/ write: demo_write, /* 寫設(shè)備操作*/ ioctl: demo_ioctl, /* 控制設(shè)備操作*/ mmap: demo_mmap, /* 內(nèi)存重映射操作*/ open: demo_open, /* 打開設(shè)備操作*/ release: demo_release /* 釋放設(shè)備操作*/ /* ... */}。/* 對特定PCI設(shè)備進(jìn)行描述的數(shù)據(jù)結(jié)構(gòu) */struct demo_card { unsigned int magic。下面給出一個典型的PCI設(shè)備驅(qū)動程序的基本框架,從中不難體會到這幾個關(guān)鍵模塊是如何組織起來的。}。 int (*activate)(struct pci_dev *dev)。 unsigned short regs。 int active。 char name[80]。 struct resource dma_resource[DEVICE_COUNT_DMA]。 unsigned int irq。 unsigned short vendor_patible[DEVICE_COUNT_COMPATIBLE]。 u64 dma_mask。 struct pci_driver *driver。 u8 hdr_type。 unsigned short subsystem_device。 unsigned short device。 unsigned int devfn。 void *sysdata。 struct pci_bus *bus。 pci_dev 這個數(shù)據(jù)結(jié)構(gòu)也在文件include/linux/,它詳細(xì)描述了一個PCI設(shè)備幾乎所有的硬件信息,包括廠商ID、設(shè)備ID、各種資源等: struct pci_dev { struct list_head global_list。}。 int (*resume) (struct pci_dev *dev)。 int (*save_state) (struct pci_dev *dev, u32 state)。 int (*probe) (struct pci_dev *dev, const struct pci_device_id *id)。 char *name。 在PCI驅(qū)動程序中,下面幾個關(guān)鍵數(shù)據(jù)結(jié)構(gòu)起著非常核心的作用: Linux驅(qū)動程序通常使用結(jié)構(gòu)(struct)來表示一種設(shè)備,而結(jié)構(gòu)體中的變量則代表某一具體設(shè)備,該變量存放了與該設(shè)備相關(guān)的所有信息。CPU可以訪問PCI設(shè)備上的所有地址空間,其中I/O空間和存儲空間提供給設(shè)備驅(qū)動程序使用,而配置空間則由Linux內(nèi)核中的PCI初始化代碼使用。如果設(shè)備支持中斷,則可以按中斷方式進(jìn)行操作。 設(shè)備的控制操作 除了讀寫操作外,應(yīng)用程序有時還需要對設(shè)備進(jìn)行控制,這可以通過設(shè)備驅(qū)動程序中的函數(shù)ioctl( )來完成。如果內(nèi)存緩沖區(qū)中沒有所要讀入的數(shù)據(jù),或者需要執(zhí)行寫操作將數(shù)據(jù)寫入設(shè)備,那么就要執(zhí)行真正的數(shù)據(jù)傳輸,這是通過調(diào)用數(shù)據(jù)結(jié)構(gòu)blk_dev_struct中的函數(shù)request_fn( )來完成的。但如果是塊設(shè)備的話,則需要調(diào)用函數(shù)block_read( )和block_write( )來進(jìn)行數(shù)據(jù)讀寫,這兩個函數(shù)將向設(shè)備請求表中增加讀寫請求,以便Linux內(nèi)核可以對請求順序進(jìn)行優(yōu)化。 7. 釋放在fileprivate_data中分配的內(nèi)存。 5. 使用計數(shù)增1。 3. 識別次設(shè)備號,如果有必要則更新讀寫操作的當(dāng)前位置指針f_ops。在大部分驅(qū)動程序中,open( )通常需要完成下列工作: 1. 檢查設(shè)備相關(guān)錯誤,如設(shè)備尚未準(zhǔn)備好等。 驅(qū)動程序的注冊與注銷 向系統(tǒng)增加一個驅(qū)動程序意味著要賦予它一個主設(shè)備號,這可以通過在驅(qū)動程序的初始化過程中調(diào)用register_chrdev( )或者register_blkdev( )來完成。 3. 設(shè)備驅(qū)動程序結(jié)構(gòu)了解設(shè)備驅(qū)動程序的基本結(jié)構(gòu)(或者稱為框架),對開發(fā)人員而言是非常重要的,Linux的設(shè)備驅(qū)動程序大致可以分為如下幾個部分:驅(qū)動程序的注冊與注銷、設(shè)備的打開與釋放、設(shè)備的讀寫操作、設(shè)備的控制操作、設(shè)備的中斷和輪詢處理。當(dāng)不需要該模塊時,可以使用rmmod命令進(jìn)行卸載,此進(jìn)內(nèi)核會調(diào)用模塊中的函數(shù)cleanup_module( )。 在以模塊方式編寫驅(qū)動程序時,要實(shí)現(xiàn)兩個必不可少的函數(shù)init_module( )和cleanup_module( ),而且至少要包含linux/和linux/兩個頭文件。如果編譯進(jìn)內(nèi)核的話,會增加內(nèi)核的大小,還要改動內(nèi)核的源文件,而且不能動態(tài)地卸載,不利于調(diào)試,所有推薦使用模塊方式。例如,當(dāng)應(yīng)用程序?qū)υO(shè)備文件執(zhí)行讀操作時,內(nèi)核將調(diào)用file_operations結(jié)構(gòu)中的read函數(shù)。}。 ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int)。 ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *)。 int (*fasync) (int, struct file *, int)。 int (*release) (struct inode *, struct file *)。 int (*open) (struct inode *, struct file *)。 int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long)。 int (*readdir) (struct file *, void *, filldir_t)。 ssize_t (*read) (struct file *, char *, size_t, loff_t *)。 2. 設(shè)備驅(qū)動程序接口Linux中的I/O子系統(tǒng)向內(nèi)核中的其他部分提供了一個統(tǒng)一的標(biāo)準(zhǔn)設(shè)備接口,這是通過include/linux/: struct file_o
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1