linux教程第08課內(nèi)存與設(shè)備管理ppt課件_第1頁
linux教程第08課內(nèi)存與設(shè)備管理ppt課件_第2頁
linux教程第08課內(nèi)存與設(shè)備管理ppt課件_第3頁
linux教程第08課內(nèi)存與設(shè)備管理ppt課件_第4頁
linux教程第08課內(nèi)存與設(shè)備管理ppt課件_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、程序的鏈接和內(nèi)存裝入程序的鏈接和內(nèi)存裝入延續(xù)分配方式延續(xù)分配方式單一延續(xù)分配單一延續(xù)分配 這是最簡單的一種存儲管理方式,但只能用于單用戶、單義務(wù)的操作系統(tǒng)中。采用這種存儲管理方式時,可把內(nèi)存分為系統(tǒng)區(qū)和用戶區(qū)兩部分,系統(tǒng)區(qū)僅提供應(yīng)OS運用,通常是放在內(nèi)存的低址部分;用戶區(qū)是指除系統(tǒng)區(qū)以外的全部內(nèi)存空間, 提供應(yīng)用戶運用。 固定分區(qū)分配固定分區(qū)分配 1. 劃分分區(qū)的方法劃分分區(qū)的方法 分區(qū)大小相等, 即使一切的內(nèi)存分區(qū)大小相等。 (2) 分區(qū)大小不等。 2. 內(nèi)存分配內(nèi)存分配 固定分區(qū)運用表 4.2.3 動態(tài)分區(qū)分配動態(tài)分區(qū)分配 1. 分區(qū)分配中的數(shù)據(jù)構(gòu)造分區(qū)分配中的數(shù)據(jù)構(gòu)造 空閑分區(qū)表。 (2

2、) 空閑分區(qū)鏈。 空閑鏈構(gòu)造 前向指針N20N個字節(jié)可用后向指針N20頁表 設(shè)備驅(qū)動的分層構(gòu)造 設(shè)備驅(qū)動是Linux內(nèi)核的重要組成部分。驅(qū)動程序跟普通的用戶運用程序不同,它任務(wù)在內(nèi)核態(tài),編程方法和運用的庫函數(shù)都跟用戶級的運用程序有所區(qū)別。在Linux內(nèi)核中,設(shè)備驅(qū)動跟文件系統(tǒng)聯(lián)絡(luò)嚴密。每一個設(shè)備都是作為一個設(shè)備文件,交給文件系統(tǒng)去管理的。 設(shè)備驅(qū)動程序內(nèi)部是由一組函數(shù)組成的。函數(shù)由設(shè)備驅(qū)動的上層文件系統(tǒng)來調(diào)用,每一個函數(shù)被稱做一個入口點。入口點的集合被稱為設(shè)備驅(qū)動程序的上半部分,實現(xiàn)設(shè)備驅(qū)動與文件系統(tǒng)的接口。常用的入口點有:open、close或release、read、write、ioctl

3、等。 每一個函數(shù)的內(nèi)部實現(xiàn)被稱作驅(qū)動程序的下半部分,擔任實現(xiàn)詳細的設(shè)備操作。函數(shù)的內(nèi)部實現(xiàn)通常是靠系統(tǒng)調(diào)用提供的函數(shù)實現(xiàn)的,不能運用平常我們運用的用戶級的C言語庫函數(shù)。Linux經(jīng)過設(shè)備號來區(qū)分不同的設(shè)備。設(shè)備號由兩部分組成:主設(shè)備號MAJOR和次設(shè)備號MINOR。主設(shè)備號MAJOR指明對應(yīng)哪些設(shè)備驅(qū)動。普通一個主設(shè)備號對應(yīng)一個驅(qū)動程序。次設(shè)備號MINOR用來區(qū)分同一個驅(qū)動程序控制下的不同的獨立的設(shè)備。例如:硬盤的主設(shè)備稱號為hd。在/dev目錄下hd即為硬盤。/dev/hda、/dev/hdb等是系統(tǒng)的第一個硬盤和第二個硬盤。而hda0和hda1分別是第一個硬盤上的第一個分區(qū)和第二個分區(qū)。/

