今天确实挺累的,眼睛迷迷糊糊,可能是看了一个月电视剧的原因。早上花了半个小时一直在研究从mask转换到数值的一个数学问题,脑子成浆糊,常量写了好多遍都不对,跑出来的结果反推回去推了几遍也推错了。最后,发现&写成&&,眼睛花了脑子也不好使。最后查一下mask的格式,终于解决了问题。不过,mask到数值只是我写着安慰自己的,最后还是老老实实改成数值推到maks。
后来,就被几个同事拉过去帮他们看问题。老实说,他们的代码我都看不见,就听他们涛涛不绝的说,我也没听进去多少。最后,去操作几遍总算帮他们确定了一些问题。然后再回来继续写代码。其中有一个问题是一个变量是static,但是却在另一个文件中调用。
写着写着,发现需要在用户态引用内核态的一个数据。我也不管那么多,先试在内核态定义全局变量在用户态使用,再试一下内核态在用户态调用。实在不行,我又自己瞎搞了一会。下午实在没办法了,去找同事帮忙。然后,同事给我找了一个例子。我看着例子,基本上把流程看完了,就开始写。不知道是不是自己脑子糊涂了,一会写错一个函数名,搞的牛头不对马嘴,再加上我怀疑自己使用的不对,光重新编译就花了一个小时。中间又去搭自动化环境,改自动化入参,又浪费了好长时间。最后只好晚上加班,把问题搞定。
虽然,我只写了用户态调内核态变量。但是想一想,内核态调用户态也是可以的,就是比较繁琐。
首先,说一下用户态使用内核态数据,由于用户态可以主动陷入内核态所以这个比较简单,直接一个ioctr就行了。ioctr把cmd和参数(引用或指针)传给内核态,内核态根据具体的cmd,调用内核态函数,把变量给参数。然后内核返回用户态。整个代码的逻辑就是这样,不要被代码调来调去搞晕。
那么,内核态如何获取用户态数据呢。首先,在内核态定义一个全局变量。然后,用户态的数据一变化就ioctr到内核态,内核态修改内核态定义的变量,在内核态某个地方使用就可以了。当然,可能不希望内核态的代码受用户态的数据的改变而改变。所以这个情况也是比较少的。