linux2.6核心下的簡單字元裝置
1.自定裝置符結構體
struct virtualdisk;
2.宣告函式
//裝置驅動模組載入函式
int __init virtualdisk_init(void);
//模組解除安裝函式
void __exit virtualdisk_exit(void);
//初始化並註冊
static void virtualdisk_setup_cdev(struct virtualdisk *, int );
//檔案開啟函式
int virtualdisk_open(struct inode *, struct file *);
//檔案讀函式
static ssize_t virtualdisk_read(struct file *, char __user *, size_t, loff_t *);
//檔案寫函式
static ssize_t virtualdisk_write(struct file *, const char __user *, size_t, loff_t *);
3.初始化檔案操作結構體
static const struct file_operations virtualdisk_fops = ;
4.定義函式
int __init virtualdisk_init(void)
else
if(result < 0)
virtualdisk_devp = kmalloc(sizeof(struct virtualdisk),gfp_kernel);//動態申請裝置結構體內存
if(!virtualdisk_devp)
memset(virtualdisk_devp, 0, sizeof(struct virtualdisk));
virtualdisk_setup_cdev(virtualdisk_devp, 0);
printk("register_chrdev_region success\n");
return 0;
fail_kmalloc:
unregister_chrdev_region(devno, 1);
return result;
}void __exit virtualdisk_exit(void)
static void virtualdisk_setup_cdev(struct virtualdisk *dev, int minor)
}int virtualdisk_open(struct inode *inode, struct file *filp)
static ssize_t virtualdisk_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
if(count > virtualdisk_size)
if(copy_to_user(buf, (void *)(devp->mem + p), count))//將核心中的內容拷貝到使用者空間
else
*ppos = 0;//將核心指標復位
printk("read:%s\n",buf);
return ret;
} static ssize_t virtualdisk_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
if(count > virtualdisk_size)
if(copy_from_user(devp->mem + p, buf, count))
else
*ppos = 0;//核心指標復位
printk("write:%s\n",buf);
return ret;
}//模組函式
module_init(virtualdisk_init);
module_exit(virtualdisk_exit);
module_license("dual bsd/gpl");
module_author("zhang san");
5.makefile檔案
obj-m := virtualdisk.o
#核心中makefile檔案的位置
kdir := /lib/modules/2.6.35-22-generic/build
all:
make -c $(kdir) m=$(shell pwd) modules
clean:
rm -f *.ko *.o *.mod *.mod.c *.symvers *.order
6.編譯
make
編譯後的結果:
7.載入模組
sudo insmod virtualdisk.ko
8.在/dev資料夾下建立裝置檔案
sudo /dev/virtualdisk c 200 0
9.測試(簡單的open、write、read)
測試程式
#include
#include
#include
#include
#include
#include
#include
#define bfsize 256
int main()
if((size = write(fd,buff,strlen(buff))) < 0)//寫
if((size = read(fd,temp,bfsize)) < 0)//讀
printf("read from device :%s\n",temp);
close(fd);
return 0;
}測試結果
1.測試程式
2.核心空間
10.解除安裝驅動
sudo rmmod virtualdisk
11.刪除裝置檔案
sudo rm -f /dev/virtualdisk.
結束。
linux2 6核心Makefile簡單語法與應用
2.6的makefile的寫法和應用相對於2.4有了一些變化,可能對於很多人來說,因為找不到相關的文件,都是模仿核心中已有的檔案來寫自己的makefile。其實,在核心的documentation kbuild目錄下面,還是有對核心makefile語法的詳細說明的。在這裡就2.6核心中makefil...
Linux 2 6核心編譯,核心公升級
本文描述了在fc8下公升級linux核心為2.6.25的詳細步驟.1.首先從如下 得到linux 2.6.25.2.然後在 usr src下untar這個包.tar xjfv linux 2.6.25.tar.bz2 3.配置核心 cd usr src linux 2.6.25 make mrpro...
Linux2 6核心啟動分析
我們已知u boot的終極目的是啟動核心,那麼核心啟動的開始必定是u boot傳入的引數。開啟armlinux.c 發現有一行的 為 thekernel 0,bd bi arch number,bd bi boot params 帶入三個引數 第乙個引數是0,第二個引數是機器id,第三個引數是引數所...