- Sep 07 Fri 2012 00:02
Linux Driver(4) - 多個裝置、ioctl、lseek
Linux Driver(4) - 多個裝置、ioctl、lseekLinux Driver(3) - 最基本的開關讀寫 ),來增加一些功能。1. 多個裝置2. ioctl、lseek函式共有3個步驟。1. 修改scripts,改成建造4 個 nodes2. 修改vhcar.h,並新增 ioctl.h3. 修改vchar.c1. 修改scripts,改成建造4 個 nodes:先把他改成多個裝置,這裡我們設定為4個,那首先就要在 /dev 底下創造 4 個 nodes。先修改 vchar_load.sh 和 vchar_unload.sh。vchar_load.sh:把rm -f /dev/$module || exit 1mknod /dev/$module c $major 0改成rm -f /dev/${module}[0-3] || exit 1mknod /dev/${module}0 c $major 0 || exit 1mknod /dev/${module}1 c $major 1 || exit 1mknod /dev/${module}2 c $major 2 || exit 1mknod /dev/${module}3 c $major 3 vchar_unload.sh:把rm -f /dev/$module改成rm -f /dev/${module}[0-3]這樣就會在 /dev 底下建造 vchar0~3 共4個 nodes。2. 修改vhcar.h,並新增 ioctl.h先將VIRTUAL_CHAR_DEVICE_NR_DEVS從原來的 1 改成 4 。再新增 ioctl 和 llseek 兩個函式int vchar_ioctl(struct inode *inodep, struct 辦公室出租file *filp, unsigned int cmd, unsigned long arg);loff_t vchar_llseek(struct file *filp, loff_t offset, int whence);最後增加 ioctl.h,內容如下:#ifndef _VCHAR_IOCTL_H_#define _VCHAR_IOCTL_H_#define MEM_CLEAR 0x1 // set memory to zero#endif內容很簡單,就是給user-space引入用的,讓它可以透過ioctl來控制driver,而這的功能就是清除memory的內容,並把offset移到0的位置。3. 修改vchar.c我們需要增加一個index的欄位給 vchar_dev 結構,這是為了讓 作業方法可以辨認此時是操作那一個設備。typedef struct _vchar_dev{ struct cdev cdev; // char device unsigned char mem[VCHAR_MEM_SIZE]; int index;}vchar_dev;更改vchar_fops,增加指定 llseek 和 ioctl 函式。const struct file_operations vchar_fops ={ .owner = THIS_MODULE, .llseek = vchar_llseek, .read = vchar_read, .write = vchar_write, .ioctl = vchar_ioctl, .open = 信用卡代償vchar_open, .release = vchar_release,};在vchar_init裡,更變分配devp記憶體的地方和註冊字元裝置的地方成4份 vchar_devp = kmalloc(vchar_nr_devs * sizeof(vchar_dev), GFP_KERNEL); if (!vchar_devp) { // unregister device before return error unregister_chrdev_region(devno, vchar_nr_devs); return result = -ENOMEM; } memset(vchar_devp, 0, vchar_nr_devs * sizeof(vchar_dev)); int i; for (i=0; i { vchar_setup_cdev(vchar_devp, i); TRACE("schar%d is loaded...\n", i); }釋放的 vchar_exit也要記得取消註冊4份字元裝置 int i; for (i=0; 節能燈具i { cdev_del(&vchar_devp[i].cdev); // delete char device TRACE("schar%d is unloaded...\n", i); }在 vchar_setup_cdev 裡增加這一行devp->index = index;給每一個 device 設定編號。在vchar_open裡,我們有4個 vchar_devp,我們需用不同的方法來儲存多個 vchar_dev*給filp->private_data。在 inode裡有一個 i_cdev欄位,這欄位指向一個cdev結構,但我們要的不是cdev結構,而是自已定義的 vchar_dev 結構。 這時可以用 container_of 巨集來取得所需的 vchar_dev 結構。 vchar_dev *devp; devp = container_of(inode->i_cdev, vchar_dev, cdev); filp->private_data = devp;container_of 的說明可參考這篇 Linux Driver(5) - container_of 分析 。read 、 write 並不用修改,但可加上index,來觀察目前讀寫的設備編號:TRACE("vchar%d:read %d bytes(s) from 吳哥窟%ld\n", devp->index, count, offset);增加 ioctl函式的內容:int vchar_ioctl(struct inode *inodep, struct file *filp, unsigned int cmd, unsigned long arg){ vchar_dev *devp = filp->private_data; switch (cmd) { case MEM_CLEAR: memset(devp->mem, 0, VCHAR_MEM_SIZE); filp->f_pos = 0; TRACE("vchar%d: The memory is set to zero\n", devp->index); break; default: return - EINVAL; } return 0;}這裡做的就是清除 devp->mem 的內容,並把檔案 offset指為 0。增加 llseek函式的內容:loff_t vchar_llseek(struct file *filp, loff_t offset, int whence){ loff_t newpos = 酒店工作0; vchar_dev *devp = filp->private_data; switch (whence) { case 0: // SEEK_SET TRACE("vchar%d: SEEK_SET\n", devp->index); newpos = offset; break; case 1: // SEEK_CUR TRACE("vchar%d: SEEK_CUR\n", devp->index); newpos = filp->f_pos + offset; break; case 2: // SEEK_END TRACE("vchar%d: SEEK_END\n", devp->index); newpos = VCHAR_MEM_SIZE + offset; break; 襯衫default: return -EINVAL; break; } if (newpos < 0 || newpos > VCHAR_MEM_SIZE) { return -EINVAL; } TRACE("vchar%d: newpos:%d\n", devp->index, newpos); filp->f_pos = newpos; return newpos;}根據 whence 的值來做 offset 的位移。實際做的就是回應 user-space 中的 lseek 函式。最後再給出應用的例子,#include <sys/types.h>#include <unistd.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <stddef.h>#include <stdio.h>#include <fcntl.h>#include <error.h>#include "ioctl.h"#define BUF_SIZE 128#define MAX_DEVS 4int main(void){ int i; int fd[MAX_DEVS]; ssize_t 當鋪len=0; __off_t offset=0; const char* dev_name[MAX_DEVS] = {"/dev/vchar0","/dev/vchar1","/dev/vchar2","/dev/vchar3"}; unsigned char buf[MAX_DEVS][BUF_SIZE] = {0}; for (i=0; i<MAX_DEVS; i++) { fd[i] = open(dev_name[i], O_RDWR, S_IRUSR | S_IWUSR); if (fd[i]) { memset(buf[i], i+1, BUF_SIZE); // set the memory to zero len = lseek(fd[i], offset, SEEK_END); // get the length of vchar printf("get %d of vchar\n", len); 酒店兼職 lseek(fd[i], offset, SEEK_SET); // set the offset to start len = BUF_SIZE; len = write(fd[i], buf[i], len); printf("vchar%d:write: %d bytes\n", i, len); } else { perror("test_vchar::write"); return -1; } lseek(fd[i], offset, SEEK_SET); // set the offset to start len = read(fd[i], buf, BUF_SIZE); if (len > 當鋪0) { printf("vchar%d:read: %d bytes\n", i, len); } else { perror("test_vchar::read"); return -1; } if (ioctl(fd[i], MEM_CLEAR) == -1) { perror("test_vchar::ioctl"); return -1; } close(fd[i]); } return 0;}
- Sep 06 Thu 2012 14:18
稅務傳真-郵局定存利息 漏報要罰
- Sep 06 Thu 2012 05:20
好一朵美麗的茉莉花
- Sep 05 Wed 2012 19:56
福建武夷山清晨
- Sep 05 Wed 2012 08:06
桂冠芙蓉豆腐&沙拉創意料理
桂冠芙蓉豆腐&沙拉創意料理今天要來品嚐桂冠的芙蓉豆腐喔~還有沙拉~簡單的做出無煙無油的方便料理~細細品嚐桂冠芙蓉豆腐的美妙滋味唷~ 其實桂冠芙蓉豆腐直接吃就已經非常美味可口呢~口感細嫩租房子滑溜~就像奶酪一樣細緻~也像茶碗蒸一樣好味道~加上獨特醬汁~冰冰涼涼~吃起來真的很爽口喔~ 但是就這樣嗎~那可不~還可以變化很多好看好吃~色香味俱全的創意料理喔~而且是無油煙~無油~無負擔的關鍵字廣告美食喔~ 今天準備的材料如下:雞胸肉.馬鈴薯.豌豆.小玉米.青蘆筍.蕃茄.德國香腸.雕魚片.水果丁罐頭.苜蓿牙.海苔香鬆.桂冠芙蓉豆腐.桂冠沙拉~利用以上13種材料同時製作4種料理喔~ (一)蔬果沙拉 系統傢俱做法如下:首先將馬鈴薯煮熟壓成泥~加入燙熟的雞胸肉丁~加入德國香腸切丁~加蕃茄丁~最後加入桂冠沙拉拌勻即完成這道蔬果沙拉喔~ -(二)蕃茄蔬果沙拉盅 做法如下:將蕃茄切蓋~內部挖空~將馬鈴薯泥酒店工作+德國香腸丁~雞肉丁+沙拉拌勻放入蕃茄內~苜蓿芽鋪盤外圍水果丁裝飾加個綠蘆筍點綴~擠入沙拉即可~就完成漂亮的蕃茄蔬果沙拉盅~看起來很漂亮吧~ (三)鮮蔬芙蓉豆腐盅 做法如下:將芙蓉豆腐挖空放居酒屋入燙熟的雞丁及德國香腸然後倒入附上的調味醬汁包~將燙熟的豌豆~蘆筍~小玉米~蕃茄~擺盤裝飾即可~最後再用沙拉點綴一下喔~顏色夠漂亮吧~ (四)金沙雕魚芙蓉豆腐 做法如下:蕃茄切片墊底~芙蓉豆腐買房子切片放在蕃茄片上~然後放入燙熟的雕魚肉~再撒上海苔香鬆~豌豆~綠蘆筍~小玉米擺盤裝飾喔~最後還要淋上芙蓉豆腐附的醬汁喔~這樣就完成了唷~ 最後這道~其實要這樣吃~直接將蕃茄片拿起來~一口放入酒店經紀嘴巴~真的超好吃的~而且夠清爽~吃的出層層的美味喔~蕃茄片的脆~芙蓉豆腐的滑嫩細緻~香鬆的香~雕魚的鮮甜~真的好好吃喔~ 其實做這幾道菜~真的很方便又快速喔~只要將材料都燙熟就差不多了~就可室內裝潢同時變化出來各種不同料理喔~而且好吃更好看呢~ 平常不愛吃蔬菜的晴晴~今天看到我做這幾道~還沒有拍照就急著要吃了~而且還很狗腿的說~看起來好好吃喔~等到拍好照~開動時~馬上食指大動~吃的津當鋪津有味~笑嘻嘻呢~還說媽咪好棒喔~好好吃喔~看到小孩吃媽咪親手做的料理這麼開心~這就是我的成就感呢~最後我一定要說一句:可欣媽咪真心推薦桂冠芙蓉豆腐~桂冠沙拉喔~真的好好吃唷~free hit 燒烤counters
- Sep 04 Tue 2012 22:59
安娘威好痛~
- Sep 04 Tue 2012 13:24
疲勞口苦!喝枸杞雞蛋湯
疲勞口苦!喝枸杞雞蛋湯很多腦力工作者,由於工作精神壓力大,再加上飲食不當、不規律酒店工作、活動少等特點,其腸胃功能呆滯,進食的食物在胃腸停留時間過長,很容易產生濕熱,也代償會引起口苦。另外,引起晨起口苦的原因很多,如有消化系統、呼吸系統、心血管系統疾病太平洋房屋的人;有口腔疾病以及患有某些感染性疾病的人;經常疲勞、睡眠不足、過度吸煙、酗酒的結婚西裝人等,均可出現口苦症狀。在飲食上宜忌食辛辣、油煎、燒烤等燥熱之品,可多進食清涼湯借錢水,以清涼飲食為主,生活中要忌酒醇甘肥;再者就是要注意情志調攝,保持心境平和,不好房網可急躁,不可憂鬱過度,性格宜開朗。凡性格內向、優柔不決者最易成口苦症,故保持心情seo愉快,是防治此病的關鍵一環。請試試疲勞口苦的食療:枸杞15g,雞蛋2個。先放枸杞與水訂做禮服煮湯,湯成加入攪拌雞蛋,再燒開即成。對輕度口苦能舒緩。
- Sep 04 Tue 2012 04:11
[ 視頻 ] 張根碩 允兒《愛情雨》反復反復 OST MV
- Sep 03 Mon 2012 18:17
運動會
運動會運動會 期待已久的運動會終於到來了,我懷著興奮的心情來到了學校,等待著所有精彩節目的登場房屋二胎. 首先是各個代表班級的繞場活動,他們精心的打扮,做了許多特別的造型,為今天的酒店工作節目揭開了序幕。接下來是六年級精彩的大會舞表演,他們整齊劃一的舞步, 搭配黃藍相間的彩球,一上一下的波浪,朝西服氣蓬勃的把最生動的舞姿呈現給大家,真是好看極了!再來是我們四年級的活力健康操,為了這個表演,我們還特地做了租辦公室很可愛的造型帽,大家看了都讚不絕口,說我們很有創意呢!而其他各年級的表演也都很精彩,不過,大家最期待的還是緊系統傢俱張刺激的大隊接力比賽了! 我們班被分在第三組的第三跑道,我是第三棒,雖然我不是飛信用貸款毛腿,也無法健步如飛,但我還是死命的往前跑,其他的同學也是一接到棒子就拼命的往前衝,想用風一樣的速度到達目seo的地,無奈,我們技不如人,最後只得到分組的第四名.但老師說我們很有運動家的精神,所以即使沒有前三名,也很棒了借款! 這是一個精彩又令我難忘的運動會,我期待下一次的運動會也可以這麼豐富又有趣信用貸款.
- Sep 03 Mon 2012 09:05
Top5國外蜜月旅行地點
Top5國外蜜月旅行地點綺幻馬來西亞柔佛州 Malaysia 湛藍海水白沙浪漫踏浪什麼是幸福美好的蜜月之旅?在亞洲大陸最南端馬來西亞柔佛州享受醉人落房屋貸款日,體驗海角天涯的澎湃感受;到馬來西亞大島細白沙灘踏浪,徜徉於海天一色的動人美景,這絕對是幸福蜜月的最佳定義。位於馬來西亞最南端的柔佛州,更辦公室出租是亞洲大陸的最南端,而此特殊的地理位置,也造就了亞洲大陸最南端?美的落日,浪潮聲伴隨著晚霞美景,令人難以忘懷;馬來西亞柔佛州西岸的豐盛港借錢(Mersing)海岸外,擁有眾多島嶼,其中未經過度開發的大島(Pulau Besar)更是蜜月旅人?不能錯過之地。距豐盛港約30分鐘船程的大島,擁有令人懾服的湛藍海網路行銷水、細白沙灘,體驗柔細白沙在腳尖跳躍的感受,至今仍未過度開發的大島,仍保留原始風貌,因此相當受到歐美旅客的歡迎。此外,馬來西亞對紅樹林保護區新成屋維護甚佳,你們小倆口不僅可以在蘊藏了茂密紅樹林的丹絨比艾國家公園(Tanjung Piai)步行或騎乘自行車等方式,觀察欣賞紅樹林的自然生態,更有機會一睹賣房子不時探頭的彈塗魚、海鳥和活潑好動的獼猴。馬來西亞柔佛州擁有未受外界過度開墾的天然環境,完善保留了大自然的光輝,因此,可讓你倆一次享受絕美落日面膜、沙灘、螢火蟲、紅樹林和美食,來趟綺幻的豐富蜜月之旅。蜜月催情景點夢幻蘭卡威之旅馬來西亞的蘭卡威,除了擁有潔淨的沙灘、石灰岩地質山地和原始的酒店打工生活美景特質外,流傳已久的各種民間故事和神話傳說,也是令遊客相當癡迷的。也正因為這些動人的組合,比起其他地方,蘭卡威多了一份更行魅力的色彩,室內設計值得你們小倆口前往探索奧妙。來一趟蘭卡威離島遊,你會發現真正美麗的沙灘及自然瑰寶都在這裡。DATA馬來西亞觀光局TEL:(02)東森房屋2514-9704www.promotemalaysia.com.tw