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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? linux系統(tǒng)下的設(shè)備驅(qū)動程序.txt

?? Linux系統(tǒng)下的設(shè)備驅(qū)動程序
?? TXT
?? 第 1 頁 / 共 2 頁
字號:

int result;


result = register_chrdev(0, "test", &test_fops);

if (result < 0) {

printk(KERN_INFO "test: can't get major number ");

return result;

}

if (test_major == 0) test_major = result; /* dynamic */

return 0;

}

在用insmod命令將編譯好的模塊調(diào)入內(nèi)存時(shí),init_module 函數(shù)被調(diào)用。在

這里,init_module只做了一件事,就是向系統(tǒng)的字符設(shè)備表登記了一個(gè)字符

設(shè)備。register_chrdev需要三個(gè)參數(shù),參數(shù)一是希望獲得的設(shè)備號,如果是

零的話,系統(tǒng)將選擇一個(gè)沒有被占用的設(shè)備號返回。參數(shù)二是設(shè)備文件名,

參數(shù)三用來登記驅(qū)動程序?qū)嶋H執(zhí)行操作的函數(shù)的指針。

如果登記成功,返回設(shè)備的主設(shè)備號,不成功,返回一個(gè)負(fù)值。


void cleanup_module(void)

{

unregister_chrdev(test_major, "test");

}

在用rmmod卸載模塊時(shí),cleanup_module函數(shù)被調(diào)用,它釋放字符設(shè)備test

在系統(tǒng)字符設(shè)備表中占有的表項(xiàng)。


一個(gè)極其簡單的字符設(shè)備可以說寫好了,文件名就叫test.c吧。

下面編譯

$ gcc -O2 -DMODULE -D__KERNEL__ -c test.c

得到文件test.o就是一個(gè)設(shè)備驅(qū)動程序。

如果設(shè)備驅(qū)動程序有多個(gè)文件,把每個(gè)文件按上面的命令行編譯,然后

ld -r file1.o file2.o -o modulename.


驅(qū)動程序已經(jīng)編譯好了,現(xiàn)在把它安裝到系統(tǒng)中去。

$ insmod -f test.o

如果安裝成功,在/proc/devices文件中就可以看到設(shè)備test,

并可以看到它的主設(shè)備號,。

要卸載的話,運(yùn)行

$ rmmod test


下一步要?jiǎng)?chuàng)建設(shè)備文件。

mknod /dev/test c major minor

c 是指字符設(shè)備,major是主設(shè)備號,就是在/proc/devices里看到的。

用shell命令

$ cat /proc/devices | awk "\$2=="test" {print \$1}"

就可以獲得主設(shè)備號,可以把上面的命令行加入你的shell script中去。

minor是從設(shè)備號,設(shè)置成0就可以了。


我們現(xiàn)在可以通過設(shè)備文件來訪問我們的驅(qū)動程序。寫一個(gè)小小的測試程序。

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

main()

{

int testdev;

int i;

char buf[10];


testdev = open("/dev/test",O_RDWR);

if ( testdev == -1 )

{

printf("Cann't open file ");

exit(0);

}

read(testdev,buf,10);

for (i = 0; i < 10;i++)

printf("%d ",buf[i]);

close(testdev);

}

編譯運(yùn)行,看看是不是打印出全1 ?


 

以上只是一個(gè)簡單的演示。真正實(shí)用的驅(qū)動程序要復(fù)雜的多,要處理如中斷,

DMA,I/O port等問題。這些才是真正的難點(diǎn)。請看下節(jié),實(shí)際情況的處理。

如何編寫Linux操作系統(tǒng)下的設(shè)備驅(qū)動程序

Roy G


三 設(shè)備驅(qū)動程序中的一些具體問題。


1. I/O Port.

和硬件打交道離不開I/O Port,老的ISA設(shè)備經(jīng)常是占用實(shí)際的I/O端口,

在linux下,操作系統(tǒng)沒有對I/O口屏蔽,也就是說,任何驅(qū)動程序都可以

對任意的I/O口操作,這樣就很容易引起混亂。每個(gè)驅(qū)動程序應(yīng)該自己避免

誤用端口。

有兩個(gè)重要的kernel函數(shù)可以保證驅(qū)動程序做到這一點(diǎn)。

1)check_region(int io_port, int off_set)

