Linux设备驱动程序(LDD)中snull的编译问题

2023-05-16

对LDD中snull程序,编译的时候会有许多问题,鉴于网上还没有合适的解决办法,做此总结,整理知识。本文在debian6.0上运行通过,内核版本为2.6.32。

学习LDD中网络驱动程序部分,理解snull程序的原理很有必要。snull不依赖于硬件,数据包的收发都属于内存操作,但对整个网络驱动程序原理已经做了很好的阐述。程序并不复杂,相比e100.c;8139too.c;pci-skeleton.c,容易理解的多。作者写这本书的时候尚是2.6.11的年代,与现在内核版本相比,有些接口发生了变化,这是snull编译失败的直接原因。本文将描述snull的修改方法,并指出发生变化的接口。本文在debian6.0上运行通过,内核版本为2.6.32。

本文提供了修改完成后的makefile和snull.c,并生成了patch文件。

 


本文内容

1)常见问题

2)正确的snull编译方法

3)文件下载


一 常见问题

    这是我自己遇到的,和网上看到的部分问题,现一一阐述原因,并在第二段(见下文)中阐述解决方法。 如果在这些问题之外,还有问题,清大家留言,方便讨论。至于详细的接口变化,我会另写文章,一一说明。

 

    1)错误描述:

make -C /lib/modules/2.6.32-5-686/build M=/home/xiebiwei/dev/code/Ldd/snull modules
make: *** /lib/modules/2.6.32-5-686/build: No such file or directory.  Stop.
make: *** [default] Error 2

            问题原因:没有安装内核源代码树,或者是安装了内核源代码树后,没有修改makefile中的kerneldir。

 

     2)错误描述:

make -C /lib/modules/2.6.32/build M=/home/xiebiwei/dev/code/Ldd/snull modules
make[1]: Entering directory `/usr/src/linux-source-2.6.32'
scripts/Makefile.build:49: *** CFLAGS was changed in "/home/xiebiwei/dev/code/Ldd/snull/Makefile". Fix it to use EXTRA_CFLAGS.  Stop.
make[1]: *** [_module_/home/xiebiwei/dev/code/Ldd/snull] Error 2
make[1]: Leaving directory `/usr/src/linux-source-2.6.32'
make: *** [default] Error 2

            问题原因:内核版本不同,最近版本已经把CFLAGS变为EXTRA_CFLAGS

 

      3)错误描述:

make -C /lib/modules/2.6.32/build M=/home/xiebiwei/dev/code/Ldd/snull modules
make[1]: Entering directory `/usr/src/linux-source-2.6.32'
  CC [M]  /home/xiebiwei/dev/code/Ldd/snull/snull.o
/home/xiebiwei/dev/code/Ldd/snull/snull.c:18:26: error: linux/config.h: No such file or directory
/home/xiebiwei/dev/code/Ldd/snull/snull.c: In function ‘snull_poll’:
/home/xiebiwei/dev/code/Ldd/snull/snull.c:289: error: ‘struct net_device’ has no member named ‘quota’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:289: warning: type defaults to ‘int’ in declaration of ‘_min1’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:289: error: ‘struct net_device’ has no member named ‘quota’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:319: error: ‘struct net_device’ has no member named ‘quota’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:321: error: implicit declaration of function ‘netif_rx_complete’
/home/xiebiwei/dev/code/Ldd/snull/snull.c: In function ‘snull_napi_interrupt’:
/home/xiebiwei/dev/code/Ldd/snull/snull.c:406: error: implicit declaration of function ‘netif_rx_schedule’
/home/xiebiwei/dev/code/Ldd/snull/snull.c: In function ‘snull_init’:
/home/xiebiwei/dev/code/Ldd/snull/snull.c:647: error: ‘struct net_device’ has no member named ‘open’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:648: error: ‘struct net_device’ has no member named ‘stop’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:649: error: ‘struct net_device’ has no member named ‘set_config’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:650: error: ‘struct net_device’ has no member named ‘hard_start_xmit’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:651: error: ‘struct net_device’ has no member named ‘do_ioctl’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:652: error: ‘struct net_device’ has no member named ‘get_stats’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:653: error: ‘struct net_device’ has no member named ‘change_mtu’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:654: error: ‘struct net_device’ has no member named ‘rebuild_header’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:655: error: ‘struct net_device’ has no member named ‘hard_header’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:656: error: ‘struct net_device’ has no member named ‘tx_timeout’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:659: error: ‘struct net_device’ has no member named ‘poll’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:660: error: ‘struct net_device’ has no member named ‘weight’
/home/xiebiwei/dev/code/Ldd/snull/snull.c:665: error: ‘struct net_device’ has no member named ‘hard_header_cache’
make[2]: *** [/home/xiebiwei/dev/code/Ldd/snull/snull.o] Error 1
make[1]: *** [_module_/home/xiebiwei/dev/code/Ldd/snull] Error 2
make[1]: Leaving directory `/usr/src/linux-source-2.6.32'
make: *** [default] Error 2

      问题原因:

