$conf, $time;
$_uid = user_token_get_do();
empty($_uid) and user_token_clear(); // 退出登录
return $_uid;
}
// 用户
function user_token_get_do()
{
global $conf, $time, $ip, $useragent;
$token = param($conf['cookie_pre'] . 'token');
if (empty($token)) return FALSE;
$tokenkey = md5(xn_key());
$s = xn_decrypt($token, $tokenkey);
if (empty($s)) return FALSE;
$arr = explode("\t", $s);
if (count($arr) != 5) return FALSE;
list($_ip, $_time, $_uid, $_pwd, $ua_md5) = $arr;
if (array_value($conf, 'login_ip') && $ip != $_ip) return FALSE;
if (array_value($conf, 'login_ua') && md5($useragent) != $ua_md5) return FALSE;
$_user = user_read($_uid);
if (empty($_user)) return FALSE;
if (array_value($conf, 'login_only') && $_user['login_date'] != $_time) return FALSE;
// 密码是否被修改
if (md5($_user['password']) != $_pwd) return FALSE;
return $_uid;
}
// 设置 token,防止 sid 过期后被删除
function user_token_set($uid)
{
global $conf, $time;
if (empty($uid)) return '';
$token = user_token_gen($uid);
setcookie($conf['cookie_pre'] . 'token', $token, $time + 86400000, $conf['cookie_path'], $conf['cookie_domain'], '', TRUE);
return $token;
}
function user_token_clear()
{
global $conf, $time;
setcookie($conf['cookie_pre'] . 'token', '', $time - 8640000, $conf['cookie_path'], $conf['cookie_domain'], '', TRUE);
}
function user_token_gen($uid)
{
global $conf, $time, $ip, $useragent;
$key = 'user_token' . $uid;
static $cache = array();
if (isset($cache[$key])) return $cache[$key];
$user = user_read($uid);
$pwd = md5($user['password']);
$ua_md5 = md5($useragent);
$tokenkey = md5(xn_key());
$cache[$key] = xn_encrypt("$ip $time $uid $pwd $ua_md5", $tokenkey);
return $cache[$key];
}
// 前台登录验证
function user_login_check()
{
global $user;
empty($user) and http_location(url('user-login'));
}
// 获取用户来路
function user_http_referer()
{
global $conf;
$referer = param('referer'); // 优先从参数获取 | GET is priority
empty($referer) and $referer = array_value($_SERVER, 'HTTP_REFERER', '');
$referer = str_replace(array('\"', '"', '<', '>', ' ', '*', "\t", "\r", "\n"), '', $referer); // 干掉特殊字符 strip special chars
if (
!preg_match('#^(http|https)://[\w\-=/\.]+/[\w\-=.%\#?]*$#is', $referer)
|| FALSE !== strpos($referer, url('user-login'))
|| FALSE !== strpos($referer, url('user-logout'))
|| FALSE !== strpos($referer, url('user-create'))
|| FALSE !== strpos($referer, url('user-setpw'))
|| FALSE !== strpos($referer, url('user-resetpw_complete'))
) {
$referer = $conf['path'];
}
return $referer;
}
function user_auth_check($token)
{
global $time, $ip;
$auth = param(2);
$s = xn_decrypt($auth);
empty($s) and message(-1, lang('decrypt_failed'));
$arr = explode('-', $s);
count($arr) != 4 and message(-1, lang('encrypt_failed'));
list($_ip, $_time, $_uid, $_pwd) = $arr;
$_user = user_read($_uid);
empty($_user) and message(-1, lang('user_not_exists'));
$time - $_time > 3600 and message(-1, lang('link_has_expired'));
return $_user;
}
?>权限没有,则隐藏
function forum_list_access_filter($forumlist, $gid, $allow = 'allowread')
{
global $grouplist;
if (empty($forumlist)) return array();
if (1 == $gid) return $forumlist;
$forumlist_filter = $forumlist;
$group = $grouplist[$gid];
foreach ($forumlist_filter as $fid => $forum) {
if (empty($forum['accesson']) && empty($group[$allow]) || !empty($forum['accesson']) && empty($forum['accesslist'][$gid][$allow])) {
unset($forumlist_filter[$fid]);
}
unset($forumlist_filter[$fid]['accesslist']);
}
return $forumlist_filter;
}
function forum_filter_moduid($moduids)
{
$moduids = trim($moduids);
if (empty($moduids)) return '';
$arr = explode(',', $moduids);
$r = array();
foreach ($arr as $_uid) {
$_uid = intval($_uid);
$_user = user_read($_uid);
if (empty($_user)) continue;
if ($_user['gid'] > 4) continue;
$r[] = $_uid;
}
return implode(',', $r);
}
function forum_safe_info($forum)
{
//unset($forum['moduids']);
return $forum;
}
function forum_filter($forumlist)
{
foreach ($forumlist as &$val) {
unset($val['brief'], $val['announcement'], $val['seo_title'], $val['seo_keywords'], $val['create_date_fmt'], $val['icon_url'], $val['modlist']);
}
return $forumlist;
}
function forum_format_url($forum)
{
global $conf;
if (0 == $forum['category']) {
// 列表URL
$url = url('list-' . $forum['fid'], '', FALSE);
} elseif (1 == $forum['category']) {
// 频道
$url = url('category-' . $forum['fid'], '', FALSE);
} elseif (2 == $forum['category']) {
// 单页
$url = url('read-' . trim($forum['brief']), '', FALSE);
}
if ($conf['url_rewrite_on'] > 1 && $forum['well_alias']) {
if (0 == $forum['category'] || 1 == $forum['category']) {
$url = url($forum['well_alias'], '', FALSE);
} elseif (2 == $forum['category']) {
// 单页
$url = ($forum['threads'] && $forum['brief']) ? url($forum['well_alias'] . '-' . trim($forum['brief']), '', FALSE) : url($forum['well_alias'], '', FALSE);
}
}
return $url;
}
function well_forum_alias()
{
$forumlist = forum_list_cache();
if (empty($forumlist)) return '';
$key = 'forum-alias';
static $cache = array();
if (isset($cache[$key])) return $cache[$key];
$cache[$key] = array();
foreach ($forumlist as $val) {
if ($val['well_alias']) $cache[$key][$val['fid']] = $val['well_alias'];
}
return array_flip($cache[$key]);
}
function well_forum_alias_cache()
{
global $conf;
$key = 'forum-alias-cache';
static $cache = array(); // 用静态变量只能在当前 request 生命周期缓存,跨进程需要再加一层缓存:redis/memcached/xcache/apc
if (isset($cache[$key])) return $cache[$key];
if ('mysql' == $conf['cache']['type']) {
$arr = well_forum_alias();
} else {
$arr = cache_get($key);
if (NULL === $arr) {
$arr = well_forum_alias();
!empty($arr) AND cache_set($key, $arr);
}
}
$cache[$key] = empty($arr) ? '' : $arr;
return $cache[$key];
}
?>return FALSE;
$r = well_tag_thread__update(array('id' => $id), $update);
return $r;
}
function well_tag_thread_find($tagid, $page, $pagesize)
{
$arr = well_tag_thread__find(array('tagid' => $tagid), array('id' => -1), $page, $pagesize);
return $arr;
}
function well_tag_thread_find_by_tid($tid, $page, $pagesize)
{
$arr = well_tag_thread__find(array('tid' => $tid), array(), $page, $pagesize);
return $arr;
}
?>
ARM架构与CPU编程频道|福州电脑网
ARM架构与CPU
编程之家740
更新时间:2026-04-09 22:37:01 首先介绍两大主流CPU架构——ARM和x86的构造,然后从性能、扩展能力、操作系统的兼容性、软件开发的方便性及可使用工具的多样性及功耗这五个方面进行对比,扩展介绍RISC精简指令集。介绍CPU参数解读和概念辨析。最后介绍一些和CPU相关的Linux命令。
一、ARM架构与x86架构
我个人理解ARM和x86的区别在于指令集,也就是CPU对硬件发出的指令集合不同。ARM架构就是综合考虑指令集的特点、性能等因素,设计CPU、寄存器、运算器等的结构,最后形成基于ARMCPU的处理器架构。
1.什么是ARM架构
ARM架构过去称作进阶精简指令集机器(AdvancedRISCMachine,更早称作:AcornRISCMachine),是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。由于节能的特点,ARM处理器非常适用于移动通讯领域,符合其主要设计目标为低耗电的特性。
在今日,ARM家族占了所有32位嵌入式处理器75%的比例,使它成为占全世界最多数的32位架构之一。ARM处理器可以在很多消费性电子产品上看到,从可携式装置(PDA、移动电话、多媒体播放器、掌上型电子游戏,和计算机)到电脑外设(硬盘、桌上型路由器)甚至在导弹的弹载计算机等军用设施中都有他的存在。在此还有一些基于ARM设计的派生产品,重要产品还包括Marvell的XScale架构和德州仪器的OMAP系列。
2.ARM架构图
下图所示的是ARM构架图。它由32位ALU、若干个32位通用寄存器以及状态寄存器、32*8位乘法器、32*32位桶形移位寄存器、指令译码以及控制逻辑、指令流水线和数据/地址寄存器组成。
1、ALU:它有两个操作数锁存器、加法器、逻辑功能、结果以及零检测逻辑构成。
2、桶形移位寄存器:ARM采用了32*32位的桶形移位寄存器,这样可以使在左移/右移n位、环移n位和算术右移n位等都可以一次完成。
3、高速乘法器:乘法器一般采用“加一移位”的方法来实现乘法。ARM为了提高运算速度,则采用两位乘法的方法,根据乘数的2位来实现“加一移位”运算;ARM高速乘法器采用32*8位的结构,这样,可以降低集成度(其相应芯片面积不到并行乘法器的1/3)。
4、浮点部件:浮点部件是作为选件供ARM构架使用。FPA10浮点加速器是作为协处理方式与ARM相连,并通过协处理指令的解释来执行。
5、控制器:ARM的控制器采用的是硬接线的可编程逻辑阵列PLA。
6、寄存器。
3.x86架构
当然,这个架构图并不是所有的都是如此,根据不同的主板,平台,架构是略有差别的比如说,目前很多主板已经将北桥集成到CPU当中,将南桥集成为PCH,但大致的框架还是如此的。下面对这个架构图上的各个内容分别进行一些简介:
1、CPU,大家都不陌生的名词,中央处理器,计算机的核心大脑。
2、北桥(North Bridge Chipset):北桥是电脑主板上的一块芯片,位于CPU插座边,起连接作用。
3、南桥芯片(South Bridge)是主板芯片组的重要组成部分,一般位于主板上离CPU插槽较远的下方,PCI插槽的附近,这种布局是考虑到它所连接的I/O总线较多,离处理器远一点有利于布线。
4、内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。
5、显卡(Video card,Graphics card)全称显示接口卡,又称显示适配器,是计算机最基本配置、最重要的配件之一。
6、接口
7、网卡是工作在链路层的网络组件,是局域网中连接计算机和传输介质的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉及帧的发送与接收、帧的封装与拆封、介质访问控制、数据的编码与解码以及数据缓存的功能等。
8、声卡的基本功能是把来自话筒、磁带、光盘的原始声音信号加以转换,输出到耳机、扬声器、扩音机、录音机等声响设备,或通过音乐设备数字接口(MIDI)使乐器发出美妙的声音。
9、SATA(Serial Advanced Technology Attachment,串行高级技术附件)是一种基于行业标准的串行硬件驱动器接口,是由Intel、IBM、Dell、APT、Maxtor和Seagate公司共同提出的硬盘接口规范。
10、硬盘是电脑主要的存储媒介之一,由一个或者多个铝制或者玻璃制的碟片组成。碟片外覆盖有铁磁性材料。
11、总线。
参考资料:
一文看懂arm架构和x86架构有什么区别:
https://blo
本文发布于:2024-10-16,感谢您对本站的认可!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:架构armcpu
发布评论