亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 一個簡單的演示用的linux字符設備驅動程序.htm

?? 一個嵌入式linux字符驅動的例子。適合于初學者。
?? HTM
?? 第 1 頁 / 共 2 頁
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0041)http://linuxipy.blogchina.com/507920.html -->
<HTML><HEAD><TITLE>一個簡單的演示用的Linux字符設備驅動程序--BlackMagic Workshop</TITLE>
<META http-equiv=Content-Type content="text/html; charset=GBK">
<META http-equiv=Pragma content=no-cache>
<META http-equiv=Cache-Control content=no-cache>
<META http-equiv=Expires content=0>
<META 
content="IBM developerWorks Linux 專題一個簡單的演示用的Linux字符設備驅動程序linux下S3C44B0X Jtag工具(支持cfly.org Jtag cable)  博客 博客中國 博客動力 blog blogdriver blogger 中國" 
name=description>
<META 
content="BlackMagic Workshop IBM developerWorks Linux 專題一個簡單的演示用的Linux字符設備驅動程序linux下S3C44B0X Jtag工具(支持cfly.org Jtag cable) 博客 博客中國 博客動力 blog blogdriver blogger 中國" 
name=keywords><LINK href="一個簡單的演示用的Linux字符設備驅動程序.files/diary.css" type=text/css 
rel=stylesheet>
<SCRIPT language=JavaScript src="一個簡單的演示用的Linux字符設備驅動程序.files/UBB.js"></SCRIPT>

<SCRIPT src="一個簡單的演示用的Linux字符設備驅動程序.files/blog.js" 
type=text/javascript></SCRIPT>

<META content="MSHTML 6.00.2900.2912" name=GENERATOR></HEAD>
<BODY>
<DIV id=container>
<DIV id=header>
<H1 class=title><A href="http://linuxipy.blogchina.com/index.html">BlackMagic 
Workshop</A></H1></DIV>
<DIV id=category><A title=上一篇 
href="http://linuxipy.blogchina.com/429261.html">IBM developerWorks Linux 
專題</A>- -| <A href="http://linuxipy.blogchina.com/index.html">回首頁</A> | <A 
href="http://linuxipy.blogchina.com/catalog_2005.html">2005年索引</A> | - -<A 
title=下一篇 href="http://linuxipy.blogchina.com/3568520.html">linux下S3C44B0X 
Jtag工具(支持cfly.org Jtag cable)</A></DIV>
<DIV class=entity>
<H2 
class=diaryTitle>一個簡單的演示用的Linux字符設備驅動程序</H2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

