Linux核心開發之簡單字元裝置驅動(下)

來源:互聯網
上載者:User

    在上一篇中,我們介紹了有關簡單字元裝置驅動中那些簡單但又必須要掌握的結構體和一些源碼中核心的操作函數,這一節我們繼續介紹有關源碼部分的後續相關內容及測試使用的方法(在本文中同時也會給出完整的Makefile檔案,方便大家調試)。

static const structfile_operations globalmem_fops ={//這些就是上篇中所實現的所有操作該字元裝置的函數介面,這些最終都會被使用者程式中的open(),read()所調用.owner= THIS_MODULE,.llseek = globalmem_llseek,.read = globalmem_read,.write = globalmem_write,.ioctl = globalmem_ioctl,.open = globalmem_open,.release = globalmem_release,};//初始化並添加cdev結構static void globalmem_setup_cdev(struct globalmem_dev *dev, int index){int err,devno=MKDEV(globalmem_major,index);cdev_init(&dev->cdev,&globalmem_fops);dev->cdev.owner = THIS_MODULE;dev->cdev.ops=&globalmem_fops;err=cdev_add(&dev->cdev,devno,1);if(err)printk(KERN_NOTICE "Error %d adding LED%d",err, index);}//globalmem裝置驅動模組載入函數int globalmem_init(void){int result;dev_t devno=MKDEV(globalmem_major,0);//申請裝置驅動地區if(globalmem_major){result=register_chrdev_region(devno,1,"globalmem");}else{//動態獲得主裝置號result=alloc_chrdev_region(&devno,0,1,"globalmem");globalmem_major=MAJOR(devno);}if(result<0)return result;printk(KERN_ALERT "T1\n");globalmem_devp = kmalloc(sizeof(struct globalmem_dev),GFP_KERNEL);printk(KERN_ALERT "T0\n");if(!globalmem_devp){result = -ENOMEM;goto fail_malloc;}memset(globalmem_devp , 0,sizeof(struct globalmem_dev));globalmem_setup_cdev(globalmem_devp,0);return 0;fail_malloc:unregister_chrdev_region(devno, 1);return result;}//global裝置驅動卸載模組void globalmem_exit(void){cdev_del(&globalmem_devp->cdev);//刪除cdev結構kfree(globalmem_devp);unregister_chrdev_region(MKDEV(globalmem_major,0),1);//登出裝置驅動地區}MODULE_AUTHOR("hanyan225");MODULE_LICENSE("Dual BSD/GPL");module_param(globalmem_major, int, S_IRUGO);module_init(globalmem_init);module_exit(globalmem_exit);
 
呵呵,不要迷戀哥,哥其實挺差勁的,過去是,現在還是,希望悲劇的我以後能為一個人人迷戀的傳說呵呵..
源碼部分算是完了,,下邊咱們聊天看MM吧,哦忘了,還有源碼部分的講解沒說,唉,為啥一提到這個就心裡煩躁呢..哈哈
1)static const struct file_operations globalmem_fops在這個中定義了整個驅動程式的核心操作,以後的應用程式最終都會調用這個結構中定義的操作。
2)在globalmem_init(void)中主要實現了定義和分配字元裝置編號
 a)當裝置編號是手動分配時就調用register_chrdev_region進行字元裝置的註冊
 b)當裝置編號不是手動分配時,這時就用調用alloc_chrdev_region動態獲得裝置編號
3)調用kmalloc(sizeof(struct globalmem_dev),GFP_KERNEL); 向核心申請字元裝置結構,並初始化。
4)當上邊的一切都完成了,QQ鬥地主的傢伙們說了N篇:花都謝了,不過沒關係不是,我們的工作也完成了,只要再次調用globalmem_setup_cdev向核心註冊我們的裝置驅動就可以了,現在終於可以放心都地主了..
5)突然老王說,我想玩曳引車,不是吧,一局那麼長,還是等哥把最後一點收拾殘局的globalmem_exit寫完再說,在這裡看著其實挺簡單的不是,就是刪除裝置,釋放空間,登出裝置驅動編號地區,ok..
 
老李說,大哥呀,你都在寫什麼鬼東西,哥怎麼一個都看不懂…
哦,不好意思哈,寫的有點亂(心裡盤算著:這麼清晰都看不懂,還哥呀哥的,你倒找我錢讓我做哥,我都不好意思),要不我給你實際操作一下吧:
1)cat /proc/devices看看有哪些編號已經被使用,我們選一個沒有使用的150,將代碼標頭檔處的
  #define GLOBALMEM_MAJOR 254    /*預設的globalmem的主裝置號*/中的254換成150
2)make
3)insmod ./globalmem.ko
4)通過"mknod /dev/globalmem c 150 0"命令建立"/dev/globalmem"裝置節點。
5)輸入echo 'Hello bitch'>/dev/globalmem命令。
6)輸入"cat /dev/globalmem"看看終端是否顯示Hello bitch,如果是,哈哈,你成功了。
誰是bitch,我咋知道,老李瞪著死魚眼睛看著我,不知道是程式驚呆了它,還是一句bitch嚇蒙了他,不管了,哥的曳引車火著呢..掀桌子了都..哈哈
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.