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目录中.

UCloud新人优惠中国香港/日本/美国云服务器低至4元

UCloud优刻得商家这几年应该已经被我们不少的个人站长用户认知,且确实在当下阿里云、腾讯云服务商不断的只促销服务于新用户活动,给我们很多老用户折扣的空间不多。于是,我们可以通过拓展选择其他同类服务商享受新人的福利,这里其中之一就选择UCloud商家。UCloud服务商2020年创业板上市的,实际上很早就有认识到,那时候价格高的离谱,谁让他们只服务有钱的企业用户呢。这里希望融入到我们大众消费者,你...

物语云-VPS-美国洛杉矶VPS无限流量云windows大带宽100M不限流量 26/月起

物语云计算怎么样?物语云计算(MonogatariCloud)是一家成立于2016年的老牌国人商家,主营国内游戏高防独服业务,拥有多家机房资源,产品质量过硬,颇有一定口碑。本次带来的是特惠活动为美国洛杉矶Cera机房的不限流量大带宽VPS,去程直连回程4837,支持免费安装Windows系统。值得注意的是,物语云采用的虚拟化技术为Hyper-v,因此并不会超售超开。一、物语云官网点击此处进入物语云...

CloudCone 新增洛杉矶优化线路 年付17.99美元且简单线路测试

CloudCone 商家在以前的篇幅中也有多次介绍到,这个商家也蛮有意思的。以前一直只有洛杉矶MC机房,而且在功能上和Linode、DO、Vultr一样可以随时删除采用按时计费模式。但是,他们没有学到人家的精华部分,要这样的小时计费,一定要机房多才有优势,否则压根没有多大用途。这不最近CloudCone商家有点小变化,有新人洛杉矶优化线路,具体是什么优化的等会我测试看看线路。内存CPU硬盘流量价格...

git 使用为你推荐
网络明星网络明星是怎样成名的呢?如何又是网络明星呢?!!yy频道中心yy语音怎么进频道中心spgnux思普操作系统怎么样百度抢票浏览器现在火车票越来越难买了,新版百度手机浏览器,除了抢票外,还有什么其他功能吗?bluestacksbluestacks到底是叫蓝手指还是叫蓝叠微信如何建群微信建群怎么建今日热点怎么删除今日热点自动弹出怎么卸载或屏蔽唱吧电脑版官方下载电脑怎么安装唱吧,要能用的,请教教程,谢谢xp系统停止服务XP停止服务后该怎么办?网页打开很慢为什么我打开浏览器的时候,网页打开的很慢?
泛域名 日本私人vps 国外免费域名网站 香港bgp机房 bluevm oneasiahost bandwagonhost 68.168.16.150 512m 申请个人网页 135邮箱 免费吧 服务器托管什么意思 福建铁通 天翼云盘 能外链的相册 如何安装服务器系统 支持外链的相册 联通网站 主机返佣 更多