這個(gè)函數(shù)察看系統(tǒng)的I/O表,看是否有別的驅(qū)動程序占用某一段I/O口。

參數(shù)1:io端口的基地址,

參數(shù)2:io端口占用的范圍。

返回值:0 沒有占用, 非0,已經(jīng)被占用。

2)request_region(int io_port, int off_set,char *devname)

如果這段I/O端口沒有被占用,在我們的驅(qū)動程序中就可以使用它。在使用

之前,必須向系統(tǒng)登記,以防止被其他程序占用。登記后,在/proc/ioports

文件中可以看到你登記的io口。

參數(shù)1:io端口的基地址。

參數(shù)2:io端口占用的范圍。

參數(shù)3:使用這段io地址的設(shè)備名。


在對I/O口登記后,就可以放心地用inb(), outb()之類的函來訪問了。


在一些pci設(shè)備中,I/O端口被映射到一段內(nèi)存中去,要訪問這些端口就相當(dāng)

于訪問一段內(nèi)存。經(jīng)常性的,我們要獲得一塊內(nèi)存的物理地址。在dos環(huán)境下,

(之所以不說是dos操作系統(tǒng)是因?yàn)槲艺J(rèn)為DOS根本就不是一個(gè)操作系統(tǒng),它實(shí)

在是太簡單,太不安全了)只要用段:偏移就可以了。在window95中,95ddk

提供了一個(gè)vmm 調(diào)用 _MapLinearToPhys,用以把線性地址轉(zhuǎn)化為物理地址。但

在Linux中是怎樣做的呢?

2 內(nèi)存操作

在設(shè)備驅(qū)動程序中動態(tài)開辟內(nèi)存,不是用malloc,而是kmalloc,或者用

get_free_pages直接申請頁。釋放內(nèi)存用的是kfree,或free_pages. 請注意,

kmalloc等函數(shù)返回的是物理地址!而malloc等返回的是線性地址!關(guān)于

kmalloc返回的是物理地址這一點(diǎn)本人有點(diǎn)不太明白:既然從線性地址到物理

地址的轉(zhuǎn)換是由386cpu硬件完成的,那樣匯編指令的操作數(shù)應(yīng)該是線性地址,

驅(qū)動程序同樣也不能直接使用物理地址而是線性地址。但是事實(shí)上kmalloc

返回的確實(shí)是物理地址,而且也可以直接通過它訪問實(shí)際的RAM,我想這樣可

以由兩種解釋,一種是在核心態(tài)禁止分頁,但是這好像不太現(xiàn)實(shí);另一種是

linux的頁目錄和頁表項(xiàng)設(shè)計(jì)得正好使得物理地址等同于線性地址。我的想法

不知對不對,還請高手指教。

言歸正傳,要注意kmalloc最大只能開辟128k-16,16個(gè)字節(jié)是被頁描述符

結(jié)構(gòu)占用了。kmalloc用法參見khg.

內(nèi)存映射的I/O口,寄存器或者是硬件設(shè)備的RAM(如顯存)一般占用F0000000

以上的地址空間。在驅(qū)動程序中不能直接訪問,要通過kernel函數(shù)vremap獲得

重新映射以后的地址。

另外,很多硬件需要一塊比較大的連續(xù)內(nèi)存用作DMA傳送。這塊內(nèi)存需要一直

駐留在內(nèi)存,不能被交換到文件中去。但是kmalloc最多只能開辟128k的內(nèi)存。

這可以通過犧牲一些系統(tǒng)內(nèi)存的方法來解決。

具體做法是:比如說你的機(jī)器由32M的內(nèi)存,在lilo.conf的啟動參數(shù)中加上

mem=30M,這樣linux就認(rèn)為你的機(jī)器只有30M的內(nèi)存,剩下的2M內(nèi)存在vremap

之后就可以為DMA所用了。

請記住,用vremap映射后的內(nèi)存,不用時(shí)應(yīng)用unremap釋放,否則會浪費(fèi)頁表。


3 中斷處理

同處理I/O端口一樣,要使用一個(gè)中斷,必須先向系統(tǒng)登記。

int request_irq(unsigned int irq ,

void(*handle)(int,void *,struct pt_regs *),

unsigned int long flags,

const char *device);


irq: 是要申請的中斷。

