威盛笔试1
发信人: fenga (It's A GooD DaY...To DiE), 信区: Job
标 题: Re: ★★★VIA面试归来,奉献面经给大家★★★
发信站: 武汉白云黄鹤站 (2003年11月12日23:27:05 星期三), 站内信件
1. PCI总线的架构,机器boot起来的时候CPU如何检测新插入的PCI设备?
对X86来说,BioS会提供一些调用检测设备,Linux kernel引导的时候可以不用这
些bios调用而自己扫描各级pci bus,主要会读取PCI configuration register(Device
ID, Vendor ID, PCI base/local base range)等
2. 谈谈x86的系统架构
x86:
MMU: 2 level page table or 3 level page table for IA-64
Interrupt controller: 8259, APIC for SMP arch, IDT
北桥:完成Local bus --> PCI bus, 还有memory controller,AGP extension
南桥:PCI bus --> other(ISA..etc), 好像interrupt controller也通过南桥接
Cache: 冯罗伊曼体系结构, I/D cache
pipeline: 我说不上来有什么特别的地方?
3. x86系统中的汇编有哪几个寄存器,分别是干什么用的?
general purpose register: ax, bx, cx, dx
segment register: Code segment/CS,Data segment/DS,Stack Segment/SS, ??/F
S, 高13位作为segment selector, 还有一位表示用于LDT还是GDT,剩下两位是privile
ge level
GDTR: GDT base
IDTR: IDT base
TR: TSS base
CR0~CRx: CR3 好像是page table base, CR0 里面可以打开MMU
EFLAGS: Indicates overflow/negtive/zero/...
只记得这些了,其实可以去看手册啊
4. 函数入栈出栈在汇编里面是如何实现的?
push/pop, ESP 减小--〉进栈, ESP增大-->出栈
?指函数参数进栈出栈嘛? 是由Compiler完成的 ,STDCALL时首先返回地址的CS,
EIP进栈,然后参数从右至左依次进栈
可能会产生page fault exception而造成堆栈的扩展,x86堆栈由高地址往低地址
延伸
5. Linux系统中线程和进程有什么区别?系统是如何实现进程和线程的管理的?
Linux线程可能有两种情况:内核线程/用户态线程,根本的区别是没有独享的用户空
间
用户态线程只是轻量级进程,仍然作为一个调度单位,即有自己的task_struct结构,
使用POSIX库来创建/管理调度,
进程直接由内核scheduler进行调度
6. Linux线程是抢占式还是非抢占式的?
目前是非抢占式的,但2.6推出后不一样了
为了避免内核中的不可重入的资源被破坏,调度函数schedule()只能在返回用户空间
的时候才能被调用,导致了内核不可抢占,2.6使用了Robert Love的一个patch,可以在
某些情况下抢占内核,即当前进程不处于某个临界区之内
7. 在debug的时候,假如有这样一段语句:
if(...)
{
a...
} else {
b...
}
如果程序已经执
行到a处,此时改变那个寄存器可以让程序跳转到b处执行?
EIP?
8. Softice如何加入一个中断?
很多种方式 bpx?
9. 中断是如何实现的?debug时设置了断点,CPU如何知道?
x86不是太清楚,好像是EFLAGS里面可以标示目前处于DEBUG mode
对其他体系结构来说,如PPC, ARM,它们都有相应的Exception Vector对应于调试需
要, 然后有一些针对调试而设计的寄存器存放access哪些instruction address or dat
a address 要break下来,break 后进入exception vector处理函数,所谓的插桩式(st
ub),一些调试软件如kgdb就是这种方式,JTAG/BDM ICE好像不一样,它们是利用了芯片
本身支持的一些调试功能
10. Linux编程中,用户空间的进程如何访问内核空间的函数?
如果当前CPU没有MMU/内存保护,可直接访问,呵呵
对x86来说需要经过privilege level 切换由3--〉0, 包括stack,page table(U
ser process related,Kernel page table不变) 也要变
11. 请你说说汇编里面是如何实现函数的出栈入栈操作的?
上面回答了
12. 用过windebugger没有?了解2D/3D编程么?了解video方面的编程么?
win debugger--> softice? 不了解,不了解,呵呵
如果还有想起来的,我后面再贴吧。
【 在 netjerry (找工作了,加油干!) 的大作中提到: 】
: 昨天晚上去了VIA的宣讲会,本来投的是Software Engineer(2)的(主要是Linux
:
: 下的开发),结果只有Software Engineer(1)的职位了,没办法就投了一个,打算
:
: 去做做笔试题。回来没多久收到VIA的笔试通知,让今天早上10:00去参加笔试(
:
: 晕,今天又不去实验室,怕怕,不过也没办法,机会难得)。
:
: 早上的笔试整体感觉来说还好,除开最后一个题目(是让你写一个函数,删除
:
: .................(以下省略)
--
| |