对与内核所有的操作都是在管理员的身份下的
首先是编译问题,语句应该这样写的:
gcc –o lkpmem lkpmem.c liblkpsinglefoo.so
而很可能会出现这样的错误:
error while loading shared libraries:/lib/liblkpsinglefoo.so: cannot restore segment prot after reloc: Permissiondenied
这样可以用以下两个步骤解决:
编辑/etc/selinux/config,找到这段:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing
把 SELINUX=enforcing 注释掉:#SELINUX=enforcing ,然后新加一行为:
SELINUX=disabled
保存,关闭。
……
编辑/etc/sysconfig/selinux,找到:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing
如果SELINUX已经是 SELINUX=disabled,那么就不用改了,否则就把SELINUX=enforcing 注释掉,新加一行:
SELINUX=disabled
保存,退出。
郁闷的是.我把SELinux关闭后还是不行.于是到google上search.发现这个很有用.
在你保证SElinux 被disable后.还执行下
chcon -t texrel_shlib_t
如: chcon -t texrel_shlib_t /路径/路径/名字.so (这个文件视具体执行文件.)
以上两步.已经解决了很多server的问题了.
这两种方法是网上摘录的,确实是这样。顺利编译为lkpmem
之后执行./lkpmem
并且在另一终端下(注意:也是要管理员身份)
ps aux | grep lkpmem
cat /proc/<pid>/maps
以上就是整个项目的执行过程所遇到的问题的解决方法,而下面将要说下这个项目主要是要我们学到什么?
warning: incompatible implicit declarationof built-in function ‘printf’
对于globalvar1和globalvar2这两个为为初始化和已初始化的全局变量,存放在数据段中,在内存中的地址为0x8049870和0x8049864相隔12个字节单位??为什么?
而localvar1是动态分配的局部变量,也就是堆
后面的两个都是局部变量,同个内存地址的原因是因为调用函数时申请,退出函数时就释放,也就是入栈与出栈了。