handle:中斷處理函數(shù)指針。

flags:SA_INTERRUPT 請求一個(gè)快速中斷,0 正常中斷。

device:設(shè)備名。


如果登記成功,返回0,這時(shí)在/proc/interrupts文件中可以看你請求的

中斷。


4一些常見的問題。

對硬件操作,有時(shí)時(shí)序很重要。但是如果用C語言寫一些低級的硬件操作

的話,gcc往往會對你的程序進(jìn)行優(yōu)化,這樣時(shí)序就錯(cuò)掉了。如果用匯編寫呢,

gcc同樣會對匯編代碼進(jìn)行優(yōu)化,除非你用volatile關(guān)鍵字修飾。最保險(xiǎn)的

辦法是禁止優(yōu)化。這當(dāng)然只能對一部分你自己編寫的代碼。如果對所有的代碼

都不優(yōu)化,你會發(fā)現(xiàn)驅(qū)動程序根本無法裝載。這是因?yàn)樵诰幾g驅(qū)動程序時(shí)要

用到gcc的一些擴(kuò)展特性,而這些擴(kuò)展特性必須在加了優(yōu)化選項(xiàng)之后才能體現(xiàn)

出來。

關(guān)于kernel的調(diào)試工具,我現(xiàn)在還沒有發(fā)現(xiàn)有合適的。有誰知道請告訴我,

不勝感激。我一直都在printk打印調(diào)試信息,倒也還湊合。

關(guān)于設(shè)備驅(qū)動程序還有很多內(nèi)容,如等待/喚醒機(jī)制,塊設(shè)備的編寫等。

我還不是很明白,不敢亂說。