<P>實現如下的功能:<BR>--字符設備驅動程序的結構及驅動程序需要實現的系統調用<BR>--可以使用cat命令或者自編的readtest命令讀出"設備"里的內容<BR>--以8139網卡為例,演示了I/O端口和I/O內存的使用<BR>本文中的大部分內容在Linux 
Device 
Driver這本書中都可以找到,<BR>這本書是Linux驅動開發者的唯一圣經。<BR>=======================================================<BR><BR>實現如下的功能:<BR>--字符設備驅動程序的結構及驅動程序需要實現的系統調用<BR>--可以使用cat命令或者自編的readtest命令讀出"設備"里的內容<BR>--以8139網卡為例,演示了I/O端口和I/O內存的使用<BR><BR>下載完整程序<STRONG>[char8139.tar.gz]</STRONG>:<BR><A 
href="http://blog.blogchina.com/upload/2005-01-06/20050106234859677220.gz">http://blog.blogchina.com/upload/2005-01-06/20050106234859677220.gz</A><BR><BR>=======================================================<BR>先來看看整個驅動程序的入口,是char8139_init()這個函數<BR>如果不指定MODULE_LICENSE("GPL"), 
在模塊插入內核的<BR>時候會出錯,因為將非"GPL"的模塊插入內核就沾污了內核的<BR>"GPL"屬性。<BR>module_init(char8139_init);<BR>module_exit(char8139_exit);<BR><BR>MODULE_LICENSE("GPL");<BR>MODULE_AUTHOR("linuxipy");<BR>MODULE_DESCRIPTION("Wierd 
char device driver for Realtek 8139 
NIC");<BR><BR>接著往下看char8139_init()<BR><BR>static int __init 
char8139_init(void)<BR>{<BR>int result;<BR><BR>PDBG("hello. init.\n");<BR><BR>/* 
register our char device */<BR>result=register_chrdev(char8139_major, 
"char8139", &amp;char8139_fops);<BR>if(result&lt;0)<BR>{<BR>PDBG("Cannot 
allocate major device number!\n");<BR>return result;<BR>}<BR>/* 
register_chrdev() will assign a major device number and return if it called<BR>* 
with "major" parameter set to 0 */<BR>if(char8139_major == 
0)<BR>char8139_major=result;<BR><BR>/* allocate some kernel memory we need 
*/<BR>buffer=(unsigned char*)(kmalloc(CHAR8139_BUFFER_SIZE, 
GFP_KERNEL));<BR>if(!buffer)<BR>{<BR>PDBG("Cannot allocate 
memory!\n");<BR>result= -ENOMEM;<BR>goto init_fail;<BR>}<BR>memset(buffer, 0, 
CHAR8139_BUFFER_SIZE);<BR>p_buf=buffer;<BR><BR>return 0; /* everything's ok 
*/<BR><BR>init_fail:<BR>char8139_exit();<BR>return 
result;<BR>}<BR><BR>這個函數首先的工作就是使用register_chrdev()注冊我們的設備的主設備號和系統調用。<BR>系統調用對于字符設備驅動程序來說就是file_operations接口。<BR><BR>我們先來看看char8139_major的定義,<BR>#define 
DEFAULT_MAJOR 145<BR>/* data structure used by our driver */<BR>int 
char8139_major=DEFAULT_MAJOR; /* major device number. if initial value is 
0,<BR>the kernel will dynamically assign a major device<BR>number in 
register_chrdev() */<BR>這里我們指定我們的設備的主設備號是145,你必須找到一個系統中沒有用的主設備號,<BR>可以通過"cat 
/proc/devices"命令來查看系統中已經使用的主設備號。<BR><BR>[michael@char8139]$ cat 
/proc/devices<BR>Character devices:<BR>1 mem<BR>2 pty<BR>3 ttyp<BR>4 ttyS<BR>5 
cua<BR>7 vcs<BR>10 misc<BR>14 sound<BR>116 alsa<BR>128 ptm<BR>136 pts<BR>162 
raw<BR>180 usb<BR>195 nvidia<BR>226 drm<BR><BR>Block devices:<BR>2 fd<BR>3 
ide0<BR>22 
ide1<BR>[michael@char8139]$<BR><BR>可見在我的系統中,145還沒有被使用。<BR><BR>指定主設備號值得考慮。像上面這樣指定一個主設備號顯然缺乏靈活性,而且不能保證<BR>一個驅動程序在所有的機器上都能用。可以在調用register_chrdev()時將第一個<BR>參數,即主設備號指定為0,這樣register_chrdev()會分配一個空閑的主設備號<BR>作為返回值。 
但是這樣也有問題,我們只有在將模塊插入內核之后才能得到我們設備<BR>的主設備號(使用 "cat 
/proc/devices"),但是要操作設備需要在系統/dev目錄<BR>下建立設備結點,而建立結點時要指定主設備號。當然,你可以寫一個腳本來自動完成<BR>這些事情。<BR><BR>總之,作為一個演示,我們還是指定主設備號為145<BR>這樣我們可以在/dev/目錄下建立幾個設備節點。<BR><BR>[root@char8139]$ 
mknod /dev/char8139_0 c 145 0<BR>[root@char8139]$ mknod /dev/char8139_0 c 145 
17<BR>[root@char8139]$ mknod /dev/char8139_0 c 145 36<BR>[root@char8139]$ mknod 
/dev/char8139_0 c 145 145<BR><BR>看一下我們建立的節點<BR><BR>[michael@char8139]$ ll 
/dev/char8139*<BR>crw-r--r-- 1 root root 145, 0 2004-12-26 20:33 
/dev/char8139_0<BR>crw-r--r-- 1 root root 145, 17 2004-12-26 20:34 
/dev/char8139_1<BR>crw-r--r-- 1 root root 145, 36 2004-12-26 20:34 
/dev/char8139_2<BR>crw-r--r-- 1 root root 145, 145 2004-12-26 20:34 
/dev/char8139_3<BR>[michael@char8139]$<BR><BR>我們建立了四個節點,使用了四個次設備號,后面我們會說明次設備號的作用。<BR><BR><BR>再來看看我們的file_operations的定義。這里其實只實現了read(),open(),release()三個<BR>系統調用,ioctl()只是簡單返回。更有write()等函數甚至根本沒有聲明,沒有聲明的<BR>函數系統可能會調用默認的操作。<BR>struct 
file_operations char8139_fops =<BR>{<BR>owner: THIS_MODULE,<BR>read: 
char8139_read,<BR>ioctl: char8139_ioctl,<BR>open: char8139_open,<BR>release: 
char8139_release,<BR>};<BR><BR>file_operations是每個字符設備驅動程序必須實現的系統調用,當用戶對/dev中我們的設備對應<BR>結點進行操作時,linux就會調用我們驅動程序中提供的系統調用。比如用戶敲入<BR>"cat 
/dev/char8139_0"命令,想想cat這個應用程序的實現,首先它肯定調用C語言庫里的open()<BR>函數去打開/dev/char8139_0這個文件,到了系統這一層,系統會看到/dev/char8139_0不是普通<BR>磁盤文件,而是一個代表字符設備的節點,所以系統會根據/dev/char8139_0的主設備號來查找是不是<BR>已經有驅動程序使用這個相同的主設備號進行了注冊,如果有,就調用驅動程序的open()實現。<BR><BR>為什么要這樣干?因為要提供抽象,提供統一的接口,別忘了操作系統的作用之一就是這個。因為<BR>我們的設備提供的統一的接口,所以cat這個應用程序使用一般的文件操作就能從我們的設備中讀出數據,<BR>而且more, 
less這些應用程序都能從我們的設備中讀出數據。<BR><BR>現在來看看我們的設備<BR>#define CHAR8139_BUFFER_SIZE 
2000<BR>unsigned char *buffer=NULL; /* driver data buffer */<BR>unsigned char 
*p_buf;<BR>unsigned int data_size=0;<BR>我們的設備很簡單,一個2000字節的緩沖區, 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆swag| 久久综合九色综合97婷婷女人 | 亚洲视频免费在线观看| 久久免费精品国产久精品久久久久| 欧美日韩一级二级三级| 欧美午夜电影在线播放| 欧美无砖专区一中文字| 欧美日韩一级视频| 欧美日韩视频专区在线播放| 欧美三级一区二区| 欧美精品久久99久久在免费线 | 97精品久久久午夜一区二区三区| 高清不卡一区二区| 成人久久久精品乱码一区二区三区| 国产成人综合网站| 成人免费av网站| 99久久综合国产精品| jvid福利写真一区二区三区| 色综合网色综合| 欧美在线视频全部完| 5858s免费视频成人| 欧美成人aa大片| 国产日韩欧美高清| 国产精品网曝门| 亚洲一区二区三区在线播放| 午夜视频在线观看一区二区三区| 天天av天天翘天天综合网 | 日韩成人精品在线观看| 蜜臀av一区二区| 国产真实乱子伦精品视频| 国产成人av影院| 一本色道综合亚洲| 欧美高清视频在线高清观看mv色露露十八 | 欧美精品一区视频| 天天影视色香欲综合网老头| 三级久久三级久久| 国产精品1区2区| 色综合欧美在线视频区| 欧美日本一区二区在线观看| 精品成人一区二区三区| 亚洲丝袜另类动漫二区| 婷婷国产v国产偷v亚洲高清| 国产一区激情在线| 97精品国产露脸对白| 欧美美女黄视频| 欧美精彩视频一区二区三区| 亚洲综合色自拍一区| 国模娜娜一区二区三区| 97久久精品人人做人人爽| 6080日韩午夜伦伦午夜伦| 中文一区一区三区高中清不卡| 亚洲成人自拍偷拍| 国产成人免费高清| 欧美视频一区二区三区在线观看| 久久亚洲精品小早川怜子| 亚洲精品日韩综合观看成人91| 久久精品国产久精国产| 色婷婷综合激情| 久久影院电视剧免费观看| 怡红院av一区二区三区| 国产精品影音先锋| 4438成人网| 亚洲欧美电影院| 国产精品一区在线观看你懂的| 欧美性受极品xxxx喷水| 久久精品一区八戒影视| 日韩精品91亚洲二区在线观看| 成人激情文学综合网| 欧美一区二区三区精品| 亚洲情趣在线观看| 国产精品亚洲人在线观看| 欧美一区三区四区| 一区二区三区久久| av在线不卡电影| 久久久国产午夜精品| 麻豆91精品视频| 欧美蜜桃一区二区三区| 亚洲视频狠狠干| 成人激情免费视频| 精品成人一区二区三区四区| 三级欧美韩日大片在线看| 色婷婷久久99综合精品jk白丝| 中文字幕久久午夜不卡| 国产自产v一区二区三区c| 欧美一区二区免费观在线| 午夜欧美大尺度福利影院在线看| 91浏览器打开| 亚洲同性同志一二三专区| 高清国产一区二区三区| 久久女同互慰一区二区三区| 裸体歌舞表演一区二区| 欧美高清www午色夜在线视频| 亚洲精品成人精品456| 97久久精品人人爽人人爽蜜臀| 国产精品福利一区二区三区| 国产成人精品亚洲777人妖| 久久网站热最新地址| 色综合久久中文综合久久牛| 国产精品色哟哟| 成人中文字幕电影| 国产三区在线成人av| 国产酒店精品激情| 国产色综合久久| 高清久久久久久| 中文字幕电影一区| www.99精品| 亚洲欧洲性图库| 97精品视频在线观看自产线路二 | 久久99蜜桃精品| 日韩免费看的电影| 久久精品国产精品亚洲红杏| 日韩一级欧美一级| 免费久久精品视频| 日韩欧美国产综合一区| 久久69国产一区二区蜜臀| 日韩精品一区二区三区swag| 极品美女销魂一区二区三区| 久久久久国产精品麻豆ai换脸| 风间由美一区二区三区在线观看 | 一区二区三区不卡视频在线观看 | 欧美裸体一区二区三区| 丝袜美腿亚洲综合| 日韩欧美一区电影| 狠狠色丁香久久婷婷综| 久久久久97国产精华液好用吗| 国产91精品露脸国语对白| 国产精品视频看| 91浏览器打开| 无吗不卡中文字幕| 日韩限制级电影在线观看| 国产在线乱码一区二区三区| 国产精品欧美极品| 91福利视频网站| 三级成人在线视频| 久久欧美一区二区| 一本到高清视频免费精品| 天堂蜜桃91精品| 国产欧美一区二区精品性色| 色婷婷久久99综合精品jk白丝| 亚洲va韩国va欧美va| 亚洲精品一区二区三区四区高清| 成人免费电影视频| 亚洲二区在线观看| 久久午夜免费电影| 在线视频欧美区| 国产一区二区不卡在线| 亚洲免费观看在线视频| 在线免费av一区| 日本免费新一区视频| 国产精品 日产精品 欧美精品| 一本色道久久加勒比精品 | 青青草伊人久久| 国产成人精品在线看| 不卡视频在线观看| 91精品国产黑色紧身裤美女| 日韩欧美精品三级| 欧美一区二区三区男人的天堂| 欧美电影在线免费观看| 日韩欧美国产精品| 亚洲视频在线一区观看| 奇米影视在线99精品| 高清国产一区二区三区| 欧美不卡在线视频| 国产欧美视频在线观看| 亚洲欧美福利一区二区| 国产福利91精品一区| 成人91在线观看| 欧美日韩视频第一区| 精品久久人人做人人爰| 中文字幕欧美一区| 免费成人在线播放| www.欧美日韩国产在线| 欧美日韩大陆在线| 日本美女一区二区三区视频| 国产欧美精品一区| 在线观看一区二区精品视频| 成人免费视频播放| 日韩国产欧美在线视频| 亚洲码国产岛国毛片在线| 精品国产网站在线观看| 欧美视频一区二区在线观看| 成人精品视频.| 韩国成人在线视频| 奇米色一区二区| 亚洲一区二区三区爽爽爽爽爽| 国产精品沙发午睡系列990531| 欧美一区二区国产| 欧美日韩欧美一区二区| 91在线免费看| 成人少妇影院yyyy| 国产精品资源网站| 久久99精品久久久久久久久久久久| 亚洲成av人片一区二区| 夜夜嗨av一区二区三区网页| 最新国产精品久久精品| 中文字幕乱码一区二区免费| 久久精品一二三| 久久精品一区蜜桃臀影院| xnxx国产精品| 精品国产sm最大网站免费看|