国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關(guān)注微信公眾號

入門文章:教你學(xué)會編寫Linux設(shè)備驅(qū)動
2006-06-21   linux寶庫

  內(nèi)核版本: 2.4.22

閱讀此文的目的: 學(xué)會編寫Linux設(shè)備驅(qū)動。

閱讀此文的方法: 閱讀以下2個(gè)文件: hello.c,asdf.c。

此文假設(shè)讀者:

已經(jīng)能用C語言編寫Linux應(yīng)用程序,

理解"字符設(shè)備文件, 塊設(shè)備文件, 主設(shè)備號, 次設(shè)備號",

會寫簡單的Shell腳本和Makefile。

1. "hello.c"

--------------------------------

/*

* 這是我們的第一個(gè)源文件,

* 它是一個(gè)可以加載的內(nèi)核模塊,

* 加載時(shí)顯示"Hello,World!",

* 卸載時(shí)顯示"Bye!"。

* 需要說明一點(diǎn),寫內(nèi)核或內(nèi)核模塊不能用寫應(yīng)用程序時(shí)的系統(tǒng)調(diào)用或函數(shù)庫,

* 因?yàn)槲覀儗懙木褪菫閼?yīng)用程序提供系統(tǒng)調(diào)用的代碼。

* 內(nèi)核有專用的函數(shù)庫,如, , 等,

* 現(xiàn)在還沒必要了解得很詳細(xì),

* 這里用到的printk的功能類似于printf。

* "/usr/src/linux"是你實(shí)際的內(nèi)核源碼目錄的一個(gè)符號鏈接,

* 如果沒有現(xiàn)在就創(chuàng)建一個(gè),因?yàn)橄旅婧鸵院蠖紩玫健?

* 編譯它用"gcc -c -I/usr/src/linux/include hello.c",

* 如果正常會生成文件hello.o,

* 加載它用"insmod hello.o",

* 只有在文本終端下才能看到輸出。

* 卸載它用"rmmod hello"

*/

/*

* 小技巧: 在用戶目錄的.bashrc里加上一行:

* alias mkmod='gcc -c -I/usr/src/linux/include'

* 然后重新登陸Shell,

* 以后就可以用"mkmod hello.c"的方式來編譯內(nèi)核模塊了。

*/

/* 開始例行公事 */

#ifndef __KERNEL__

# define __KERNEL__

#endif

#ifndef MODULE

# define MODULE

#endif

#include

#include

MODULE_LICENSE("GPL");

#ifdef CONFIG_SMP

#define __SMP__

#endif

/* 結(jié)束例行公事 */

#include /* printk()在這個(gè)文件里 */

static int

init_module

(){

printk("Hello,World!n");

return 0; /* 如果初始工作失敗,就返回非0 */

}

static void

cleanup_module

(){

printk("Bye!n");

}

------------------------------------

2. "asdf.c"

------------------------------------

/*

* 這個(gè)文件是一個(gè)內(nèi)核模塊。

* 內(nèi)核模塊的編譯,加載和卸載在前面已經(jīng)介紹了。

* 這個(gè)模塊的功能是,創(chuàng)建一個(gè)字符設(shè)備。

* 這個(gè)設(shè)備是一塊4096字節(jié)的共享內(nèi)存。

* 內(nèi)核分配的主設(shè)備號會在加載模塊時(shí)顯示。

*/

/* 開始例行公事 */

#ifndef __KERNEL__

# define __KERNEL__

#endif

#ifndef MODULE

# define MODULE

#endif

#include

#include

#ifdef CONFIG_SMP

#define __SMP__

#endif

MODULE_LICENSE("GPL");

/* 結(jié)束例行公事 */

#include /* copy_to_user(), copy_from_user */

#include /* struct file_operations, register_chrdev(), ... */

#include /* printk()在這個(gè)文件里 */

#include /* 和任務(wù)調(diào)度有關(guān) */

#include /* u8, u16, u32 ... */

/*

* 關(guān)于內(nèi)核功能庫,可以去網(wǎng)上搜索詳細(xì)資料,

*/