4、proc/devices列出一切如今正在運用的設(shè)備號。Linux操作系統(tǒng)將一切的設(shè)備全部看成文件,并經(jīng)過文件的操作界面進展操作,用戶程序可以像對其他文件一樣對此設(shè)備文件進展操作。這意味著: 由于每一個設(shè)備至少由文件系統(tǒng)的一個文件代表,因此都有一個“文件名。 運用程序通??梢越?jīng)過系統(tǒng)調(diào)用open()翻開設(shè)備文件,建立起與目的設(shè)備的銜接。 翻開了代表著目的設(shè)備的文件,即建立起與設(shè)備的銜接后,可以經(jīng)過read()、write()、ioctl()等常規(guī)的文件操作對目的設(shè)備進展操作。設(shè)備文件的屬性由三部分信息組成:第一部分是文件的類型,第二部分是一個主設(shè)備號,第三部分是一個次設(shè)備號。其中類型和主設(shè)備號結(jié)

5、合在一同獨一地確定了設(shè)備文件驅(qū)動程序及其界面,而次設(shè)備號那么闡明目的設(shè)備是同類設(shè)備中的第幾個。設(shè)備文件不能用普通的方法建立。要經(jīng)過mknod命令。mknod命令的語法:mknod 途徑 方式 主設(shè)備號 次設(shè)備號方式有兩種:c為字符設(shè)備 b為塊設(shè)備例如:mknod /dev/test c 254 0設(shè)備文件可以象普通文件一樣直接運用,例如:/dev/lp0為一個打印機,運用cat doc.txt/dev/lp0就可以將文檔交給打印機去進展打印/dev/ttyS0為主機上的串口COM1,運用讀寫文件的方法,也可以實現(xiàn)對串口的讀寫操作一、設(shè)備驅(qū)動中的關(guān)鍵數(shù)據(jù)構(gòu)造二、驅(qū)動程序框架三、實現(xiàn)各種功能的根本

6、函數(shù)四、實例要編寫設(shè)備驅(qū)動程序,就要實現(xiàn)它跟高層文件系統(tǒng)和底層硬件之間的操作接口。這些接口普通要遵照DDI/DKIDevice-Driver Interface / Device-Kernel Interface接口規(guī)范,所以要運用一些規(guī)范的數(shù)據(jù)構(gòu)造來進展操作。底層硬件的操作主要由不同硬件的特性來決議。跟文件系統(tǒng)的接口主要運用三個數(shù)據(jù)構(gòu)造:inode文件索引節(jié)點構(gòu)造struct file文件構(gòu)造file_operations文件操作構(gòu)造,設(shè)備驅(qū)動程序要實現(xiàn)這個構(gòu)造里的主要操作struct inode稱做索引節(jié)點數(shù)據(jù)構(gòu)造,定義如下:struct inode struct list_head i_

7、hash;struct list_head i_list;struct list_head i_dentry;struct list_head i_dirty_buffers;struct list_head i_dirty_data_buffers;unsigned longi_ino;atomic_ti_count;kdev_ti_dev;umode_ti_mode;nlink_ti_nlink;uid_ti_uid;gid_ti_gid;kdev_ti_rdev;loff_ti_size;time_ti_atime;time_ti_mtime;time_ti_ctime;unsigned

8、 inti_blkbits;unsigned longi_blksize;unsigned longi_blocks;unsigned longi_version;struct semaphorei_sem;struct semaphorei_zombie;struct inode_operations*i_op;struct file_operations*i_fop;/文件操作指針struct super_block*i_sb;wait_queue_head_ti_wait;struct file_lock*i_flock;struct address_space*i_mapping;st

9、ruct address_spacei_data;struct dquot*i_dquotMAXQUOTAS;struct list_head i_devices;struct pipe_inode_info*i_pipe;struct block_device*i_bdev;/塊設(shè)備struct char_device*i_cdev;/字符設(shè)備unsigned longi_dnotify_mask; struct dnotify_struct*i_dnotify; unsigned longi_state;unsigned inti_flags;unsigned chari_sock;ato

10、mic_ti_writecount;unsigned inti_attr_flags;_u32i_generation;union struct minix_inode_infominix_i; struct ext2_inode_infoext2_i; struct ext3_inode_infoext3_i; struct hpfs_inode_infohpfs_i; struct ntfs_inode_infontfs_i; struct msdos_inode_infomsdos_i; struct umsdos_inode_infoumsdos_i; struct iso_inode

