Category Archives: Note

A technical and technique related note, whatever

张江的冷风不输安亭。

约好下午三点,结果咱一点半就从地铁站屁颠屁颠出来了。然后扭了一会儿找到有轨电车的车站,坐到终点摸索着门牌号到了47#楼门前。跟前台确认自己的名单他们还扑哧一笑“提前这么早”,然后就在旁边坐等面试了。无聊翻翻自己的笔记发现没啥可看的,于是翻出包里的《狐的故事》继续读。

约莫到两点半左右开始面试,进来的人很和蔼,先随便看了看简历然后就开始问现在在实验室做的事情。我blablabla了一会儿就被问道项目里测试环境怎么搭,软硬件怎么分,什么工具……然后让我拿支笔在白板上面写一个Hello world……“我随便你用什么语言写”。太有趣了哥哥,写完C就写了个Perl,然后要求我程序带参数。乱涂乱画之后,下一题是给一个开头带有引用的文本,如何写一个程序在读到这句的时候展开引用文档内容,仍然是“我随便你用C啊,Perl啊,Python啊,Ruby啊什么写都行”。乱涂乱画中被提醒到使用递归,“你有没有考虑过b.txt也有include呢”,“还有倘若b.txt回归引用了a.txt怎么办”。程序我没写完整,最后是面试官上前在白板上帮我修改补完的OTL。

接下来写了一个4位adder的verilog,这个没什么挑剔的,聊了聊部门的情况以后就换了一位来面我。相比于前一位月牙笑容,这个可是川眉紧缩一丝不展的哟。进来还是开口就问实验室项目,然后是实验室情况,实习放不放人等等(心虚)。接着给了我一张纸让我写一个函数实现读一段只有字母与空格的字符串让我输出长度大于三个字母的单词个数。我也是啃了半天while和if判断才写好的,幸好没怎么挑剔。我看他脸色一直很淡定,程序读完说ok时才放松。然后被问道汇编语言时我就囧了,说自己在本科时候接触过一点MCU的汇编编程,他马上问我指令集,“你看,比如好了,x86的指令集都有哪些?”我说我不清楚,不过最基础的处理器也有取址解码运算存结果读写寄存器这五类,比如LDA、STA、ADD、MOV还有分支跳转BEQ之类。下一个问题更寒:那x86有哪些寄存器,答不上来,于是换成“寄存器你知道是什么吗?”。我马上摇头,Register呵呵最简单的就是D触发器,就扯到Verilog下时序逻辑和组合逻辑的区别、如果if-else还有case情况不完整时候会综合出latch这些问题了,最后一个答不上来的问题是:如果仿真波形里出现一个X信号,这说明逻辑里有什么样的情况……大神救救我。

感觉这次问的最多的还是实验室里的事情,我在这两三个小时里口干舌燥的花了最多的时间来讲Decoder的C model和hardware,以及进度和现在相匹配的测试工作,问测试问的最为详细,提取什么东西怎么做使用什么工具或者语言……话说这不算机密泄露吧www

晚上挤车回去的时候也接到了nv的电话,和他们交代了一些基本情况,商量intern的期限和面试的时间,可那边让我先回去填好Questionnaire再和HR商量再定。233,快一点呐不然下周我就只好去A社卖身了。

f2f preparation

佛祖保佑祖宗显神通八百万神保佑保佑我猛看一周末了让我一次通过吧!

======================C======================
1)C++和C的区别,C++的高级特性,分别阐述。
#define => const
const不仅可以用来声明不变的常量,这个关键词更大的用处是保证函数的输入参数不可更改增强健壮性。另外它需要指定常数的数据类型,防止编译器在隐含类型转换时出现意外的危险。
value parameter/address parameter => reference parameter(&n=m)
函数参数的引用传递与传值和传址都不相同,引用相当于对源变量起“别名”,实现传址参数的便利同时也避免了对指针过于危险的修改。
class: constratuctor func, destraturctor func
C++的一大高级特性便是基于类的数据类型以及面向对象的程序体系。类的封装把对象的变量、操作方法一并封装并定义了公共部分(public function)与私有部分(私有数据类型),用户不必或无权了解对象内部的实现专注于操作方法。

printf,scanf => iostream <<, >>

2)冒泡法,快速排序。
bubbleSort 每次比较小数上浮,大数沉底,循环至有序

if (A[i]>A[i+1])
{
	swap(A[i], A[i+1]);
	swapped_flag=true;
}

类似的还有鸡尾酒排序,试图从两边双向的分离泡沫与石头。
quickSort 分而治之,设定一个pivot_idx(一般位于数组中部)并与其他元素比较,使其不小于所有左侧元素并不大于所有右侧元素。第二步将左右两部分使用同样的方法二分排序,直到递归调用至两元素相比。

3)写一个虚函数。
虚函数是C++实现多态性的机制,通过基类访问派生类定义的函数。同名的函数该调用基类还是派生类并非编译时确定,而是运行的时刻决定,即动态联编。

class Base_A
{
	public:
	virtural void foo() 
              {cout<foo();                   //却调用了Derived_B的成员函数
}

4)写一个位操作的函数。

#define CHIP_SEL		0x1000
#define BUS_CMD_ADDR	0x0800+CHIP_SEL
int main()
{
int reg_ctrl_addr=0x0000, reg_ctrl_val=0x0000;
//......
reg_ctrl_addr=(BUS_CMD_ADDR+0x40);
reg_ctrl_val=reg_val_read(reg_ctrl_addr);
int stat=(reg_ctrl_val&0x000f);
int disp_num=(reg_ctrl_val&0x00f0)>>4;
//……
}

