我们知道,虚拟地址 = 高10位在页目录表中的偏移量(页目录项pde)+中间10位在页表中的偏移量(页表项pte)+物理页的偏移,因此,如果我们能够获取到虚拟地址所对应的pte的物理地址,那么根据该物理地址和虚拟地址中物理页的偏移量进行结合,就能够得到虚拟地址所对应的真实物理地址。
因为我们起初设计的时候,在页目录项的第1023项中存放的是页目录表的物理地址,我们可以根据此特定来构造出虚拟地址所对应的pte的物理地址。
uint32_t* pte = (uint32_t*)(0xffc00000 + ((vaddr &0xffc00000) >>10) + ((vddr &0x003ff000) >>12) * 4)
其中的第一部分0xffc00000是通过虚拟地址的高10位进行回环,回到自身页目录表的地址,第二项vaddr &0xffc00000) >>10是再用页目录项pde(页目录内页表的索引)做为pte的索引访问到页表,((vddr &0x003ff000) >>12)再用pte的索引做为页内偏移。
这样我们就得到的虚拟地址对应的页表项的物理地址,最后我们根据 ((*pte &0xfffff000) + (vaddr &0x00000fff)),来找到物理页中所对应的那、个内存地址
.
1、创建触发器例如CREATE OR REPLACE TRIGGER CHK_IP_LHR
AFTER LOGON ON DATABASE
DECLARE
V_IPADDRVARCHAR2(30)
V_LOGONUSER VARCHAR2(60)
BEGIN
SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS'),
SYS_CONTEXT('USERENV', 'SESSION_USER')
INTO V_IPADDR, V_LOGONUSER
FROM DUAL
IF V_IPADDR LIKE ('192.168.59.%') THEN
RAISE_APPLICATION_ERROR('-20001', 'User '||V_LOGONUSER||' is not allowed to connect from '||V_IPADDR)
END IF
END
2、或者利用sqlnet.ora
修改$OREACLE_HOME/network/admin/sqlnet.ora
tcp.validnode_checking=yes
#允许访问ip
tcp.inited_nodes=(ip1,ip2,……)
#不允许访问的ip
tcp.excluded_nodes=(ip1,ip2,……)
3、利用iptables防火墙
vi /etc/sysconfig/iptables增加
-A INPUT -s 172.16.10.1 -i eth0 -p tcp -m tcp --dport 1521 -j ACCEPT
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)