11、_infoisofs_i; struct nfs_inode_infonfs_i; struct sysv_inode_infosysv_i; struct affs_inode_infoaffs_i; struct ufs_inode_infoufs_i; struct efs_inode_infoefs_i; struct romfs_inode_inforomfs_i; struct shmem_inode_infoshmem_i; struct coda_inode_infocoda_i; struct smb_inode_infosmbfs_i; struct hfs_inode_i

12、nfohfs_i; struct adfs_inode_infoadfs_i; struct qnx4_inode_infoqnx4_i; struct reiserfs_inode_inforeiserfs_i; struct bfs_inode_infobfs_i; struct udf_inode_infoudf_i; struct ncp_inode_infoncpfs_i; struct proc_inode_infoproc_i; struct socketsocket_i; struct usbdev_inode_info usbdev_i; struct jffs2_inode

13、_infojffs2_i; void*generic_ip; u; struct file主要用于與文件系統(tǒng)相關(guān)的設(shè)備驅(qū)動程序,可提供關(guān)于被翻開的文件的信息,定義如下:struct file struct list_headf_list;struct dentry*f_dentry;struct vfsmount *f_vfsmnt;struct file_operations*f_op;atomic_tf_count;unsigned int f_flags;mode_tf_mode;loff_tf_pos;unsigned long f_reada, f_ramax, f_raend, f

14、_ralen, f_rawin;struct fown_structf_owner;unsigned intf_uid, f_gid;intf_error;unsigned longf_version;/* needed for tty driver, and maybe others */void*private_data;/* preallocated helper kiobuf to speedup O_DIRECT */struct kiobuf*f_iobuf;longf_iobuf_lock;struct file_operations struct module *owner;l

15、off_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char *, size_t, loff_t *);ssize_t (*write) (struct file *, const char *, size_t, loff_t *);int (*readdir) (struct file *, void *, filldir_t);unsigned int (*poll) (struct file *, struct poll_table_struct *);int (*ioctl) (str

16、uct inode *, struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);int (*open) (struct inode *, struct file *);int (*flush) (struct file *);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, struct dentry *, int datasync);int (*fasy

17、nc) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *);ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);ssize_t (*sendpage) (struct file *, struct page *, int,

18、size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *,unsigned long, unsigned long, unsigned long, unsigned long);在用戶本人的驅(qū)動程序中,首先要根據(jù)驅(qū)動程序的功能,完成file_operations構(gòu)造中函數(shù)的實現(xiàn)。不需求的函數(shù)接口可以直接在file_operations構(gòu)造中初始化為NULL。file_operations中的變量會在驅(qū)動程序初始化時,注冊到系統(tǒng)內(nèi)部。每個進程對設(shè)備的操作,都會根據(jù)主次設(shè)備號,轉(zhuǎn)換成對file_operation

19、s構(gòu)造的訪問。在設(shè)備驅(qū)動中,假設(shè)有需求的操作而本構(gòu)造中沒有提供的,統(tǒng)統(tǒng)交給ioctl函數(shù)實現(xiàn) Linux的設(shè)備驅(qū)動程序與外部的接口可以分為三部分:驅(qū)動程序與內(nèi)核的接口:經(jīng)過file_operations來完成驅(qū)動程序與系統(tǒng)引導(dǎo)的接口:利用驅(qū)動程序?qū)υO(shè)備初始化驅(qū)動程序與設(shè)備的接口:描畫了驅(qū)動程序如何與設(shè)備進展交互,這部分與詳細設(shè)備親密相關(guān)驅(qū)動程序的代碼可以分成以下幾個部分:驅(qū)動程序的注冊和注銷;設(shè)備的翻開和釋放;設(shè)備的讀寫;設(shè)備的控制;設(shè)備的中斷和查詢。1. 驅(qū)動程序的注冊和注銷:驅(qū)動程序普統(tǒng)統(tǒng)過注冊的方式將本人的函數(shù)操作集與詳細的設(shè)備關(guān)聯(lián)起來。所以,在設(shè)備初始化時,應(yīng)向系統(tǒng)進展登記regist

