1.实现strcpy
不调用库函数实现字符串拷贝函数:strcpy. /*********************** C语言标准库函数strcpy的一种典型的工业级的最简实现
* 返回值:目标串的地址。
* 对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL。
* 参数:
* strDestination 目标串
* strSource 源串
***********************/
char *strcpy(char *strDestination,const char *strSource)/*
{
assert(strDestination!=NULL && strSource!=NULL);
char *strD=strDestination;
while ((*strD++=*strSource++)!='\0');
return strDestination;
}
GNU-C中的实现(节选):
*/
char* strcpy(char *d, const char *s)/* while((*d++=*s++)); 的解释:两层括号是为了取赋值表达式的值,而赋值表达式的值为左操作数,所以在复制NULL后,循环停止 */
{
char *r=d;
while((*d++=*s++));
return r;
}
2.绝对地址跳转
一般在bootloader跳转到App是通过绝对地址跳转的方式完成跳转的。比如bootloader位置flash地址0xA0000000处,App位于flash地址0xA0002000处,可使用以下程序片段跳转到App:bootApp = (void(*)())(0xA0002000);
(*bootApp)(); //jump to App
3.编写冒泡排序
参考例程void my_sort(char *data ,int len)
{
int i,j,temp;
for(i=0;i<len-1;i++)
for(j=1;j<len-i;j++)
if(data[j]<data[j-1])
{
temp = data[j];
data[j] = data[j-1];
data[j-1] = temp;
}
}
4.linux笔试题参考答案
(仅供参考,只是个人见解)
1、255.255.254.0网段最多能支持多少主机?
答: 256 个
2、10M网卡传输过程中物理层采用什么编码?
答: 曼彻斯特编码
3、栈与队列的特点?
答: 栈是先进后出,只能操作尾节点,队列是先进先出。
4、Cache的工作方式划分?
答: write-none,write-all,write-through( 写通 cache ,执行写操作时同时写入主存与cache) , write-back (写回 cache ,执行写操作时不写入主存,除非需要替换)
5、什么叫NMI中断?
答: 不可屏蔽中断
6、RISC主要性能及特性?
答: 精简指令集, RISC 微处理器不仅精简了指令系统,采用超标量和超流水线结构;它们的指令数目只有几十条,却大大增强了并行处理能力 。 性能特点一:由于指令集简化后,流水线以及常用指令均可用硬件执行;
性能特点二:采用大量的寄存器,使大部分指令操作都在寄存器之间进行,提高了处理速度;
性能特点三:采用缓存— 主机—外存三级存储结构,使取数与存数指令分开执行,使处理器可以完成尽可能多的工作,且不因从存储器存取信息而放慢处理速度。
7、在嵌入式系统中,所谓的北桥指的是什么?
答: “ 南北桥 ” 主要适用于 INTEL 的 X86 结构体系,和嵌入式系统没有直接的关联。 “北桥 ” 主要指母板上 CPU 和内存等高速核心部分的控制和通讯桥接芯片,而 “ 南桥 ”则指和扩展总线和 IO 的控制和通讯桥接芯片。所谓南北的涵义主要体现在其芯片组在母板上的位置(相对于 CPU ) —— 上北下南。在嵌入式系统中通常叫 AHB/APB
实际上就是高速总线和低速总线
(2)简答题:
1、说说轮巡任务调度与抢占式任务调度的区别?
答: 轮询任务调度与抢占式任务调度的区别在于抢占式调度可以因为优先级高的任务抢占 cpu ,而轮询的不能。
2、什么叫存储器高速缓存技术,其主要目的?
答: 高速缓存英文是 cache 。一种特殊的存储器子系统,其中复制了频繁使用的数据,以利于 CPU 快速访问 。
3、画出计算机组成的最小逻辑框图。(哼,这道题竟然10分)
4、谈谈Volatile与Register修饰符的作用? 答: volatile 是纯程序与在硬件上运行的程序的最大区别,在 linux 系统中编译时必须进行优化 的,加上 volatile 关键词的变量是让编译器不对其优化。
register 是建议 编译器使用寄存器来优化对变量的存取
1. linux内核里面,内存申请有哪几个函数,各自的区别?
答: kmalloc 和 get_free_page 、 get_free_pages 。
kmalloc 函数申请的内存可以任意大小,但是 kmalloc 最大只能开辟 128k-16 , 16 个字节是被页描述符结构占用了。
而 get_free_page 或 get_free_pages 是申请的内存以页的大小为基准,大小为页的整数倍。
get_dma_pages, 这个函数除了以上功能外还能支持 DMA 传输。
2. IRQ和FIQ有什么区别,在CPU里面是怎么做的?
答: IRQ 是普通中断, FIQ 是快速中断,在 ARM 体系中,对于快速中断模式,有 8 个独立的寄存器,转换模式时无需将数据保存起来,而 IRQ 则不能,这样 FIQ 的速度就大大地提高了。
3.
int *a;
char *b;
a和 b本身是什么类型?
答: a 是指向整型的指针, b 是指向字符型的指针 。
a、b里面本身存放的只是一个地址,难道是这两个地址有不同么?
4.中断的上半部分和下半部分的问题:
讲下分成上半部分和下半部分的原因,为何要分?讲下如何实现?
答: (见《中断上下文》一文)
5.内核函数mmap的实现原理,机制?
答: 原型: void ( *mmap ) (struct file * , struct vm_area_struct *)
实现原理:
a. 先通过文件系统定位要映射的文件;
b. 权限检查 , 映射的权限不会超过文件打开的方式 , 也就是说如果文件是以只读方式打开 , 那么则不允许建立一个可写映射;
c. 创建一个 vma 对象 , 并对之进行初始化;
d. 调用映射文件的 mmap 函数 , 其主要工作是给 vm_ops 向量表赋值;
e. 把该 vma 链入该进程的 vma 链表中 , 如果可以和前后的 vma 合并则合并;
f. 如果是要求 VM_LOCKED( 映射区不被换出 ) 方式映射 , 则发出缺页请求 , 把映射页面读入内存中 .
在中断缺页机制中实现的。
6.驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子?
答: 在驱动程式中,当多个线程同时访问相同的资源时(驱动程式中的全局变量是一种典型的共享资源),可能会引发 " 竞态 " ,因此我们必须对共享资源进行并发控制。Linux 内核中解决并发控制的最常用方法是自旋锁和信号量(绝大多数时候作为互斥锁使用)。
而互斥是指任何时刻只允许一个进程使用某一共享资源,其他进程等待。实现是利用临界区。
7.spinlock自旋锁是如何实现的?
答: 最多只能被一个可执行单元持有,不会引起调用者睡眠,它会一直忙循环,如果对应的资源不释放锁。实现过程是:
spin_lock_init(x):初始化自旋锁x
spin_lock(lock):获取自旋锁
spin_trylock(lock):也是获取自旋锁,但不忙等待。
spin_unlock(lock):释放自旋锁。
8.任务调度的机制?
答:从调度策略、调度时机、调度步骤来讲陆续更新...