2011-12-1 成都 w q 面试题

1.写出下面的错误

int* f()
{
  int p = 0;
  return (&p);
}


int* f()
{
 int* p;
 *p = 10;
 return p;
}

int* f()
{
  int *p =(int *)malloc(sizeof(int));
  p++;
  return p;
}
2.输入一个整数,求对于二进制表示里面的1的个数
移位 与1进行与操作
3.如果不是一个整数,而是一个长的字符串,又如何处理
4.对单链表取反
5.移除已排序的数组里面的重复元素
6.inline变量和static变量考察  打印出值
   #define type1 inline
   #define type2 static
   
   int main(void)
   {
     for(int i = 0; i<3; i++)
       foo();
   }
   void foo()
   {
      type1 a = 10;
      type2 b = 10;
      a++;
      b++;
      printf("a:%d\nb:%d\n", a, b);
   }

经过vc和gcc测试 发现用inline修饰变量的时候会爆错
   

7.tdi驱动过滤知识

8.路由器对数据包的处理

9.tcp滑动窗口模型的详解

10.如何实现在tcp连接上传输udp数据包,可靠的传输

11.tcp发的数据包,对端是保证只能收到1个包?

12.常见的vpn验证机制

13. linux内核空间与用户空间的区别

     如果一个内核空间的进程崩掉会发生什么?

     如果一个用户空间的进程崩掉会发生什么?

------------------------------------------

网络上收集的资料解释:

首先,这个概念的由来,我认为跟CPU的发展有很大关系,在目前CPU的保护模式下,系统需要对其赖以运行的资料进行保护,为了保证操作系统内核资料,我们把内存空间进行划分,一部分为操作系统内核运行的空间,另一部分是应用程序运行的空间,所谓空间就是内存的地址。因此内核空间和用户空间的概念就出现了。在386以前的CPU实模式下,操作系统内核与用户程序的内存空间是不做区分的,也就不存在内核空间和用户空间的说法了。
    其次,CPU的保护模式的一个重大特点,也就是硬件直接支持的内存访问模式,虚拟地址空间到物理地址空间的映射。这种工作模式与内核空间用户空间在技术上的相辅相成,也是促成内存空间划分的原因。 内核空间,顾名思义就是内核的运行空间,用户空间也就是用户程序的运行空间,操作系统为了保护自己不被普通程序的破坏,对内核空间进行了一些定义,比如访问权限,换入换出,优先级等等。也就是说内核空间只允许内核访问,用户程序如果要访问内核空间就需要经过内核的审核。内核空间的页表是常驻内存的,不会虚拟内存管理模块换出到磁盘上。内核空间的程序一旦出错,系统会立即死机——系统拒绝继续运行。而用户程序则没有这么多些特权。
    再次,内核空间和用户空间都是指虚拟空间,也就是虚拟地址。目前32位系统总共有4G的虚拟地址空间,在Linux系统中,4G虚拟地址空间的最高1G地址被分配给内核使用,是为内核空间,且为内核独享,而低地址的3G空间为用户程序所共享,也就是每个用户程序都有3G的虚拟地址空间。

 

 

*进程寻址空间0~4G 
*进程在用户态只能访问0~3G,只有进入内核态才能访问3G~4G 
*进程通过系统调用进入内核态
*每个进程虚拟空间的3G~4G部分是相同的 
*进程从用户态进入内核态不会引起CR3的改变但会引起堆栈的改变

 

 

Linux将4G的地址划分为用户空间和内核空间两部分。在Linux内核的低版本中(2.0.X),通常0-3G为用户空间,3G-4G为内核空间。这个分界点是可以可以改动的。 正是这个分界点的存在,限制了Linux可用的最大内存为2G.而且要通过重编内核,调整这个分界点才能达到。实际上还可以有更好的方法来解决这个问题。由于内核空间与用户空间互不重合,所以可以用段机制提供的保护功能来保护内核级代码。 2.2.X版的内核对此进行了改动。这样内核空间扩张到了4G。从表面上看内核的基地址变为了0,但实际上,内核通常仍在虚址3G以上。 用户空间在2.2.X中从直观上变为0-4G,让人迷惑,不是可以直接访问内核了? 其实不然,同过使用页机制提供的保护,阻止了用户程序访问内核空间。windows是使用的一个开关设置的,一般是1G,设置过开关之后,用花空间就可以达到3G

 

在/arch/x86/include/asm/page_64_types.h下有如下两行:

#define __START_KERNEL_map _AC(0xffffffff80000000, UL)
#define KERNEL_IMAGE_START _AC(0xffffffff80000000, UL)

这就是对空间大小的划分,在0xffffffff80000000之前的是给用户空间,在0xffffffff80000000之后的给内核空间,如果你现在手里有大约12G的内存想让内核态下可以使用大小10G的空间可以修改此值,将上面两句改为如下:
 

#define __START_KERNEL_map _AC(0xfffffffc00000000, UL)
#define KERNEL_IMAGE_START _AC(0xfffffffc00000000, UL)

然后,再将你的内核加载到连续的物理内存起始地址即可,这样内核就可以有16G寻址空间
物理地址分布情况可以查看e820的信息取得。

 

 

14.windows上线程的shutdown属性如何获得,如

 

何进行同步io,如何使用message hanlde?


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值