操作系统课程设计报告 - 图文 下载本文

内核编译完成,执行指令 make modules_install 安装内核模块 图3. 9 make modules_install make install 安装内核 由图可见,安装内核时发生错误。 图3. 10 make install 由图可见/lib/boot目录下无linux-2.6.34. 14-lc对应的.img文件,所以安装内核无法成功。执行指令: mkinitramfs –o initrd.img-2.6.34.14-lc 2.6.34.14-lc 然后再安装内核,成功 update-grub更新grub 图3. 11 拷贝对应的.img文件到/lib/boot

11

重新启动,选择进入linux-2.6.34.14-lc的内图3. 12 查看内核版本 核,进入终端,使用指令#uname –a查看当前系统为linux-2.6.34.14-lc 检查系统功能调用,编写源代码进行测试,测试成功 图3. 13 测试程序 3.4 题目三:增加Linux系统功能调用

3.4.1 关于Linux内核模块和设备驱动程序 参考书: 《 Linux Device Drvier 2 》 《 Linux内核编程 》

Linux核心是一种monolithic类型的内核,即单一的大核心

另外一种形式是MicroKernel,核心的所有功能部件都被拆成独立部分,这些部分之间通过严格的通讯机制进行联系。

linux内核是一个整体结构,因此向内核添加任何东西.或者删除某些功能 ,都十分困难 。为了解决这个问题,引入了模块机制,从而可以动态的在内核中添加或者删除模块。模块一旦被插入内核,他就和内核其 他部分一样。 3.4.2实现步骤 1)编写源代码

Mydev.c: #include #include #include #include #include #include #define BUFFER_SIZE 2048 MODULE_LICENSE(\static int mydev_major = 0; unsigned char mybuffer[BUFFER_SIZE]=\int Device_Open=0; static ssize_t my_open(struct inode *inode,struct file *file) 12

{ static int counter=0; if(Device_Open) return -EBUSY; Device_Open++; printk(\ return 0; } static ssize_t my_release(struct inode *inode,struct file *file) { if(Device_Open==0) return -1; else Device_Open=0; return 0; } static ssize_t my_write (struct file *filp, const char __user *buf, size_t count,loff_t *pos){ int size=count; if(size>BUFFER_SIZE) { printk(\ size=BUFFER_SIZE; } if(copy_from_user(mybuffer,buf,sizeof(mybuffer))) return -ENOMEM; return size; } static ssize_t my_read(struct file *filp, char __user *buf,size_t count, loff_t *pos){ int size=count; if(size>BUFFER_SIZE) { printk(\ size=BUFFER_SIZE; } if(copy_to_user(buf, mybuffer, size)) return -ENOMEM; return size; } static struct file_operations mydev_fops={ .read=my_read, .write=my_write, .open=my_open, .release=my_release, }; static int __init mydev_init(void) { int result; result=register_chrdev(0,\ if(result<0) { printk(\ return -1; } if(mydev_major==0){ mydev_major=result; printk(\device has been registerstatic ssize_t my_open(struct inode *inode,struct file *file)ed!\\n\ printk(\ printk(\ printk(\ printk(\ } return 0; 13

} static void __exit mydev_exit(void) { unregister_chrdev(mydev_major,\ printk(\ } module_init(mydev_init); module_exit(mydev_exit); 2)编译驱动程序

1 将源程序Mydev.c拷贝到/usr/src/linux-2.6.34.14/drivers/misc 图3. 14 Mydev.c的拷贝 2 修改/usr/src/linux-2.6.34.14/ drivers/misc/Makefile在最后一行添加: obj –m +=Mydev.o 3 进入目录:/usr/src/linux- 2.6.34.14/drivers/misc 使用指令:make –C /usr/src/ Linux-2.6.34.14 SUBDIR= $PWD modules 编译内核模块 图3. 15 修改makefile 图3. 16 编译内核模块 4 加载内核中的模块,使用指令:insmod ./Mydev.ko 5 创建新的虚拟设备文件,使用指令: mknod /dev/mydev c 250 0 通过查表找到设备文件号250(使用指令:cat /proc/devices 找到系统分配的主设备号250后面是设备驱动源代码中定义的设备注册名) 图3. 17 加载内核模块 图3. 18 创建虚拟设备文件 14

6 在驱动设备中找到mydev 图3. 19 找到驱动设备 7 通过运行程序,测试新的设备驱动 图3. 20 运行测试程序 3)测试程序的源代码:

test.c: #include #include #define MAXBUFF 1024 #define DEVICE \int main(void){ char buff[MAXBUFF],buff2[MAXBUFF]; int fd; printf(\ printf(\ if ((fd=open(DEVICE,O_RDWR))<0){ printf(\ return 1; } else{ read(fd,buff,MAXBUFF); printf(\ printf(\ scanf(\ printf(\ write(fd,buff,MAXBUFF); read(fd,buff2,MAXBUFF); printf(\ is readed again:\\n%s\\n\ } printf(\ return 0; } 15