Lab3:基于方向的内核同步机制

git 使用  时间:2021-02-24  阅读:()

Lab3的主要任务是实现一个新的内核同步机制,使得进程可以等待特定的方向事件,当设备被转动到该方向时自动解锁.
Lab3可以组队完成(超过3人),Gitrepo的地址是https://classroom.
github.
com/g/WCH52QDf.
团队的所有成员都可以访问该私有库,并且每个成员应至少对团队的Git私有库进五次提交修改.
熟悉基于团队的共享私有库Git命令,如gitpull,gitmerge和gitfetch.
重点是要进增式改并使用迭代开发周期.
1.
用户空间守护进程:orientationdaemonLab3的第一步是实现一个用户空间的守护进程(daemon),将Android设备的方向传感得到的值传给内核.

在Android平台上,设备的方向信息可以由其自带的方向传感获得.
编写一个名为orientd的守护进程,该进程轮询方向传感并将其返回值写入内核.
使用下面的系统调用接口新内核中的设备方向信息:/**Setscurrentdeviceorientationinthekernel.
*Systemcallnumber326.
*/intset_orientation(structdev_orientation*orient);structdev_orientation{intazimuth;/*rotationaroundtheX-axis(-180使用adbpush将其推送到模拟.
该模板程序会循环打印出设备方向数据.
你需要把它变成一个守护(daemon)进程.
并使daemon程序间歇运,而是让CPU一直循环读取设备.
使用usleep添加计时或使守护程序暂停,并在守护程序文件中定义间歇的时间间隔.
所有相关的函数放在kernel/orientation.
c和include/linux/orientation.
h中.
需要注意的是,只有管员(root用户)才能运orientd并新设备方向信息,且orientd须是一个守护进程,即它应该使用fork()将它自己放在后台,而是使用shell(如&符号或CtrlZ,bg命令)将程序强制进入后台序.
提示:可以在安装自定义内核之前先用默认4.
4.
124内核测试orientd,看其是否能够正确读取方向数据并打印,测试成功后再编写新的系统调用并编译安装新内核.
Android模拟的方向传感使用方法:启动仿真后,单击右侧工具栏中的".
.
.
",然后点击"Virtualsensor".
你可以拖动虚拟设备或下方的滚动条来操作模拟.
在本地计算机中编译用户空间程序如果你使用的是macOS或Linux,在本地计算机上编写和编译用户空间程序方.
为此,你需要在本地计算机上安装AndroidND.
你可以在这下载ND.
下载并解压缩ND后,进入androidndkr18目录并运:build/tools/make_standalone_toolchain.
py--archx86_64--api28--install-dirPATH_TO_NDK将PATH_TO_ND替换为要安装ND的径.
然后,通过运以下命令将$ND_PATH环境变设置为PATH_TO_ND/bin:echoexportNDK_PATH=\"PATH_TO_NDK/bin\bashrcsource~/.
bashrc安装好AndroidND后,即可以在本地计算机中运make来编译测试程序,并将其推送到模拟中运.

注意:在macOS系统上,请勿使用gitadd--all或gitcommit-a,因为macOS系统文件名区分大小写,而Linux内核源码的文件名是大小写感的,这样会导致内核能正常编译.

2.
基于方向的内核同步机制Lab3的第2步是设计并实现新的内核同步机制,该机制应允许一个或多个进程阻塞在一个方向事件P上,直到设备模拟处于该特定方向P上.
在set_orientation中新设备方向时,应解锁在包含新仿真方向的方向事件上阻止的所有进程.
如果在内核中没有进程等待该特定方向,则该操作无效.

具体来说,该同步机制的API需要实现的以下一组新的系统调用.
/**Createaneworientationeventusingthespecifiedorientationrange.
*Returnanevent_idonsuccessandappropriateerroronfailure.
*Systemcallnumber327.
*/intorientevt_create(structorientation_range*orient);/**Destroyanorientationeventandnotifyanyprocesseswhichare*currentlyblockedontheeventtoleavetheevent.
*Return0onsuccessandappropriateerroronfailure.
*Systemcallnumber328.
*/intorientevt_destroy(intevent_id);/**Blockaprocessuntilthegivenevent_idisnotified.
Verifythatthe*event_idisvalid.
*Return0onsuccessandappropriateerroronfailure.
*Systemcallnumber329.
*/intorientevt_wait(intevent_id);structorientation_range{structdev_orientationorient;/*deviceorientation*/unsignedintazimuth_range;degreesaroundX-axis*/unsignedintpitch_range;degreesaroundY-axis*/unsignedintroll_range;degreesaroundZ-axis*/};/*Helperfunctiontodeterminewhetheranorientationiswithinarange.
*/static__always_inlineboolorient_within_range(structdev_orientation*orient,structorientation_range*range){structdev_orientation*target=&range->orient;unsignedintazimuth_diff=abs(target->azimuth-orient->azimuth);unsignedintpitch_diff=abs(target->pitch-orient->pitch);unsignedintroll_diff=abs(target->roll-orient->roll);return(!
range->azimuth_range||azimuth_diffazimuth_range||360-azimuth_diffazimuth_range)&&(!
range->pitch_range||pitch_diffpitch_range)&&(!
range->roll_range||roll_diffroll_range||360-roll_diffroll_range);}修改set_orientation系统调用,使其通知打开的方向事件中范围包含当前方向的所有事件.
事件被通知后,等待该事件的所有进程都应被解锁.
如果没有进程等待该事件,则做任何反应.

首先应该考虑解决此问题所需的数据结构.
系统需要支持多个进程同时等待同的方向范围,因此可能需要一组方向范围的描述符数据结构,每个结构都标识一个事件.
这些数据结构需要放在一个表中,从该表中可以找到你需要的范围描述符.
范围描述符所使用的内存空间应该由动态分配获得,即使用内核函数kmalloc()和kfree().
你的同步机制需要支持多处同步对数据结构的并发访问.
此外,需要在保证正确的前提下提高访问效率.

如,在持有锁时可能进入睡眠状态的情况下需要使用信号而是自旋锁.
解如何同步对内核中缓冲区的访问,可以尝试使用内核结构kfifo.
你可以选择使用底层的等待队方法,如add_wait_queue(),remove_wait_queue(),或使用高级的prepare_to_wait(),finish_wait())等方法.
在Linuxkerneldevelopment第三版的第5861页中可以找到代码示.
interrupttible_sleep_on()和sleep_on()等函数在某些情况下也可以使用.
提示:在存在并发创建,访问和删除操作的情况下保证数据结构有效性的一种有用方法是维护对象的引用计数.
此时,对象仅由最后一个使用的用户释放.
如,文件系统使用inode结构的引用计数:当进程打开文件时,inode的引用计数递增.
此时如果另一个进程删除该文件,则该inode在系统中依然有效(尽管可见),因为其计数为正.
当进程关闭相应的文件描述符时,计数递减,如果引用技术等于0,则释放该inode.
由于存在并发访问,引用计数也需要使用显式同步方法或使用原子类型atomic_t进保护.
你应该正确处可能发生的错误并报告相应的错误代码,如如果内存分配失败,则返回ENOMEM.
鼓励参考完成类似任务的现有内核代码.
3.
系统测试写两个C程序分别进系统测试.
每个程序fork出n个child(n>2),然后所有child等待同一个方向事件,并执以下操作:faceup:当模拟屏幕朝向你时每隔一秒打应"%d:facingup!
",其中"%d"是该进程在所有child集合中的序号.
facedown:当模拟屏幕背向你时每隔一秒打应"%d:facingdown!
",其中"%d"是该进程在所有child集合中的序号.
同时父进程等待60秒,然后通过关闭打开的方向事件来关闭所有子进程(而是通过发送信号或其他此类方法).
通过旋转仿真验证系统是否正常运.
将测试程序放在repo中的tests目录中.