20、er。卸載設(shè)備的時候用unregister注銷。字符設(shè)備和塊設(shè)備的注冊和注銷并不一樣。字符設(shè)備的注冊函數(shù)是:int register_chrdev(unsigned int major,const char *name,struct file_operations *fops)卸載函數(shù)是:int unregister_chrdev(unsigned int major,const char *name)Linux對字符設(shè)備的管理是經(jīng)過一個字符設(shè)備表chrdevs 來實現(xiàn)的。表里的每一項為哪一項一個device_struct構(gòu)造。struct device_structconst char *n

21、ame;struct file_operations *fops;chrdevs 的數(shù)組下標就是字符設(shè)備的主設(shè)備號major。要查看系統(tǒng)中這個表格的當前內(nèi)容,看/proc/devices即可。字符設(shè)備的注冊:向chrdevs 中添加一個新項。int register_chrdev(int major,char *name,struct file_operations *fops)major為懇求的主設(shè)備號,為0時,自動尋覓一個空閑號分配。name為設(shè)備的名字。fops為驅(qū)動程序中file_operations構(gòu)造的指針。注冊勝利時,前往懇求到的主設(shè)備號。出錯時前往一個負值。字符設(shè)備的注銷:vo

22、id unregister_chrdev(int major,char *name)2. 設(shè)備讀寫:設(shè)備讀寫是實現(xiàn)用戶空間和內(nèi)核空間的數(shù)據(jù)交換,因此涉及內(nèi)存操作。設(shè)備驅(qū)動程序在懇求和釋放內(nèi)存時,由于運用的是內(nèi)核空間,不能調(diào)用用戶空間的函數(shù)malloc和free,而代之以調(diào)用kmalloc和kfree,它們在linux/kernel.h中被定義為:void *kmalloc(unsigned int len, int priority);void kfree(void * obj);參數(shù)len為希望懇求的字節(jié)數(shù),obj為要釋放的內(nèi)存指針。priority為分配內(nèi)存操作的優(yōu)先級,即在沒有足夠空閑內(nèi)

23、存時如何操作,普通由取值GFP_KERNEL處理即可。2. 設(shè)備讀寫:設(shè)備讀寫是實現(xiàn)用戶空間和內(nèi)核空間的數(shù)據(jù)交換,因此涉及內(nèi)存操作。內(nèi)存間數(shù)據(jù)的傳送:unsigned long copy_to_user(void *to,void *from,long count);unsigned long copy_from_user(void *to,void *from,long count);以上兩個函數(shù)的原型在3. 設(shè)備控制:對設(shè)備的控制是經(jīng)過對I/O端口的讀寫來實現(xiàn)的。inline unsigned int inb(unsigned short port);inline unsigned int

24、 inb_p(unsigned short port);/讀端口inline void outb(char value,unsigned short port);inline void outb_p(char value,unsigned short port); /寫端口int _check_region(struct resource *parent, unsigned long start, unsigned long n);/檢查一個區(qū)域的端口struct resource *_request_region(struct resource *parent, unsigned long

25、start, unsigned long n, const char *name);/懇求一個區(qū)域的端口void _release_region(struct resource *parent, unsigned long start, unsigned long n);/釋放一個區(qū)域的端口3. 設(shè)備控制:對設(shè)備的控制接口經(jīng)過ioctl函數(shù)來實現(xiàn)。它就象個大雜物箱,把跟設(shè)備有關(guān)的各種操作都裝在這里。例如:一個LCD的驅(qū)動,要實現(xiàn)清屏LCD_Clear、顯示矩形Disp_Rect、畫線Draw_Line等功能。void LCD_Clear() void Disp_Rect() void Draw

26、_Line static int *_ioctl(struct inode *inode, struct file *file, int cmd, long arg)switch(cmd)case:CLEARLCD_Clear();case:RECTDisp_Rect();case:LINEDraw_Line();編寫一個test.c,雖然它根本上什么也不干,但是它表達了一個字符設(shè)備驅(qū)動程序的根本框架:#define _NO_VERSION_#include #include #include #include #include #include #include #include #include #include unsigned int test_major = 0;/用一個靜態(tài)變量存儲設(shè)備號read和write的實現(xiàn):static sszie_t read_test(struct file *file,char *buf,size_t count,loff_t *fops)copy_to_user(*buf,*file,count);static sszie_t write_test(struct file *file,char *buf,size_t cou

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論