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目录中.
ZJI原名维翔主机,是原来Wordpress圈知名主机商家,成立于2011年,2018年9月更名为ZJI,提供香港、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册业务。ZJI今年全新上架了台湾CN2线路服务器,本月针对香港高主频服务器和台湾CN2服务器提供7折优惠码,其他机房及产品提供8折优惠码,优惠后台湾CN2线路E5服务器月付595元起。台湾一型CPU:Inte...
易探云服务器怎么样?易探云是国内一家云计算服务商家,致力香港云服务器、美国云服务器、国内外服务器租用及托管等互联网业务,目前主要地区为运作香港BGP、香港CN2、广东、北京、深圳等地区。目前,易探云推出的国内云服务器优惠活动,国内云服务器2核2G5M云服务器低至330元/年起;成都4核8G/200G硬盘/15M带宽,仅1888元/3年起!易探云便宜vps服务器配置推荐:易探云vps云主机,入门型云...
ucloud美国云服务器怎么样?ucloud是国内知名云计算品牌服务商家,目前推出全球多地机房的海外云服务器。UCloud主打的优势是海外多机房,目前正在进行的2021全球大促活动参与促销的云服务器机房就多达18个。UCloud新一代旗舰产品快杰云服务器已上线洛杉矶节点,覆盖北美和亚太地区,火热促销中, 首月低至7元,轻松体验具备优秀性能与极高性价比的快杰云服务器。点击进入:ucloud美国洛杉矶...