易截截图软件、单文件、免安装、纯绿色、仅160KB
热门标签: c c# c++ asp asp.net linux php jsp java vb Python Ruby mysql sql access Sqlite sqlserver delphi javascript Oracle ajax wap mssql html css flash flex dreamweaver xml
 最新文章 :

Linux驱动的配置和编译脚本

  在完成了驱动程序代码的编写之后,接下来的任务就是编译。linux内核编译的过程是通过内核源码的根目录和各子目录中的Makefile分级管理的。其中根目录的Makefile是最重要的,它可以看成是其他Makefile最初的入口。它负责定义所有与体系结构无关的变量和目标,读取.config文件,并根据其信息最终生成vmlinux(elf格式的Linux内核)和modules(模块)。make通过向下递归调用子目录下的Makefile来编译这两个目标。
     通常希望把驱动程序放在内核里,在配置内核时可以自由裁剪。这需要对内核配置脚本Kbuild有一定得了解。具体可以参考内核源码中的Documentation/kbuild目录下的相关文档
    Kbuild是一组很容易使用的脚本。通常只需要关心个目录下的两个文件:Kconfig(2.6内核)和Makefile。
    以hello模块为例
    step1:代码编写
mini2440_hello_module.c 放置的位置/opt/FriendlyARM/mini2440/linux2.6.29/drivers/char
代码如下
/**********************************************************************************************/
/*文件:mini2440_hello_module.c     ......

Linux多线程编程基础

Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时
需要使用库libpthread.a。顺便说一下,Linux下pthread的实现是通过系统调用clone()来实现的。clone()是Linux
所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查看有关文档说明。下面我们展示一个最简单的多线程程序
example1.c。
/* example.c*/
#include <stdio.h>
#include <pthread.h>
void thread(void)
{
int i;
for(i=0;i<3;i++)
printf("This is a pthread.\n");
}
int main(void)
{
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *) thread,NULL);
if(ret!=0)
{
   printf ("Create pthread error!\n");
   exit (1);
}
for(i=0;i<3;i++)
   printf("This is the main process.\n");
pthread_join(id,NULL);
return (0);
}
编译:gcc -o thread1 thread1.c -lpthread
运行结果
This is the main process.
This is the main process.
This is the main process.
Th ......

linux 中的hook

相信熟悉windows编程的高手们都知道,windows为我们提供一些api,这些api用于hook 键盘,鼠标,消息等事件。windows的运行是来源于这些事件驱动的,所以一旦我们截获了这些事件,就可以篡改程序本来的功能了。
但是在Linux中,并不存在这样的api。要抓获内核中的input事件,就必须另外编辑驱动进行额外的处理。
这是以前我在工作中遇到的一个需求:在用户按下某个功能键以后,可以直接调用用户态的程序。
对应于按键,就是在内核中关于input层的处理。在最初并不了解input机制的情况下,我只想弄明白内核是怎么将input的消息传到用户态的。随着调查的不断深入,我发现了在keyboard.c中,有关于input_handle的部分。从这个线索一步步的寻找发现了,这个input_handle就是linux的 hook。
在以后的学习过程中,在阅读arm中的apm emulation时,跟其相关的apm_power.c中就是明显的hook了电源按键的事件,从而将关机消息发送到了apm的事件队列中。
所以如果注册了一个input_handler,那么就能够从input获得所有input事件,当然可以通过设置mask来获得制定类型的事件。比如,如果关心的时扫描码,那么就选择MSC的mask。一旦扫描码就是我们需要的,那么就可以触发对应的操作。
从 ......

linux性能分析工具nmon

      最近一直在做linux后台系统的测试,需要查看系统性能情况,使用过top,vmstat,iostat,sar,memstat,pmap,主要感觉就是不直观,最想有个像windows资源管理器那样的图表工具,今天发现了一个比较好的工具,ibm的免费工具nmon,可以在linux上显示很多性能指标,也可以采集数据生成文件,然后再用nmomanalyser这个工具来分析。这两个工具都是免费,ibm不提供技术支持,但是觉得功能全,对我来说够用了。
      下载nmon,http://nmon.sourceforge.net/pmwiki.php?n=Site.Download
      下载nmomanalyser,http://www.ibm.com/developerworks/wikis/display/WikiPtype/nmonanalyser?showComments=false
      nmom下载后解压的文件是可执行的二进制文件,无需在linux上进行安装,只需要在运行前修改文件的属性使其可以执行:chmod a+x nmonXXX。
      ./nmonXXX即可运行,./nmonXXX -h 显示帮助信息,在运行中按下相应的功能键即可显示相应信息,按下h显示帮助信息,更多请查看帮助命令。
       ......

我的虚拟文件系统(linux)


 
1# 发表于 2005-11-15 17:34  只看该作者
  http://www.chinaunix.net 作者:bierdaci  发表于:2004-05-25 18:59:33
不知道该不该发这里,是我从proc改来的,懂内核源码的交流交流
hello.c
[code:1:3adb123188]
#include "hello.h"
struct inode * hello_get_inode(struct super_block *, int, struct hello_dir_entry *);
/*这个函数是直接从linux复制过来的,作用就是显示目录里的文件名,没有这个
函数也行只是你用ls、dir命令看不到目录下的文件。*/
int hello_readdir(struct file * filp, void * dirent, filldir_t filldir)
{
printk("hello_readdir\n");
struct hello_dir_entry * de;
unsigned int ino;
int i;
struct inode *inode = filp-&gt;f_dentry-&gt;d_inode;
ino = inode-&gt;i_ino;
de = (struct hello_dir_entry *) inode-&gt;u.generic_ip;
if (!de)
return -EINVAL;
i = filp-&gt;f_pos;
switch (i) {
case 0:
if (filldir(dirent, ".", 1, i, ino, DT_DIR) &lt; 0)
return 0;
i++;
filp-&gt;f_pos++;
/* fall through */
cas ......

C++中的位拷贝和值拷贝

为了便于说明我们以String类为例:
首先定义String类,而并不实现其成员函数。
Class String{
public:
    String(const char *ch=NULL);//默认构造函数
    String(const String &str);//拷贝构造函数
   ~String(void);
   String &operator=(const String &str);//赋值函数
private:
   char *m_data;
};
位拷贝拷贝的是地址,而值拷贝则拷贝的是内容。如果定义两个String对象A和B。A.m_data和B.m_data分别指向一段区域,A.m_data="windows",B.m_data=“linux";
如果未重写赋值函数,将B赋给A;则编译器会默认进行位拷贝,A.m_data=B.m_data
则A.m_data和B.m_data指向同一块区域,虽然A.m_data指向的内容会改变成"linux",但是这样容易出现这些问题:
(1):A.m_data原来指向的内存区域未释放,造成内存泄露。
(2):A.m_data和B.m_data指向同一块区域,任何一方改变都会影响另一方
 (3):当对象被析构时,B.m_data被释放两次。
对于编译器,如果不主动编写拷贝函数和赋值函数,它会以“位拷贝”的方式自动生成缺省的函数。
如果重写赋值函数和拷贝构造函数后, ......
总记录数:40319; 总页数:6720; 每页6 条; 首页 上一页 [6671] [6672] [6673] [6674] 6675 [6676] [6677] [6678] [6679] [6680]  下一页 尾页
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号