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发布了最新的补货消息,针对此前新年闪购年付便宜VPS云服务器计划方案进行了少量补货,KVM虚拟架构,美国洛杉矶CN2 GT线路,1Gbps带宽,最低3TB流量,仅需14美元/年,有需要国外便宜美国洛杉矶VPS云服务器的朋友可以尝试一下。CloudCone怎么样?CloudCone服务器好不好?CloudCone值不值得购买?CloudCone是一家成立于2017年的美国服务器...
达州创梦网络怎么样,达州创梦网络公司位于四川省达州市,属于四川本地企业,资质齐全,IDC/ISP均有,从创梦网络这边租的服务器均可以备案,属于一手资源,高防机柜、大带宽、高防IP业务,一手整C IP段,四川电信,一手四川托管服务商,成都优化线路,机柜租用、服务器云服务器租用,适合建站做游戏,不须要在套CDN,全国访问快,直连省骨干,大网封UDP,无视UDP攻击,机房集群高达1.2TB,单机可提供1...
DiyVM 香港沙田机房,也是采用的CN2优化线路,目前也有入手且在使用中,我个人感觉如果中文业务需要用到的话虽然日本机房也是CN2,但是线路的稳定性不如香港机房,所以我们在这篇文章中亲测看看香港机房,然后对比之前看到的日本机房。香港机房的配置信息。CPU内存 硬盘带宽IP价格购买地址2核2G50G2M1¥50/月选择方案4核4G60G3M1¥100/月选择方案4核8G70G3M4¥200/月选择...