======================perl======================
1)匹配一个IP

/^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[4-9][0-9]|25[0-5]\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[4-9][0-9]|25[0-5])$/

*匹配一个email地址

/^(\w+[\.]\w*)+@(\w+\.\w+)$/

*并排序

@newlist = sort {(ab) || (a cmp b)} @old_list

2)谈谈对perl的理解
灵活,便利,贴近自然语言,与unix和C密不可分……

3)正则表达式的贪婪性,以及一些小问题
模式匹配的组合模式中,若既可匹配数个字符又能匹配数十个字符,则每次模式都将贪吃的匹配它最大长度的字符
比如
$_=”fred xxxxxxxxxxx barney”;
s/x+/boom/;
最后被替代的会是所有x而不是一或两个x字符

4)hash的特点什么的。
hash关联的key与value一一对应,如同索引与档案……

======================电路 verilog======================
1)画一个触发器和除法器门级电路
一个边沿敏感的D-latch组成主从结构,从而成为脉冲敏感的D flip-flop
除法器……我建议考查运算量很小的情况下使用Rom查表
一位全加器
Sum=A^B^Cin; Cout=AB+BCin+ACin
一位乘法器
二选一mux
out=AS+BnS, 用传输门实现

2)用verilog写一个4位的加法器,写一个模三计数器

module adder_4bit(in_a, in_b, in_carryi, out_sum, rst, clk)
parameter bitwidth=4;
input [bitwidth-1:0] in_a;
input [bitwidth-1:0] in_b;
input in_carryi;
input rst;
input clk;
output [bitwidth:0] out_sum;

reg [bitwidth-1:0] in_a;
reg [bitwidth-1:0] in_b;
reg [bitwidth-1:0] out_carryo
wire in_carryi;

always@(posedge clk)
	if (!rst)
		out_sum

3)@(posedge )和 @ * 的区别
对上升沿信号有效与对所有信号有效

4)setup time,hold time画图说明,不满足的话怎么解决。
tsu: 在寄存器时钟触发沿之前数据信号必须保持稳定有效的时间
thold: 在寄存器时钟触发沿之后数据信号必须保持稳定有效的时间

* 状态机,同步/异步实现
* System Verilog与verilog区别

======================系统结构======================
1)pipeline,为什么流水,流水线的结构,怎么解决数据,控制冲突。
Advantages:
Allows us to increase throughput, by breaking up long combinational paths and (hence) increasing clock frequency
Disadvantages:
May increase latency…
Only as good as the weakest link: slowest step constrains system throughput.

Data hazard, Structural hazard, Control hazard
RAW,WAR,WAW,解决数据冲突:Insert nops in code at compile time/Rearrange code at compile time/Forward data at run time/Stall the processor at run time
分支跳转beq 控制冲突,解决:分支预测

2)virtual memory的结构,存储体系的结构。
(main memory->disk memory) cache与virtural存储结构,两级
多个层次的存储器
Register Files
Buffers(Lookahead)
Cache
Main Memory
Online Storage
Off-line Storage

3)risc的register file有什么特点 和cisc有什么区别。

======================linux======================
1)常用的命令

======================others======================

PolicyKit issue 备忘

今天继续学perl introduction,期间蛋疼的想找新版的KDE装一下(原先版本4.3.5)等安装完成重新进入时候,Dolphin却无法挂载我用eSATA口的移动硬盘。一直提示:

org.freedesktop.Hal.Device.PermissionDeniedByPolicy:
org.freedesktop.hal.storage.mount-fixed auth_admin_keep_always
<–(action, result)

Google了半天才知道PolicyKit是一个安全策略相关的组件,兴许是我升级KDEbase时候某些软件包因为依赖性和冲突问题并没有装好。再登录后我的用户组(非root)在安全策略里并没有指派任何权限,本应提示输入root密码获得临时权限完成mount动作的过程却直接返回access denied。mount-fixed指的是系统内的硬盘,显示这样的错误提示也是由于我的移动硬盘通过SATA连接的,如果是通过USB那么策略组则应该是mount-removable

首先检查了相关的软件包,确保下面几个存在或重新安装
PolicyKit-gnome-libs
PolicyKit
PolicyKit-gnome
ConsoleKit-x11-0.3.1
ConsoleKit-0.3.1
重装这些软件包以后问题依旧。

其次,尝试恢复PolicyKit缺省设置或取得权限

#!/usr/bin/bash
sudo polkit-action --reset-defaults org.freedesktop.hal.storage.mount-fixed
#or
sudo polkit-auth --obtain org.freedesktop.hal.storage.mount-fixed

以及去Yast找预定义安全选项恢复都没有奏效。

剩下的招数只有编辑PolicyKit的config文件了,我找到了两处和mount-fixed相关的配置,第一个配置存放在/usr/share/PolicyKit/policy/org.freedesktop.hal.storage.policy,第二个是全局配置,规则具有优先权,存放位置是/etc/PolicyKit/PolicyKit.conf。

按照官方说明的xml规则,把前者mount-fixed部分内<allow_active>OOXX</allow_active>由默认的auth_admin_keep_always更改为auth_self_keep_session或者安全级别最低的yes(作用见官方文档说明)。重新login或者重新启动X后仍然提示错误。

最后只能动用PolicyKit.conf的覆盖配置了,在root权限下打开编辑,添加以下项目:

<config version="0.1">
 <match action="org.freedesktop.hal.storage.mount-fixed">
 <match user="yourusername">
 <return result="auth_self_keep_session"/>
 </match>
 </match>
</config>

It works.
不过毕竟只是临时解决办法,这样以来系统或许安全性就降低了……