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

萤光云(20元/月),香港CN2国庆特惠

可以看到这次国庆萤光云搞了一个不错的折扣,香港CN2产品6.5折促销,还送50的国庆红包。萤光云是2002年创立的商家,本次国庆活动主推的是香港CN2优化的机器,其另外还有国内BGP和高防服务器。本次活动力度较大,CN2优化套餐低至20/月(需买三个月,用上折扣+代金券组合),有需求的可以看看。官方网站:https://www.lightnode.cn/地区CPU内存SSDIP带宽/流量价格备注购...

HostKvm5.95美元起,香港、韩国可选

HostKvm发布了夏季特别促销活动,针对香港国际/韩国机房VPS主机提供7折优惠码,其他机房全场8折,优惠后2GB内存套餐月付仅5.95美元起。这是一家成立于2013年的国外主机服务商,主要提供基于KVM架构的VPS主机,可选数据中心包括日本、新加坡、韩国、美国、中国香港等多个地区机房,均为国内直连或优化线路,延迟较低,适合建站或者远程办公等。下面分享几款香港VPS和韩国VPS的配置和价格信息。...

DMIT$10.9/月,日本VPS/三网直连/1核1.5G内存/20GB存储/1Gbps端口

优惠码年付一次性5折优惠码:TYO-Lite-Open-Beta-1y-50OFF永久8折优惠码:TYO-Lite-Open-Beta-Recur-20OFF日本vpsCPU内存SSD流量带宽价格购买1核1.5G20 GB4 TB1Gbps$10.9/月购买2核2 G40 GB6 TB1Gbps$16.9/月购买2核4 G60 GB8 TB1Gbps$21.9/月购买4核4 G80 GB12 TB...

git 使用为你推荐
google竞价排名谷歌SEO与谷歌竞价的区别和联系伪装微信地理位置用软件 伪装微信地理位置 在相册上传图片显示所在城市还是我目前的位置?手游运营手册2019新个税主要内容有哪些?可以简单说明一下吗?站长故事爱迪生发明东西的故事邮箱打不开怎么办126邮箱打不开怎么办工信部备案去国家工信部备案需要什么手续呢百度手写百度手写怎么不见了arm开发板ARM开发板具体有什么作用?有什么商业价值?硬盘人上海人说“硬盘”是什么梗商标注册查询官网商标注册网的官网是哪个?
万网虚拟主机 a2hosting java主机 nerd 名片模板psd sub-process 回程路由 三拼域名 数字域名 gspeed me空间社区 万网主机管理 空间登录首页 iki 阿里云邮箱登陆地址 傲盾代理 游戏服务器 性能测试工具 ddos攻击小组 电脑主机启动不了 更多