/* 文件被操作時(shí)的回調(diào)功能 */

static int asdf_open (struct inode *inode, struct file *filp);

static int asdf_release (struct inode *inode, struct file *filp);

static ssize_t asdf_read (struct file *filp, char *buf, size_t count,loff_t *f_pos);

static ssize_t asdf_write (struct file *filp, const char *buf, size_t count,loff_t *f_pos);

static loff_t asdf_lseek (struct file * file, loff_t offset, int orig);

/* 申請主設(shè)備號時(shí)用的結(jié)構(gòu), 在linux/fs.h里定義 */

struct file_operations asdf_fops = {

open: asdf_open,

release: asdf_release,

read: asdf_read,

write: asdf_write,

llseek: asdf_lseek,

};

static int asdf_major; /* 用來保存申請到的主設(shè)備號 */

static u8 asdf_body[4096]="asdf_bodyn"; /* 設(shè)備 */

static int

init_module

(){

printk ("Hi, This' A Simple Device File!n");

asdf_major = register_chrdev (0, "A Simple Device File", &asdf_fops); /* 申請字符設(shè)備的主設(shè)備號 */

if (asdf_major < 0) return asdf_major; /* 申請失敗就直接返回錯(cuò)誤編號 */

printk ("The major is:%dn", asdf_major); /* 顯示申請到的主設(shè)備號 */

return 0; /* 模塊正常初始化 */

}

static void

cleanup_module

(){

unregister_chrdev(asdf_major, "A Simple Device File"); /* 注銷以后,設(shè)備就不存在了 */

printk("A Simple Device has been removed,Bye!n");

}

/*

* 編譯這個(gè)模塊然后加載它,

* 如果正常,會顯示你的設(shè)備的主設(shè)備號。

* 現(xiàn)在你的設(shè)備就建立好了,我們可以測試一下。

* 假設(shè)你的模塊申請到的主設(shè)備號是254,

* 運(yùn)行"mknod abc c 254 0",就建立了我們的設(shè)備文件abc。

* 可以把它當(dāng)成一個(gè)4096字節(jié)的內(nèi)存塊來測試一下,

* 比如"cat abc", "cp abc image", "cp image abc",

* 或?qū)憥讉€(gè)應(yīng)用程序用它來進(jìn)行通訊。

* 介紹一下兩個(gè)需要注意的事,

* 一是printk()的顯示只有在非圖形模式的終端下才能看到,

* 二是加載過的模塊最好在不用以后卸載掉。

* 如果對Linux環(huán)境的系統(tǒng)調(diào)用很陌生,建議先看APUE這本書。

*/

static int

asdf_open /* open回調(diào) */

(

struct inode *inode,

struct file *filp

){

printk("^_^ : open %sn ",

current->comm);

/*

* 應(yīng)用程序的運(yùn)行環(huán)境由內(nèi)核提供,內(nèi)核的運(yùn)行環(huán)境由硬件提供。

* 這里的current是一個(gè)指向當(dāng)前進(jìn)程的指針,

* 現(xiàn)在沒必要了解current的細(xì)節(jié)。

* 在這里,當(dāng)前進(jìn)程正打開這個(gè)設(shè)備,

* 返回0表示打開成功,內(nèi)核會給它一個(gè)文件描述符。

* 這里的comm是當(dāng)前進(jìn)程在Shell下的command字符串。

*/

return 0;

}

static int

asdf_release /* close回調(diào) */

(

struct inode *inode,

struct file *filp

){

printk("^_^ : closen ");

return 0;

}

static ssize_t

asdf_read /* read回調(diào) */

(

struct file *filp,

char *buf,

size_t count,

loff_t *f_pos

){

loff_t pos;

pos = *f_pos; /* 文件的讀寫位置 */

if ((pos==4096) || (count>4096)) return 0; /* 判斷是否已經(jīng)到設(shè)備尾,或?qū)懙拈L度超過設(shè)備大小 */

pos += count;

if (pos > 4096) {

count -= (pos - 4096);

pos = 4096;

}

if (copy_to_user(buf, asdf_body+*f_pos, count)) return -EFAULT; /* 把數(shù)據(jù)寫到應(yīng)用程序空間 */

*f_pos = pos; /* 改變文件的讀寫位置 */

return count; /* 返回讀到的字節(jié)數(shù) */

}

