C /C 笔试题-linux内核驱动开发笔试题

时间:2024-08-20 09:30:56 志彬 笔试题目 我要投稿
  • 相关推荐

C /C 笔试题-linux内核驱动开发笔试题

  在社会的各个领域,我们很多时候都会有考试,接触到试题,通过试题可以检测参试者所掌握的知识和技能。大家知道什么样的试题才是规范的吗?下面是小编为大家整理的C /C 笔试题-linux内核驱动开发笔试题,仅供参考,欢迎大家阅读。

C /C 笔试题-linux内核驱动开发笔试题

  C /C 笔试题-linux内核驱动开发笔试题

  一、C/C++语言

  1.头文件中的ifndef/define/endif 干什么用?

  答:防止该头文件被重复引用

  2.数据类型判断

  typedefint (*test) ( float * , float*)

  test tmp;

  tmp 的类型是:___C___。

  (a) 函数的指针,该函数以 两个指向浮点数(float)的指针(pointer)作为参数(arguments),并且函数的返回值类型是整型指针

  (b) 整型指针

  (c) 函数的指针,该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments),并且函数的返回值类型是整型

  (d) 以上都不是

  3.C++的类和C里面的struct有什么区别?

  struct中的成员默认是public的,class中的默认是private

  class有默认的构造、析构函数,struct没有

  class中可以有虚函数,struct不行

  class可以被继承,struct不

  4.阅读并作答

  下面的代码输出是什么,为什么?

  void test(void)

  {

  unsigned int a = 6;

  int b = -20;

  (a+b > 6) ? puts("> 6") : puts("<=6");

  }

  答:”>6”,因为有符号和无符号混合运算时,有符号数自动转换为无符号数值进行运算

  5.阅读并作答

  int counter (int i)

  {

  static int count =0;

  count = count +i;

  return (count );

  }

  main()

  {

  int i , j;

  for (i=0; i <=5; i++)

  j = counter(i);

  }

  本程序执行到最后,j的值是:__B___。

  (a) 10

  (b) 15

  (c) 6

  (d) 7

  6.阅读并作答

  main()

  {

  int a[][3] = { 1,2,3 ,4,5,6};

  int (*ptr)[3] =a;

  printf("%d %d " ,(*ptr)[1], (*ptr)[2] );

  ++ptr;

  printf("%d %d" ,(*ptr)[1], (*ptr)[2] );

  }

  这段程序的输出是: __A___。

  (a) 2 3 5 6

  (b) 2 3 4 5

  (c) 4 5 0 0

  (d) 以上均不对

  7..以下表达式符合规范的是___D__。

  a. while (p && *p) // p为指针变量

  b. if (1 == flag) // flag为布尔变量

  c. if (0.0 == x) // x为浮点变量

  d. if (strlen(strName) != 0) // strName为字符串变量

  8.给定一个4字节整型变量a,以bit0~bit31标识二进制位,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。#define BIT3 (1<<3)

  a |= BIT3;

  a ^= ~BIT3;

  9.编码实现以下几个小功能

  (1) 编写两个宏实现一个字节无符号整数的16进制与压缩bcd码进行互相转换。假设数值大小不超过99

  例如:“0x12”是16进制表示法,10进制数为“18”,记为“0x18”

  #define BYT_HEX2BCD(x) ( (x/10 )<<4) + (x%10)

  #define BYT_BCD2HEX(x) ( (x>>4)*10 ) + (x&0x0f)

  (2) 写个函数实现将ASCII码串转换为16进制数组

  例:ASCII串为“8e349bcd45”转换为

  0x8e,0x34,0x9b,0xcd,0x45

  intStrAsc2Hex(unsigned char *dst,const char * src, int len)

  {

  int i;

  unsigned char dtemp,stemp;

  char *ptr;

  ptr=const_cast(src);

  if(len%2) return 0;

  len/=2;

  for(i=0;i

  if( (*ptr) >=0 &&(*ptr)<=9 )stemp=*ptr-0;

  if( (*ptr) >=A &&(*ptr)<=F )stemp=*ptr-A+0x0a;

  if( (*ptr) >=a &&(*ptr)<=f )stemp=*ptr-a+0X0a;

  dtemp=stemp<<4;

  ptr++;

  if( (*ptr) >=0 &&(*ptr)<=9 )stemp=*ptr-0;

  if( (*ptr) >=A &&(*ptr)<=F )stemp=*ptr-A+0x0a;

  if( (*ptr) >=a &&(*ptr)<=f )stemp=*ptr-a+0X0a;

  *dst++=dtemp|stemp;

  ptr++;

  }

  return len;

  }

  二、Linux应用开发

  1.Linux操作系统

  (1)解释linux下常用命令:

  rm删除

  cp复制

  mount挂载

  chmod更改权限

  ls输出目录信息

  (2)遇到不熟悉的命令,你会?

  使用man命令查找帮助

  2. 段错误调试

  (1)什么是段错误?

  所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间,一旦程序发生了越界访问,CPU就会产生相应的异常保护,于是segmentationfault就出现了。

  (2)举例说明编程中通常碰到段错误的地方有哪些?

  例1

  往受到系统保护的内存地址写数据(如内核占用的或者是其他程序正在使用的)

  #include

  intmain()

  {

  int i = 0;

  scanf ("%d", i); /* should have used &i */

  printf ("%d\n", i);

  return 0;

  }

  例2

  内存越界(数组越界,变量类型不一致等)

  #include

  intmain()

  {

  int b = 10;

  printf("%s\n", b);

  return 0;

  }

  (3)如何发现程序中的段错误并处理掉?

  (a)在程序内部的关键部位输出信息,可以跟踪段错误在代码中可能的位置。使用这种调试方法,可以用条件编译指令#ifdef DEBUG和#endif把printf函数给包含起来,编译的时候加上-D DEBUG参数就可以查看调试信息。

  (b)用gdb来调试,在编译的时候加上-g参数,用来显示调试信息,程序在运行到段错误的地方,会自动停下来并显示出错的行和行号

  (c)使用catchsegv命令来扑获段错误

  C /C 笔试题-linux内核驱动开发笔试题

  一、基础知识

  1、Linux内核的主要组成部分有哪些?

  2、内核配置是何时进行的重要操作?

  3、系统交换分区的作用是什么?

  二、数据结构

  Linux内核中常用的数据结构有哪些?

  简述红黑树的特点及其在Linux内核中的应用。

  三、内存管理

  1、Linux内核中如何进行内存分配和释放?

  2、DMA(直接内存访问)在Linux内核中的作用是什么?

  四、中断处理

  1、简述Linux内核中的中断处理流程。

  2、如何编写Linux内核的中断处理函数?

  五、并发控制

  1、Linux内核中如何保证并发访问的安全性?

  2、简述自旋锁和互斥锁的区别。

  答案

  一、1、Linux内核主要由进程管理系统、内存管理系统、I/O管理系统和文件管理系统等四个子系统组成。

  2、内核配置是系统管理员在改变系统配置或硬件时要进行的重要操作。

  3、系统交换分区是作为系统虚拟存储器的一块区域,用于当物理内存不足时,将部分内存中的数据交换到磁盘上。

  二、红黑树是一种自平衡的二叉查找树,它确保了从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。在Linux内核中,红黑树被用于多种场景,如管理进程调度器的运行队列、实现文件系统(如ext4)中的目录索引等。

  三、1、Linux内核提供了多种内存分配机制,如slab分配器、kmalloc/kfree、vmalloc/vfree等。slab分配器用于分配小块内存,而kmalloc/kfree和vmalloc/vfree则分别用于物理内存和虚拟内存的分配与释放。

  2、DMA允许某些硬件子系统(如网络接口卡、磁盘控制器等)直接访问系统内存,而无需CPU的干预。这可以提高数据传输的效率,减少CPU的负担。在Linux内核中,DMA被广泛用于各种设备的驱动开发中。

  四、1、当硬件设备产生中断时,CPU会暂停当前正在执行的程序,转而执行中断处理程序。在Linux内核中,中断处理流程通常包括中断接收、中断分发、中断处理和中断返回等步骤。中断处理函数会注册到内核中,并在中断发生时被调用。

  2、编写Linux内核的中断处理函数需要了解中断处理函数的注册和注销机制。通常,中断处理函数会作为内核模块的一部分进行编写和加载。在编写中断处理函数时,需要注意函数的入口参数、返回值以及中断处理过程中的同步和互斥问题。

  五、1、自旋锁和互斥锁都是用于同步和互斥的锁机制,但它们的实现和使用场景有所不同。自旋锁在获取锁失败时会不断循环等待,适用于短时间的锁持有和等待;而互斥锁在获取锁失败时会将线程或进程挂起,适用于长时间的锁持有和等待。

  2、Linux内核通过多种机制来保证并发访问的安全性,包括自旋锁、互斥锁、读写锁等。这些锁机制用于在多个线程或进程同时访问共享资源时,保护数据的一致性和完整性。

【C /C 笔试题-linux内核驱动开发笔试题】相关文章:

Linux内核和驱动考试题03-08

华为C/C++笔经10-11

C/C++程序员必备资料 常见笔面试题深入解析12-12

C笔试题04-05

部分c/c++笔试题10-26

c 面试题10-14

C++笔试题03-25

C#笔试题02-24

C/C++笔试题目常见题目03-26