1  config.h在2.6.32内核中已经不存在,需要用相应头文件替换

2  struct net_device 的结构在新版本内核中发生了变化,删去了quota成员;将(open,stop,set_config,hard_start_xmit等)封装进了struct net_device_ops;将(poll,weight等)封装进了 struct napi_struct;将(hard_header,hard_header_cache,rebuild等)封装进了struct header_ops。并对部分函数名和参数进行了变动。

3  netif_rx_complete和netif_rx_schedule属于poll机制中的函数,接口名称已经变为napi_complete和napi_schedule。

 

 

 


二 正确的snull编译方法

1)构造内核源代码树

     这是编写驱动程序的必要准备,否则会无法编译驱动程序。模块在编译的时候必须调用内核的函数(模块属于内核的一部分,无法调用glibc),故而构造源代码树很必要。

     请参考:debian上的详细步骤:http://blog.csdn.net/xiebiwei/archive/2011/02/20/6196818.aspx

     debian中下载kernel比较方便,而比较通用的下载kernel方式如下:         

     用 "  uname -r " 查看系统内核版本,到 linux的kernel网站(http://www.kernel.org/pub/linux/kernel/v2.6/ )查找相应版本的内核源文件,下载并将其置于"/usr/src/"下。

     接下来便可用上述链接中的方法解压缩内核源代码并编译了。        

 

2)修改MakeFile

I)  将CFLAGS修改为EXTRA_CFLAGS,属于内核升级带来的接口变化。查看

II)修改KERNELDIR为正确的模块编译目录,即构造内核源代码树时生成的目录,一般为" /lib/modules /**/build"。查看    

 

3)修改源文件snull.c

I)头文件中的<linux/config.h>,在新内核中已经被删除,查看老版本内核的该文件内容,并替换。查看  

II) 修改 struct snull_priv ,添加struct napi_struct、struct net_device两个结构体的成员变量。2.6.32内核将poll()、weight等封装进了napi_struct,故而想实现轮询机制必须在private中定义napi_struct。  查看                

III) 修改函数:snull_poll。2.6.32内核中,struct net_device去除了quota,quota是设备对接收数据包数量的限制;poll函数接口参数也发生了变化,变为了 static int (*poll)(struct napi_struct,int),故而函数体也需要稍做调整,比如priv指针的获取等。查看  

IV) 修改函数snull_napi_interrupt,该函数中调度poll的函数接口变为了napi_schedule(struct napi_struct *)。查看  

V)   修改函数snull_init。struct net_device的定义发生了变化。查看

将open、stop、set_config等操作封装进了结构体 struct net_device_ops。查看

将harder_header、rebuild_header等操作封装进了struct header_ops;poll则封装进了struct napi_stuct。查看


三 示例文件下载

下载链接 (包括snull.c makefile snull_2.6.32.patch)

使用方法:可以直接覆盖snull.c和makefile。也可以只将patch文件拷贝到snull/下后运行patch -p1 < snull_2.6.32.patch

patch文件

diff -uNr snull_original/Makefile snull/Makefile
--- snull_original/Makefile 2005-01-31 15:31:02.000000000 -0500
+++ snull/Makefile 2011-02-24 17:45:39.000000000 -0500
@@ -9,8 +9,8 @@
   DEBFLAGS = -O2
 endif
 
-CFLAGS += $(DEBFLAGS)
-CFLAGS += -I..
+EXTRA_CFLAGS += $(DEBFLAGS)
+EXTRA_CFLAGS += -I..
 
 ifneq ($(KERNELRELEASE),)
 # call from kernel build system
@@ -19,7 +19,7 @@
 
 else
 

