摘要:#pragma pack(push,1)与#pragma pack(1)的区别这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。这是给编译器用的参数设置,有关结构体字节对齐方式设置,#pragma pack是指定数据在内存中的对齐方式。#pragma pack (n) 作用:C编译器将按照n个字节对齐。#pragma pack ()作用:取消自定义字节对齐方式。#pragma pack (push,1)作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐#pragma pack(pop) 作用:恢复对齐状态因此可见,加
阅读全文
摘要:描述一下我的问题吧:在宿主机上交叉编译出来一个很简单的程序hello.c :arm-none-linux-gnueabi-gcc hello.c -o hello把hello 放到我的pandaboard 上不能运行 ./hello 出来的效果是./hello is no a directory 很无语啊然后我在宿主机上面开始静态编译arm-none-linux-gnueabi-gcc hello.c -static -o hello编出来一个很大的hello 程序,放到pandaboard上面居然能够跑起来同样我又在我的pandaboard上面用这个ubuntu 上面的gcc 自己编译一个h
阅读全文
摘要:主要参考http://blog.csdn.net/wwwxxlby520/article/details/4384224现在自己把自己的工作重复一遍吧!linux host:ubuntu 12.10cross-compile: arm-none-linux-gnueabi-gcc (4.5.2)src 下载地址为:ftp://ftp.gnu.org/gnu/libtool/ 下载libtool-15.6还需要下载jpegsrc.v6b说明 我把这两个压缩文件放在同一目录下:/libjpeg 另外安装目录设置为: /test/jpeg6在/test/jpeg6 下面建立目录:mkdir bi..
阅读全文
摘要:随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中。面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后,都将面临着同样的问题,即如何将源代码融入到 Linux 内核中,增加相应的 Linux 配置选项,并最终被编译进 Linux 内核。这就需要了解 Linux 的内核配置系统。众所周知,Linux 内核是由分布在全球的 Linux 爱好者共同开发的,Linux 内核每天都面临着许多新的变化。但是,Linux 内核的组织并没有出现混乱的现象,反而显得非常的简洁,而且具有很好的扩展性,开发人员可以很方便
阅读全文
摘要:ifeq ($(KERNELRELEASE),)KERNELDIR ?= /source/linux-2.6.8.1PWD := $(shell pwd)modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_installclean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions.PHONY: modules modules_install cleanelse
阅读全文
摘要:http://blog.csdn.net/yicao821/article/details/6783261
阅读全文
摘要:http://blog.chinaunix.net/uid-27012741-id-3305943.html
阅读全文
摘要:比较好的一个参考:http://www.cnblogs.com/myblesh/articles/2367520.html
阅读全文
摘要:http://www.cnblogs.com/myblesh/archive/2012/03/14/2396409.html 主要在于系统分配和用户自己分配的区别,另外在运行时进入内存的叫栈,而编译器编译好的直接加载到内存的是堆
阅读全文
摘要:一、 什么是ioctl。ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用如下:int ioctl(int fd, ind cmd, …);其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd的意义相关的。ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。二、 ioct
阅读全文
摘要:记得曾经看过一点国嵌的驱动开始视频:原来他们的讲义就是这个模子的 幸好没有去报什么驱动开始班 其实自己这样看下来提高的不只是知识 还有以后学习的能力As you can imagine, device number registration is just the first of many tasks that driver code must carry out. We will soon look at other important driver components, but one other digression is needed first. Most of the fun.
阅读全文
摘要:Char devices are accessed through names in the filesystem. Those names are called special files or device files or simply nodes of the filesystem tree; they are conventionally located in the /dev directory. Special files for char drivers are identified by a "c" in the first column of the o
阅读全文
摘要:The scull source implements the following devices. Each kind of device implemented by the module is referred to as a type .scull0 to scull3Four devices, each consisting of a memory area that is both global and persistent. Global means that if the device is opened multiple times, the data contained w
阅读全文
摘要:http://linux.chinaunix.net/doc/2004-10-05/16.shtml
阅读全文
摘要:译文的标题叫在用户空间做:有点难以接受A Unix programmer who's addressing kernel issues for the first time might be nervous about writing a module. Writing a user program that reads and writes directly to the device ports may be easier.Indeed, there are some arguments in favor of user-space programming, and sometim
阅读全文
摘要:Several parameters that a driver needs to know can change from system to system. These can vary from the device number to use (as we'll see in the next chapter) to numerous aspects of how the driver should operate. For example, drivers for SCSI adapters often have options controlling the use of
阅读全文
摘要:刚刚把advancing linux program 看完 ,马上又转到LDD3 上来,这大过年的,还在拼命地啃书,确实不容易啊!!实习这段时间感觉对自己的帮助还是很大,感谢PILI对我的帮助,公司的人都走得差不多了,我也是几天想回家都开始失眠了。今天就我们两个实习生在这里了,懒得折腾板子了,尽快把这本书看完吧。几天前就把LDD3的中文网页版下载了,昨天正式瞄了几眼,哎,这本书翻译得我确实不敢恭维啊,虽然个人英文水平很有限,但是译文中到处都是语法毛病,搞得我还得想着还原到英文环境中去理解,确实有点难受,既然这样还不如直接杀到英文版中实在理解有问题再回来看看译文,或许帮助更大一点!!分享下英文版
阅读全文
摘要:我们知道insmod使用公共内核符号表来解析模块中未定义的符号。公共内核符号表中包含了所有的全局内核项(即函数和变量)的地址,这是实现模块化驱动程序所必需的。当模块被装入内核后,它所导出的任何内核符号都会变成内核符号表的一部分。在通常情况下,模块只需实现自己的功能,而无需导出任何符号。但是,如果其他模块需要从某个模块中获得好处时,我们也可以导出符号。新模块可以使用由我们自己的模块导出的符号,这样,我们可以在其他模块上层叠新的模块。模块层叠技术也使用在很多主流的内核源代码中。例如msdos文件系统依赖于由fat模块导出的符号;而每个USB输入设备模块层叠在usbcore和input模块之上。Li
阅读全文
摘要:模块的建立过程与用户空间的应用程序的建立过程有显著不同; 内核是一个大的, 独立的程序, 对于它的各个部分如何组合在一起有详细的明确的要求.建立过程也与以前版本的内核的过程不同; 新的建立系统用起来更简单并且产生更正确的结果, 但是它看起来与以前非常不同. 内核建立系统是一头负责的野兽, 我们就看它一小部分. 在内核源码的 Document/kbuild 目录下发现的文件, 任何想理解表面之下的真实情况的人都要阅读一下.有几个前提, 你必须在能建立内核模块前解决. 第一个是保证你有版本足够新的编译器, 模块工具, 以及其他必要工具. 在内核文档目录下的文件Documentation/Chang
阅读全文
摘要:套接字是一个双向通信设备,可用于同一台主机上不同进程之间的通信,也可用于沟通位于不同主机的进程。套接字是本章中介绍的所有进程间通信方法中唯一允许跨主机通信的方式。Internet 程序,如Te l n e t 、rlogin 、FTP 、talk 和万维网都是基于套接字的。 例如,你可以用一个Te l n e t 程序从一台网页服务器获取一个万维网网页,因为它们都使用套接字作为网络通信方式。可以通过执行telnet www.codesourcery.com 80 连接到位于www.codesourcery.com 主机的网页服务器。魔数80 指明了连接的目标进程是运行于www.codeso..
阅读全文
摘要:管道是一个允许单向信息传递的通信设备。从管道“写入端”写入的数据可以从“读取端”读回。管道是一个串行设备;从管道中读取的数据总保持它们被写入时的顺序。一般来说,管道通常用于一个进程中两个线程之间的通信,或用于父子进程之间的通信。 在shell 中,| 符号用于创建一个管道。例如,下面的程序会使 shell 创建两个子进程,一个运行ls而一个运行less: % ls | less Shell同时还会创建一个管道,将运行 ls的子进程的标准输出连接到运行less 的子进程的标准输入。由ls输出的文件名将被按照与发送到终端时完全相同的顺序发送到less的标准输入。 管道的数据容量是有限的。如果写入.
阅读全文
摘要:映射内存提供了一种使多个进程通过一个共享文件进行通信的机制。尽管可以将映射内存想象为一个有名字的共享内存,你始终应当记住两者之间有技术层面的区别。映射内存既可以用于进程间通信,也可以作为一种访问文件内容的简单方法。 映射内存在一个文件和一块进程地址空间之间建立了联系。Linux 将文件分割成内存分页大小的块并复制到虚拟内存中,因此进程可以在自己的地址空间中直接访问文件内容。这样,进程就可以以读取普通内存空间的方法来访问文件的内容,也可以通过写入内存地址来修改文件的内容。这是一种方便的访问文件的方法。 你可以将映射内存想象成这样的操作:分配一个足够容纳整个文件内容的缓存,将全部文件内容读入缓存,
阅读全文
摘要:与用于分配、释放共享内存的shmget和shmctl类似,系统调用semget和semctl负责分配、释放信号量。调用semget函数并传递如下参数:一个用于标识信号量组的键值,该组中包含的信号量数量和与shmget所需的相同的权限位标识。该函数返回的是信号量组的标识符。你可以通过指定正确的键值来获取一个已经存在的信号量的标识符;这种情况下,传递的信号量组的容量可以为0。信号量会一直保存在系统中,甚至所有使用它们的进程都退出后也不会自动被销毁。最后一个使用信号量的进程必须明确地删除所使用的信号量组,来确保系统中不会有太多闲置的信号量组,从而导致无法创建新的信号量组。可以通过调用semctl来删
阅读全文
摘要:信号量是一个可用于同步多线程环境的计数器。摘 高级linux程序设计 完美废人译
阅读全文
摘要:#include <stdoi.h> #include <sys/shm.h> #include <sys/stat.h> int main () { int segment_id; char* shared_memory; struct shmid_ds shmbuffer; int segment_size; const int shared_segment_size = 0x6400; /* 分配一个共享内存块*/ segment_id = shmget (IPC_PRIVATE, shared_segment_size, IPC_CREAT | IP
阅读全文
摘要:调用shmctl("SHared Memory ConTroL",控制共享内存)函数会返回一个共享内存块的相关信息。同时shmctl允许程序修改这些信息。该函数的第一个参数是一个共享内存块标识。要获取一个共享内存块的相关信息,则为该函数传递 IPC_STAT 作为第二个参数,同时传递一个指向一个struct shmid_ds对象的指针作为第三个参数。要删除一个共享内存块,则应将IPC_RMID作为第二个参数,而将NULLL作为第三个参数。当最后一个绑定该共享内存块的进程与其脱离时,该共享内存块将被删除。你应当在结束使用每个共享内存块的时候都使用shmctl进行释放,以防止超
阅读全文
摘要:要让一个进程获取对一块共享内存的访问,这个进程必须先调用shmat(SHared Memory Attach,绑定到共享内存)。将shmget返回的共享内存标识符SHMID传递给这个函数作为第一个参数。该函数的第二个参数是一个指针,指向你希望用于映射该共享内存块的进程内存地址;如果你指定NULL则Linux会自动选择一个合适的地址用于映射。第三个参数是一个标志位,包含了以下选项:· SHM_RND表示第二个参数指定的地址应被向下靠拢到内存页面大小的整数倍。如果你不指定这个标志,你将不得不在调用shmat 的时候手工将共享内存块的大小按页面大小对齐。· SHM_RDONLY表
阅读全文
摘要:因为没有库连接到模块中, 源文件不应当包含通常的头文件, <stdarg.h>和非常特殊的情况是仅有的例外. 只有实际上是内核的一部分的函数才可以在内核模块里使用. 内核相关的任何东西都在头文件里声明, 这些头文件在你已建立和配置的内核源码树里; 大部分相关的头文件位于 include/linux 和 include/asm, 但是别的 include 的子目录已经添加到关联特定内核子系统的材料里了。另外一个在内核编程和应用程序编程之间的重要不同是每一个环境是如何处理错误: 在应用程序开发中段错误是无害的, 一个调试器常常用来追踪错误到源码中的问题, 而一个内核错误即使不终止整个系
阅读全文
摘要:字符设备一个字符( char ) 设备是一种可以当作一个字节流来存取的设备( 如同一个文件 ); 一个字符驱动负责实现这种行为. 这样的驱动常常至少实现 open, close, read, 和 write 系统调用. 文本控制台( /dev/console )和串口( /dev/ttyS0 及其友 )是字符设备的例子, 因为它们很好地展现了流的抽象. 字符设备通过文件系统结点来存取, 例如 /dev/tty1 和 /dev/lp0. 在一个字符设备和一个普通文件之间唯一有关的不同就是, 你经常可以在普通文件中移来移去, 但是大部分字符设备仅仅是数据通道, 你只能顺序存取.然而, 存在看起来象
阅读全文
摘要:进程管理内核负责创建和销毁进程, 并处理它们与外部世界的联系(输入和输出). 不同进程间通讯(通过信号, 管道, 或者进程间通讯原语)对整个系统功能来说是基本的, 也由内核处理. 另外, 调度器, 控制进程如何共享 CPU, 是进程管理的一部分. 更通常地, 内核的进程管理活动实现了多个进程在一个单个或者几个 CPU 之上的抽象.内存管理 计算机的内存是主要的资源, 处理它所用的策略对系统性能是至关重要的. 内核为所有进程的每一个都在有限的可用资源上建立了一个虚拟地址空间. 内核的不同部分与内存管理子系统通过一套函数调用交互, 从简单的 malloc/free 对到更多更复杂的功能.文件系统
阅读全文
摘要:5.1 Shared MemoryOne of the simplest interprocess communication methods is using shared memory.Shared memory allows two or more processes to access the same memory as if they allcalled mallocand were returned pointers to the same actual memory.When oneprocess changes the memory, all the other proces
阅读全文
摘要:*Shared memory permits processes to communicate by simply reading and writing to a specified memory location.*Mapped memory is similar to shared memory, except that it is associated with afile in the filesystem.*Pipes permit sequential communication from one process to a related process.*FIFOs are s
阅读全文
摘要:For some programs that benefit from concurrency, the decision whether to useprocesses or threads can be difficult. Here are some guidelines to help you decidewhich concurrency model best suits your program:n All threads in a program must run the same executable. A child process, on theother hand, ma
阅读全文
摘要:Deadlocks can occur when two (or more) threads are each blocked, waiting for a con-dition to occur that only the other one can cause. For instance, if thread A is blockedon a condition variable waiting for thread B to signal it, and thread B is blocked on acondition variable waiting for thread A to
阅读全文
摘要:Linux系统攻略关于vi替换命令的使用说明vi/vim 中可以使用 :s 命令来替换字符串。以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询。:s/vivian/sky/ 替换当前行第一个 vivian 为 sky:s/vivian/sky/g 替换当前行所有 vivian 为 sky:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 skyn 为数字,若 n 为 .
阅读全文
摘要:升级到Ubuntu10.04后,发现apt-get的代理设置有改变了,在9.10以前使用“http_proxy”环境变量就可以令apt-get使用代理了export http_proxy=http://127.0.0.1:8000sudo apt-get update然后在Ubuntu10.04下就无效了,看来apt-get已经被改成不使用这个环境变量了。一阵郁闷后,最后我发现在“首选项”->“网络代理”那里,多了个“System-wide”按钮(我用的是英文环境,不知道中文被翻译成怎样,关闭窗口时也会提示你),在这里设置后,apt-get确实可以使用代理了。但是我依然鄙视这种改进,因为
阅读全文
摘要:zcat ./ubuntu-12.04-preinstalled-desktop-armhf+omap4.img.gz |sudo dd bs=4M of=/dev/sde ; sudo syncSome people have reported issues with this method. If this doesn't work, try the following commands:gunzip ubuntu-12.04-preinstalled-desktop-armhf+omap4.img.gzsudo dd bs=4M if=ubuntu-12.04-preinstal
阅读全文
摘要:我们已经展示了如何在两个线程同时访问一个变量的时候利用互斥体进行保护,以及如何使用信号量实现共享的计数器。条件变量是GNU/Linux提供的第三种同步工具;利用它你可以在多线程环境下实现更复杂的条件控制。假设你要写一个永久循环的线程,每次循环的时候执行一些任务。不过这个线程循环需要被一个标志控制:只有当标志被设置的时候才运行,标志被清除的时候线程暂停。代码列表4.13显示了你可以通过在不断自旋(重复循环)以实现这一点。每次循环的时候,线程都检查这个标志是否被设置。因为有多个线程都要访问这个标志,我们使用一个互斥体保护它。这种实现虽然可能是正确的,但是效率不尽人意。当标志没有被设置的时候,线程会
阅读全文
摘要:之前的例子中,我们让几个线程从一个队列中取出并处理任务,每个线程函数都会尝试从队列中取得任务并当没有任务的时候结束线程函数。如果事先给队列中添加好任务,或者至少以比处理线程提取任务更快的速度向队列中添加新任务,这个模型没有问题。但如果工作线程速度太快了,任务列表会被清空而处理线程会退出,而再有新任务到达的时候就没有线程处理任务了。因此,我们更希望有这样一种机制:让工作线程阻塞以等待新的任务的到达。信号量可以很方便地做到这一点。信号量是一个用于协调多个线程的计数器。如互斥体一样,GNU/Linux保证对信号量的取值和赋值操作都是安全的,不会造成竞争状态。每个信号量都有一个非负整数作为计数。信号量
阅读全文
摘要:对于刚才这个任务队列竞争状态问题的解决方法就是限制在同一时间只允许一个线程访问任务队列。当一个线程开始检查任务队列的时候,其它线程应该等待直到第一个线程决定是否处理任务,并在确定要处理任务时删除了相应任务之后才能访问任务队列。要实现等待这个操作需要操作系统的支持。GNU/Linux提供了互斥体(mutex,全称UTual EXclusion locks,互斥锁)。互斥体是一种特殊的锁:同一时刻只有一个线程可以锁定它。当一个锁被某个线程锁定的时候,如果有另外一个线程尝试锁定这个互斥体,则这第二个线程会被阻塞,或者说被置于等待状态。只有当第一个线程释放了对互斥体的锁定,第二个线程才能从阻塞状态恢复
阅读全文
摘要:Unlike processes, all threads in a single program share the same address space.Thismeans that if one thread modifies a location in memory (for instance, a global vari-able), the change is visible to all other threads.This allows multiple threads to operateon the same data without the use interproces
阅读全文
摘要:Under normal circumstances, a thread terminates when it exits normally, either byreturning from its thread function or by calling pthread_exit. However, it is possiblefor a thread to request that another thread terminate.This is called canceling a thread.To cancel a thread, call pthread_cancel, pass
阅读全文
摘要:Thread attributes provide a mechanism for fine-tuning the behavior of individual threads. Recall that pthread_createaccepts an argument that is a pointer to a threadattribute object. If you pass a null pointer, the default thread attributes are used toconfigure the new thread. However, you may creat
阅读全文
摘要:#include <pthread.h>#include <stdio.h>/* Compute successive prime numbers (very inefficiently). Return theNth prime number, where N is the value pointed to by *ARG. */void* compute_prime (void* arg){int candidate = 2;int n = *((int*) arg);while (1) {int factor;int is_prime = 1;/* Test pr
阅读全文
摘要:One solution is to force mainto wait until the other two threads are done.What weneed is a function similar to waitthat waits for a thread to finish instead of a process.That function is pthread_join,which takes two arguments: the thread ID of thethread to wait for, and a pointer to a void*variable
阅读全文
摘要:We’ve seen how a program can fork a child process.The child process is initiallyrunning its parent’s program, with its parent’s virtual memory, file descriptors, and soon copied.The child process can modify its memory, close file descriptors, and the likewithout affecting its parent, and vice versa.
阅读全文
摘要:Listing 3.7 (sigchld.c) Cleaning Up Children by Handling SIGCHLD#include <signal.h>#include <string.h>#include <sys/types.h>#include <sys/wait.h>sig_atomic_t child_exit_status;void clean_up_child_process (int signal_number){/* Clean up the child process. */int status;wait (&a
阅读全文
摘要:A zombie processis a process that has terminated but has not been cleaned up yet. Itis the responsibility of the parent process to clean up its zombie children.The waitfunctions do this, too, so it’s not necessary to track whether your child process is stillexecuting before waiting for it. Suppose,
阅读全文
摘要:In fact, you should use exit codes only between zero and 127. Exit codes above 128 havea special meaning—when a process is terminated by a signal, its exit code is 128 plusthe signal number.To send a signal from a program, use the killfunction.The first parameter is the tar-get process ID.The second
阅读全文
摘要:Signalsare mechanisms for communicating with and manipulating processes in Linux.The topic of signals is a large one; here we discuss some of the most important signalsand techniques that are used for controlling processes.A signal is a special message sent to a process. Signals are asynchronous; wh
阅读全文
摘要:http://linux.chinaitlab.com/c/836989.htmlhttp://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html
阅读全文
摘要:https://www.ibm.com/developerworks/cn/linux/l-memory/
阅读全文