歡迎大家批評指正。

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕在线免费不卡| 欧美一区二区三区免费大片| 丝袜美腿亚洲色图| 国产精品三级电影| 精品少妇一区二区三区| 欧美日韩一区三区四区| 一本久道久久综合中文字幕| 国产精品1024久久| 亚洲影视在线播放| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 日韩欧美一卡二卡| www.一区二区| 不卡视频一二三| 国产iv一区二区三区| 国产精品一区二区视频| 免费久久99精品国产| 日韩高清中文字幕一区| 亚洲国产精品人人做人人爽| 亚洲蜜臀av乱码久久精品蜜桃| 中文字幕一区在线观看视频| 国产亚洲一区二区三区在线观看| 26uuu国产日韩综合| 精品久久久久香蕉网| 精品国产亚洲在线| 欧美va天堂va视频va在线| 欧美大肚乱孕交hd孕妇| 欧美成人性战久久| 久久综合999| 国产日本一区二区| 国产精品国产三级国产普通话99| 国产精品久久夜| 亚洲区小说区图片区qvod| 成人免费一区二区三区在线观看| 久久―日本道色综合久久| 2023国产精品| 日本一区二区三区国色天香| 中文字幕第一页久久| 综合色中文字幕| 亚洲大片一区二区三区| 日韩经典一区二区| 国产一区二区免费看| 成人高清视频免费观看| 在线观看网站黄不卡| 欧美一卡二卡三卡| 中文字幕乱码一区二区免费| 欧美国产日韩精品免费观看| 亚洲美女一区二区三区| 日本不卡高清视频| 国产精品白丝av| 色婷婷狠狠综合| 26uuu国产在线精品一区二区| 国产亚洲成年网址在线观看| 一区二区三区免费在线观看| 亚洲国产日产av| 国产一区二区三区电影在线观看| 91视视频在线观看入口直接观看www | 久久夜色精品国产噜噜av| 亚洲蜜桃精久久久久久久| 国产一区二区日韩精品| 欧美精品三级在线观看| 一区二区三区四区国产精品| 国产成人亚洲精品青草天美| 欧美一区在线视频| 亚洲 欧美综合在线网络| 94-欧美-setu| 国产精品成人网| 国产成人在线视频播放| 欧美刺激午夜性久久久久久久| 丝袜脚交一区二区| 欧美日韩中文一区| 亚洲一级二级三级在线免费观看| 99精品视频一区二区三区| 国产精品系列在线| 国产成人在线视频免费播放| 久久久久久久久久电影| 另类小说综合欧美亚洲| 日韩欧美高清dvd碟片| 青椒成人免费视频| 日韩女优毛片在线| 老色鬼精品视频在线观看播放| 日韩免费电影网站| 精品一区二区在线视频| 久久久噜噜噜久久中文字幕色伊伊 | 精品国产一区二区精华| 精品在线播放免费| 久久综合久久综合亚洲| 国产乱码精品一品二品| 久久久99久久精品欧美| 国产91精品一区二区麻豆网站 | 中文字幕精品一区二区三区精品| 粉嫩一区二区三区在线看| 久久这里只精品最新地址| 国产乱淫av一区二区三区| 欧美国产日韩亚洲一区| 91日韩精品一区| 石原莉奈在线亚洲二区| 精品久久免费看| 成人毛片视频在线观看| 亚洲一区二区三区中文字幕| 欧美区视频在线观看| 黄色小说综合网站| 亚洲人亚洲人成电影网站色| 欧美视频中文字幕| 国产一区在线观看麻豆| 中文字幕在线观看不卡视频| 欧美日韩情趣电影| 国产一区二三区| 亚洲自拍偷拍欧美| 精品国产一区二区精华| www.日韩精品| 免费欧美日韩国产三级电影| 欧美国产日韩亚洲一区| 欧美精品第1页| 国产不卡免费视频| 亚洲v中文字幕| 中文字幕av一区二区三区高 | 国产呦精品一区二区三区网站| 国产精品美女久久久久aⅴ国产馆| 色婷婷亚洲一区二区三区| 蜜桃视频一区二区三区| 成人欧美一区二区三区小说 | 国模娜娜一区二区三区| 亚洲男人都懂的| 亚洲精品一区二区三区四区高清| 99久久伊人精品| 毛片av一区二区三区| 亚洲欧洲精品一区二区精品久久久| 在线不卡一区二区| av电影天堂一区二区在线观看| 日韩av不卡在线观看| ●精品国产综合乱码久久久久| 欧美大片国产精品| 欧美视频自拍偷拍| 日本精品视频一区二区| 国产高清不卡一区| 久久精品免费看| 亚洲综合色在线| 亚洲视频资源在线| 欧美激情一区二区三区蜜桃视频| 在线成人免费观看| 日本丶国产丶欧美色综合| 国产乱码一区二区三区| 免费成人av在线播放| 亚洲成a人v欧美综合天堂| 亚洲欧美一区二区三区极速播放 | 成人精品鲁一区一区二区| 狂野欧美性猛交blacked| 五月天久久比比资源色| 亚洲一区中文在线| 一区二区在线观看不卡| 国产精品久久久久久久久果冻传媒| 久久综合网色—综合色88| 精品少妇一区二区三区日产乱码| 91精品国产综合久久福利软件 | 久久激情五月激情| 日本三级韩国三级欧美三级| 亚洲一级不卡视频| 亚洲成a人v欧美综合天堂| 亚洲精品乱码久久久久久久久 | 91精品午夜视频| 欧美日韩日日摸| 欧美精品自拍偷拍| 欧美精品黑人性xxxx| 欧美精品1区2区| 欧美精品xxxxbbbb| 日韩欧美在线不卡| 国产性做久久久久久| 久久精品欧美日韩精品 | 国产精品亲子伦对白| 中文字幕国产一区二区| 亚洲人成伊人成综合网小说| 亚洲欧美日韩中文字幕一区二区三区| 欧美韩日一区二区三区四区| 国产精品美日韩| 亚洲国产毛片aaaaa无费看 | 亚洲18色成人| 久国产精品韩国三级视频| 国产精品自拍网站| 91在线码无精品| 欧美久久久久免费| 日韩欧美你懂的| 国产精品久久一级| 亚洲国产日韩a在线播放性色| 蜜臀精品一区二区三区在线观看 | 国产一区二区三区视频在线播放| 成人手机电影网| 欧美疯狂做受xxxx富婆| 久久久亚洲精华液精华液精华液| 国产精品久久福利| 日日噜噜夜夜狠狠视频欧美人| 国产精品一级二级三级| 色综合久久中文综合久久97| 在线不卡a资源高清| 国产欧美日韩不卡免费| 一区二区三区四区激情| 精品亚洲国内自在自线福利| 一本一道久久a久久精品| 久久综合色之久久综合| 亚洲一区二区视频在线观看| 国产精品一级黄|