-KERNELDIR ?= /lib/modules/$(shell uname -r)/build
+KERNELDIR ?= /lib/modules/2.6.32/build
 PWD       := $(shell pwd)
 
 default:
diff -uNr snull_original/snull.c snull/snull.c
--- snull_original/snull.c 2005-01-31 15:31:02.000000000 -0500
+++ snull/snull.c 2011-02-26 19:50:06.000000000 -0500
@@ -14,8 +14,10 @@
  *
  * $Id: snull.c,v 1.21 2004/11/05 02:36:03 rubini Exp $
  */
-

-#include <linux/config.h>
+#ifdef LINUX_CONFIG_H
+#define LINUX_CONFIG_H
+#include <linux/autoconf.h>
+#endif
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/moduleparam.h>
@@ -87,6 +89,9 @@
  u8 *tx_packetdata;
  struct sk_buff *skb;
  spinlock_t lock;
+   
 
+      struct napi_struct napi;
+      struct net_device *dev;
 };
 
 static void snull_tx_timeout(struct net_device *dev);
@@ -284,11 +289,12 @@
 /*
  * The poll implementation.
  */


-static int snull_poll(struct net_device *dev, int *budget)
+static int snull_poll(struct napi_struct *napi, int budget)
 {
- int npackets = 0, quota = min(dev->quota, *budget);
+ int npackets = 0, quota = budget;
  struct sk_buff *skb;
- struct snull_priv *priv = netdev_priv(dev);
+ struct snull_priv *priv = container_of(napi,struct snull_priv,napi);
+      struct net_device *dev=priv->dev;
  struct snull_packet *pkt;
    
  while (npackets < quota && priv->rx_queue) {
@@ -315,10 +321,8 @@
   snull_release_buffer(pkt);
  }
  /* If we processed all packets, we're done; tell the kernel and reenable ints */
- *budget -= npackets;
- dev->quota -= npackets;
  if (! priv->rx_queue) {
-  netif_rx_complete(dev);
+  napi_complete(&priv->napi);
   snull_rx_ints(dev, 1);
   return 0;
  }
@@ -403,7 +407,7 @@
  priv->status = 0;
  if (statusword & SNULL_RX_INTR) {
   snull_rx_ints(dev, 0);  /* Disable further interrupts */
 netif_rx_schedule(dev);
+  napi_schedule(&priv->napi);
  }
  if (statusword & SNULL_TX_INTR) {
          /* a transmission is over: free the skb */
@@ -585,8 +589,8 @@
 
 
 int snull_header(struct sk_buff *skb, struct net_device *dev,
-                unsigned short type, void *daddr, void *saddr,
-                unsigned int len)
+                unsigned short type, const void *daddr, const void *saddr,
+                unsigned len)
 {
  struct ethhdr *eth = (struct ethhdr *)skb_push(skb,ETH_HLEN);
 
@@ -627,6 +631,25 @@
  * The init function (sometimes called probe).
  * It is invoked by register_netdev()
  */
+

+static const struct net_device_ops snull_dev_ops = {
+
+ .ndo_open  =snull_open,
+ .ndo_stop  =snull_release,
+ .ndo_set_config =snull_config,
+ .ndo_start_xmit =snull_tx,
+ .ndo_do_ioctl =snull_ioctl,
+ .ndo_get_stats =snull_stats,
+ .ndo_change_mtu =snull_change_mtu,
+ .ndo_tx_timeout =snull_tx_timeout,
+};
+

+static const struct header_ops snull_header_ops= {
+ .create =snull_header,
+ .rebuild =snull_rebuild_header,
+ .cache = NULL,             /* Disable caching */
+};
+

 void snull_init(struct net_device *dev)
 {
  struct snull_priv *priv;
@@ -644,25 +667,13 @@
   */
  ether_setup(dev); /* assign some of the fields */
 
- dev->open            = snull_open;
- dev->stop            = snull_release;
- dev->set_config      = snull_config;
- dev->hard_start_xmit = snull_tx;
- dev->do_ioctl        = snull_ioctl;
- dev->get_stats       = snull_stats;
- dev->change_mtu      = snull_change_mtu; 
- dev->rebuild_header  = snull_rebuild_header;
- dev->hard_header     = snull_header;
- dev->tx_timeout      = snull_tx_timeout;
+ dev->netdev_ops = &snull_dev_ops;
+ dev->header_ops = &snull_header_ops;
  dev->watchdog_timeo = timeout;
- if (use_napi) {
-  dev->poll        = snull_poll;
-  dev->weight      = 2;
- }
+
  /* keep the default flags, just add NOARP */
  dev->flags           |= IFF_NOARP;
  dev->features        |= NETIF_F_NO_CSUM;
- dev->hard_header_cache = NULL;      /* Disable caching */
 
  /*
   * Then, initialize the priv field. This encloses the statistics
@@ -670,9 +681,15 @@
   */
  priv = netdev_priv(dev);
  memset(priv, 0, sizeof(struct snull_priv));
priv->dev = dev;
+
  spin_lock_init(&priv->lock);
  snull_rx_ints(dev, 1);  /* enable receive interrupts */
  snull_setup_pool(dev);
+ if (use_napi) {
+  netif_napi_add(dev,&priv->napi,snull_poll,2);
+ }
+
 }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux设备驱动程序(LDD)中snull的编译问题 的相关文章

  • 面试可能会问六:智能指针

    先看一下百度百科的解释 xff1a 指针指针 当类中有指针成员时 xff0c 一般有两种方式来管理指针成员 xff1a 一是采用值型的方式管理 xff0c 每个类对象都保留一份指针指向的对象的拷贝 xff1b 另一种更优雅的方式是使用智能指
  • C++笔记:指针转向(重新赋值)时的问题;重复释放;原地址遗漏释放;赋值运算符重载operator=;

    一个类默认会创建4个函数 xff1a 默认构造 拷贝构造 析构 和operator 61 函数 最后一个就是赋值运算符重载 xff0c 可以进行简单的值传递 注意 xff1a 这个是值传递 问题就在这 xff1b 还有一种传递叫 xff1a
  • C++笔记:虚继承

    虚继承解决的是菱形继承 Animal下派生出Sheep和Tuo类 动物基类下 xff0c 有两个派生类 xff0c 一个是羊类 xff0c 一个是驼类 这两个类都继承了Animal的一个属性 xff0c 比如m age 这样就导致资源的浪费
  • Ubuntu 搭建文件服务器(Nginx)

    1 xff0c 下载Nginx 2 xff0c 安装Nginx 3 xff0c Nginx指令及脚本使用 4 xff0c 配置Nginx 1 xff0c 下载Nginx 去官网下载对应的Nginx版本 nginx download 直接在u
  • WS2812灯珠(四)---实现全彩呼吸灯效果

    WS2812灯珠实现呼吸灯效果主要涉及到呼吸函数及颜色模型两部分的内容 清楚了这两点结合之前的灯珠驱动程序 xff0c 便可以实现任意颜色的呼吸变换效果了 呼吸函数 具体的呼吸函数细节这里就不介绍了 xff0c 感兴趣的可以自行搜索 这里下
  • 浅谈Marlin2.0

    简介 marlin固件发展至今已经形成了三个比较重大的版本 xff1a 1 0版 xff0c 1 1版 xff0c 2 0版 我接触marlin固件已经有一段时间了 xff0c 原来一直对于marlin固件的结构和应用平台一直不是很理解 x
  • uni-app多平台融合【入门】(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 uni app多平台融合 入门 标贝科技 xff09 一 uni app介绍 uni
  • vscode开发STM32(三)---调试篇

    vscode开发STM32 xff08 三 xff09 调试篇 文章目录 vscode开发STM32 xff08 三 xff09 调试篇前提条件配置调试配置JLink使用 96 JLinkGDB 96 进行调试配置stlink使用openO
  • CANopen资料收集

    CANopen资料收集 文章目录 CANopen资料收集开源CANopen协议栈1 CanFestival2 CANopenNode 3 canopen stack CIA官网canopen说明 https www can cia org
  • Modbus资料收集

    Modbus资料收集 文章目录 Modbus资料收集开源Modbus协议栈1 FreeModbus2 uc Modbus 开源Modbus协议栈 1 FreeModbus 网站 xff1a https www embedded expert
  • CANopenNode学习笔记(一)--- README翻译

    CANopenNode学习笔记 文章目录 CANopenNode学习笔记特性CANopen其他 CANopenNode 流程图文件结构对象字典编辑器 CANopenNode 是免费开源的CANopen协议栈 CANopen是建立在CAN基础
  • STM32驱动MAX6675读取K型热电偶温度

    MAX6675 进行热电偶冷端补偿和数字化 K 型热电偶信号 输出 12 位分辨率 SPI 兼容 只读的数据 转换器的精度为 0 25 xff0c 最高可读 43 1024 xff0c 如果使用数据的 8LSB 则温度范围为 0 到 43
  • WS2812灯珠(二)-- STM32 SPI+DMA方式驱动

    通过硬件SPI的可以很巧妙的模拟出WS2812的通信时序 xff0c 用spi的8位数据模拟ws281x的一位数据 要将系统时钟设置为56M xff0c SPI分频数设置为8 xff0c 则SPI的通信频率为7M xff0c 1s 7M 1
  • ESP8266(一)---引脚定义&接线说明

    一 引脚定义 xff1a FunctionDescriptionURXDUART RXD xff0c 接收UTXDUART TXD xff0c 发送RST外部Reset信号 xff0c 低电平复位 xff0c 高电平工作 xff08 默认高
  • STM32编码器模式详解(一)---理论

    一 编码器接口模式 选择编码器接口模式的方法是 xff1a 如果计数器只在TI2的边沿计数 xff0c 则置TIMx SMCR寄存器中的SMS 61 001 xff1b 如果只在TI1边沿计数 xff0c 则置SMS 61 010 xff1
  • STM32使用虚拟示波器

    STM32使用虚拟示波器 在调试过程中 xff0c 经常会有需要看到数据实时变化的情况 xff0c 这时候便需要用到虚拟示波器 如 xff1a 制作平衡车时 xff0c 需要了解拟合角度跟随加速度计和陀螺仪的动态变化情况 xff1b 做电机
  • STM32驱动多个超声波模块(只用一个定时器)

    用STM32单片机成功驱动一个超声波模块后 xff0c 接下来便有了疑问如何用stm32单片机驱动多个超声波模块呢 xff1f xff08 驱动一个超声波模块可以参考 xff1a stm32驱动超声波模块测距 xff09 超声波模块型号为H
  • 《SPARK官方教程系列》(标贝科技)

    1 概述 Apache Spark是一个用于大规模数据处理的统一分析引擎 xff0c 它在Java Scala Python和R中的提供了高级api xff0c 以及一个支持通用执行图 general execution graphs 的优
  • linux 在Terminal中打开桌面中的文件夹 nautilus命令; mac 在Terminal中打开桌面中的文件夹 open命令

    图形用户界面 xff08 Graphical User Interface xff0c 简称GUI xff0c 又称图形用户接口 xff09 是指采用图形方式显示的计算机操作用户界面 一 xff0e 在Linux系统中 nautilus 打
  • C/C++文件的编译过程

    在Windows下使用VS VC等编译器 xff0c xff08 其实VS只是编码器 xff0c 在幕后是CL编译器在帮助其编译 xff09 编译C C 43 43 文件我们并不能直观的看到详细过程 xff0c 编译器直接自动编译 其实在L

随机推荐

  • 如何使用带有用户名密码认证的HTTP(S)代理?保姆级教程来了!

    当我们在日常应用HTTP代理的时候 xff0c 终端IP不固定的情况下 xff0c 或者需要多机器同时使用HTTP代理时 xff0c 就会遇到一个问题 xff1a 如何使用带有用户名密码认证的HTTP S 代理 xff1f 按照下列步骤 x
  • PotPlayer的官网

    访问 PotPlayer 的官网 xff0c 需要先能访问到外面的网络 http potplayer tv http potplayer daum net 如果无法访问外面的网络 xff0c 可以使用下面的阿里云盘链接 阿里云盘分享
  • 为什么C++支持重载而C语言不支持重载

    一个函数在C 43 43 中能够被重载 xff0c 但是在C语言确不能被重载的 xff0c 是由于函数名在内存中存储方式不同所导致的 C语言 例如在C语言中 xff0c 有以下三个函数 xff0c 只给声明不给定义 xff01 span c
  • 2020-08-07

    上拉电阻 画红框标记的就是上拉电阻 概念 xff1a 上拉电阻的概念就是一端连接电源正极 xff0c 一端连接到输出口 xff0c 如果没有这个电阻 xff0c 那么电源和输出口就没有直接连接关系 它的作用如上图 xff0c 它可以避免I
  • extern "C" 含义

    extern 34 C 34 含义 extern 34 C 34 被 extern 限定的函数或变量是 extern 类型的 被 extern 34 C 34 修饰的变量和函数是按照 C 语言方式编译和链接的 extern 34 C 34
  • 77. Combinations

    Given two integers n and k return all possible combinations of k numbers out of 1 n For example If n 61 4 and k 61 2 a s
  • 基于STM32的串口通讯

    基于STM32的串口通讯 设备之间通信的方式 串行通信一般是以帧格式传输数据 xff0c 即一帧一帧的传输 xff0c 每一帧都含有起始信号 xff0c 数据信息以及停止信息等 并行通信 数据各个位同时传输 xff0c 速度快 xff0c
  • C语言的艺术之——头文件

    好记性不如烂笔头o o 系列的文章 xff1a C语言的艺术之 头文件 C语言的艺术之 函数 C语言的艺术之 标识符命令与定义 C语言的艺术之 变量 C语言的艺术之 注释 C语言的艺术之 排版与格式 C语言的艺术之 安全性 编码原则 xff
  • 图像高斯分布生成

    给定一些标记点的坐标 xff0c 希望生成其在图像中的高斯分布图 首先 xff0c 上公式 xff1a 不造怎么上公式 嗯稍后学习学习再补充 span class hljs keyword import span numpy span cl
  • 编译原理----词法分析设计

    程序设计实验1 词法分析 一 实验目的 xff1a 通过设计编制调试一个具体的词法分析程序 xff0c 加深对词法分析原理的理解 并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法 二 实验内容 编制一个单词获取程序
  • wwwwwwwwwwwwwwwwwww

    wwwwwwwwwwwwwwwwwwwww
  • C++成员变量的初始化

    类对象的构造顺序是这样的 xff1a 1 分配内存 xff0c 调用构造函数时 xff0c 隐式 xff0f 显示的初始化各数据成员 2 进入构造函数后在构造函数中执行一般计算 1 类里面的任何成员变量在定义时是不能初始化的 2 一般的数据
  • 【BUG解决】使用body-parser失效的实例解决

    前言 最近在使用express框架写Node代码 xff0c 遇到一个问题使用body parser模块失效 整整困在这里一天时间 xff01 xff01 xff01 res send req body 返回结果一直为空 但是代码的书写又看
  • BOCHS问题总结篇

    在官网上下载的bochs 2 4 5 win32版 bochs启动时会读bochsrc bxrc里的配置 xff0c 而bochsrc sample txt则是个sample xff0c 可以在这个sample里阅读相关参数的设置 1 RO
  • 关于Access的左连接

    这篇随笔没有什么深奥的技术要讨论 xff0c 只是自己一个知识上的盲点 xff1a 不知道在Access中如何进行左连接的操作 通过在网上搜索 xff0c 最后在CSDN上找到了自己要的答案 xff0c 因此觉得有必要记录下来 xff1a
  • ubuntu下安装Calibre

    Calibre是电子书管理软件 xff0c 支持Amazon Apple Bookeen Ectaco Endless Ideas Google HTC Hanlin Song设备及格式 xff0c 功能十分强大 ubuntu 有很多包都可
  • 编译Linux内核数

    本文是参考了网上多篇帖子而写的算不上什么原创 唯一值得欣慰的只不过在本机上实现罢了 因为毕竟失败了几次 也因为本人是初学驱动编程 很多简单的问题在我来说是相当的困难的 望有识之士不要笑话 最后 xff0c 希望本文能给刚学驱动而还没开头的人
  • 构造内核源码树

    编写驱动程序时 xff0c 需要内核源码树的支持 内核源码树时从内核源代码编译得到的 下面开始构造内核源代码的步骤 以Ubuntu为例子 1 下载内源代码 xff0c 位置www kernel org 注意 xff1a 源码树内核的版本要和
  • 裁剪图像中感兴趣区域python

    题外话 xff1a 比较全面的缩略图及相应源码 http matplotlib org gallery html http www cnblogs com wei li archive 2012 05 23 2506940 html 题外外
  • Linux设备驱动程序(LDD)中snull的编译问题

    对LDD中snull程序 xff0c 编译的时候会有许多问题 xff0c 鉴于网上还没有合适的解决办法 xff0c 做此总结 xff0c 整理知识 本文在debian6 0上运行通过 xff0c 内核版本为2 6 32 学习LDD中网络驱动