CloudCone中国新年特别套餐,洛杉矶1G内存VPS年付13.5美元起

CloudCone针对中国农历新年推出了几款特别套餐, 其中2019年前注册的用户可以以13.5美元/年的价格购买一款1G内存特价套餐,以及另外提供了两款不限制注册时间的用户可购买年付套餐。CloudCone是Quadcone旗下成立于2017年的子品牌,提供VPS及独立服务器租用,也是较早提供按小时计费VPS的商家之一,支持使用PayPal或者支付宝等付款方式。下面列出几款特别套餐配置信息。CP...

QQ防红跳转短网址生成网站源码(91she完整源码)

使用此源码可以生成QQ自动跳转到浏览器的短链接,无视QQ报毒,任意网址均可生成。新版特色:全新界面,网站背景图采用Bing随机壁纸支持生成多种短链接兼容电脑和手机页面生成网址记录功能,域名黑名单功能网站后台可管理数据安装说明:由于此版本增加了记录和黑名单功能,所以用到了数据库。安装方法为修改config.php里面的数据库信息,导入install.sql到数据库。...

VPS云服务器GT线路,KVM虚vps消息CloudCone美国洛杉矶便宜年付VPS云服务器补货14美元/年

近日CloudCone发布了最新的补货消息,针对此前新年闪购年付便宜VPS云服务器计划方案进行了少量补货,KVM虚拟架构,美国洛杉矶CN2 GT线路,1Gbps带宽,最低3TB流量,仅需14美元/年,有需要国外便宜美国洛杉矶VPS云服务器的朋友可以尝试一下。CloudCone怎么样?CloudCone服务器好不好?CloudCone值不值得购买?CloudCone是一家成立于2017年的美国服务器...

git 使用为你推荐
万维读者网罂粟花的含义?迅雷云点播账号求个迅雷VIP 是VIP就可以 只用来看云点播 改密码是孙子。 谢了 ! 362135668@qq.com数据库损坏数据库坏了怎么办二层交换机什么是二层交换机和三层交换机???网页打开很慢如何解决网速正常 网页打开很慢问题网页打开很慢为什么我打开浏览器的时候,网页打开的很慢?电子商务网站模板网页制作模板小米手柄小米手柄和飞智手柄哪个好?gbk编码表GBK码表怎么查office2007简体中文版如何激活office2007 professional简体中文专业版啊?
com域名注册1元 免费申请域名 购买域名和空间 cn域名个人注册 踢楼 uk2 linkcloud sub-process 小米数据库 促正网秒杀 柚子舍官网 谁的qq空间最好看 国外代理服务器地址 南通服务器 购买国外空间 cloudlink 四川电信商城 广东主机托管 好看的空间 tracker服务器 更多