static ssize_t

asdf_write /* write回調(diào),和read一一對應(yīng) */

(

struct file *filp,

const char *buf,

size_t count,

loff_t *f_pos

){

loff_t pos;

pos = *f_pos;

if ((pos==4096) || (count>4096)) return 0;

pos += count;

if (pos > 4096) {

count -= (pos - 4096);

pos = 4096;

}

if (copy_from_user(asdf_body+*f_pos, buf, count)) return -EFAULT;

*f_pos = pos;

return count;

}

static loff_t

asdf_lseek /* lseek回調(diào) */

(

struct file * file,

loff_t offset,

int orig

){

loff_t pos;

pos = file->f_pos;

switch (orig) {

case 0:

pos = offset;

break;

case 1:

pos += offset;

break;

case 2:

pos = 4096+offset;

break;

default:

return -EINVAL;

}

if ((pos>4096) || (pos<0)) {

printk("^_^ : lseek error %dn",pos);

return -EINVAL;

}

return file->f_pos = pos;

}

熱詞搜索:

上一篇:為系統(tǒng)減肥:精減Windows XP SP2系統(tǒng)
下一篇:Linux實(shí)時(shí)內(nèi)存數(shù)據(jù)庫eXtremeDB性能

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
国产盗摄一区二区三区| 青青青伊人色综合久久| 国产美女久久久久| 久久久久久久久免费| 国产乱人伦偷精品视频不卡| 久久精品人人做人人综合| 国产精品中文字幕欧美| 国产精品第一页第二页第三页| 成人黄色777网| 亚洲自拍都市欧美小说| 欧美日韩高清在线| 国产一区二区影院| 亚洲人成在线播放网站岛国| 欧美日韩免费高清一区色橹橹| 日韩1区2区3区| 亚洲国产精品ⅴa在线观看| 91麻豆免费看片| 日韩av成人高清| 国产精品国产三级国产普通话三级| 欧美伊人久久久久久久久影院| 久久精品国产成人一区二区三区| 国产精品乱码一区二区三区软件 | 国产成人超碰人人澡人人澡| 亚洲日本乱码在线观看| 337p亚洲精品色噜噜狠狠| 国产成人亚洲综合a∨婷婷图片| 又紧又大又爽精品一区二区| 精品日韩在线观看| 91丨porny丨首页| 国产一区二区福利| 午夜精品久久久久久久99樱桃| 中文字幕精品—区二区四季| 欧美精品aⅴ在线视频| 成人一区二区三区在线观看| 丝袜亚洲精品中文字幕一区| 亚洲欧美综合色| www国产成人| 欧美一区二区视频在线观看2022| 成人av先锋影音| 精品夜夜嗨av一区二区三区| 亚洲一二三区视频在线观看| 一区在线中文字幕| 精品国产区一区| 欧美久久久久中文字幕| 99精品偷自拍| av一区二区三区| 粉嫩绯色av一区二区在线观看| 蜜桃久久久久久久| 亚洲成人av中文| 一区二区三区四区五区视频在线观看 | 精品国内片67194| 69久久夜色精品国产69蝌蚪网| 91福利视频在线| 91免费版在线| 一本色道久久综合亚洲精品按摩| 成人av网站在线观看| 国产精品88888| 国产精品一区二区你懂的| 日韩制服丝袜av| 水野朝阳av一区二区三区| 亚洲国产美女搞黄色| 亚洲最新视频在线观看| 一级日本不卡的影视| 亚洲人精品午夜| 亚洲超丰满肉感bbw| 日韩一区精品字幕| 免费的国产精品| 国产乱码一区二区三区| 国产精品资源网| av亚洲精华国产精华精华| 成人美女在线视频| 91网上在线视频| 在线视频国内自拍亚洲视频| 欧美午夜在线观看| 日韩一区二区三| 欧美国产综合色视频| 国产精品久久久一区麻豆最新章节| 欧美国产日本韩| 亚洲精品高清视频在线观看| 夜色激情一区二区| 日韩和欧美一区二区三区| 极品少妇xxxx偷拍精品少妇| 国产99久久久精品| 色婷婷av一区二区三区之一色屋| 欧美在线观看视频一区二区三区| 69堂国产成人免费视频| 久久精品人人做人人爽人人| 亚洲国产成人午夜在线一区| 一区二区三区在线观看视频| 老司机精品视频线观看86| 国产精品夜夜嗨| 色综合婷婷久久| 欧美一区二区三区免费视频| 久久久精品tv| 一区二区三区在线看| 久久精品国产一区二区三| 成人高清视频在线观看| 欧美系列在线观看| 国产欧美日韩中文久久| 亚洲国产精品久久久久婷婷884 | 亚洲综合免费观看高清完整版在线 | 国内精品伊人久久久久av影院 | 91丝袜国产在线播放| 制服.丝袜.亚洲.另类.中文| 久久精品人人做| 欧美激情综合在线| 午夜亚洲福利老司机| 国产精品一区三区| 欧美欧美欧美欧美| 一区免费观看视频| 国产精品18久久久久久久久久久久| 在线观看视频一区二区| 国产网站一区二区| 琪琪久久久久日韩精品| 91视视频在线观看入口直接观看www | 日本午夜一区二区| 91免费在线看| 欧洲一区二区三区在线| 国产片一区二区| 久久99精品久久久久久久久久久久| 在线观看成人免费视频| 国产精品视频一二三区| 韩国av一区二区| 91精品国产综合久久精品app| 日韩码欧中文字| 国产一区二区女| 91精品婷婷国产综合久久| 伊人色综合久久天天| 波多野洁衣一区| 日本一区二区视频在线| 国产最新精品精品你懂的| 日韩亚洲国产中文字幕欧美| 欧美日本免费一区二区三区| 一区二区日韩av| 中文一区在线播放| 欧美成人精品福利| 久久精品久久99精品久久| 欧美另类z0zxhd电影| 亚洲一二三区在线观看| 精品sm在线观看| 韩国精品主播一区二区在线观看| 另类欧美日韩国产在线| 在线播放一区二区三区| 天天操天天干天天综合网| 欧美精品日韩一区| 亚洲动漫第一页| 欧美一区二视频| 国产一二精品视频| 国产精品美女一区二区| 日本伦理一区二区| 亚洲123区在线观看| 欧美一级欧美三级| 一本大道综合伊人精品热热| 久久精品免费看| 欧美调教femdomvk| 一区二区视频免费在线观看| 日本精品一级二级| 亚洲一区二区三区美女| 欧美影院一区二区| 美脚の诱脚舐め脚责91 | 91网站视频在线观看| 亚洲va欧美va人人爽| 日韩视频在线你懂得| 国产精品一区二区果冻传媒| 亚洲欧美中日韩| 欧美一卡2卡三卡4卡5免费| 国产成人在线色| 午夜在线电影亚洲一区| 欧美成人女星排名| 91网页版在线| 男人的天堂亚洲一区| 国产精品网站在线观看| 欧美三级电影在线看| 国产一区二三区好的| 亚洲综合在线电影| 2019国产精品| 欧美人妇做爰xxxⅹ性高电影 | 91麻豆自制传媒国产之光| 热久久国产精品| 亚洲视频1区2区| 日韩欧美123| 在线视频欧美精品| 国产伦精一区二区三区| 亚洲图片一区二区| 国产欧美精品国产国产专区| 欧美日韩aaaaaa| 91在线精品一区二区三区| 久久精品国产成人一区二区三区| 亚洲男人的天堂在线观看| 日韩片之四级片| 欧美在线综合视频| 岛国av在线一区| 九九九精品视频| 亚洲高清不卡在线观看| 国产欧美一区二区精品忘忧草 | 亚洲国产日韩av| 中文字幕日本乱码精品影院| 久久久久国产一区二区三区四区 | 精品国产乱码久久久久久闺蜜| 欧美日韩高清影院|