摘要:
要理解,当然要从数据结构去理解以下代码来自<linux/sched.h> <asm-generic/signal.h> <linux/signal.h>。每一个process的task descriptor task_struct中跟signal有关的field:task_struct{ .... struct signal_struct *signal; struct sighand_struct *sighand; struct sigpending pending; //private pending signal for every LWP sigs 阅读全文
摘要:
poll的作用:同时探测n个drivers,找到可以直接使用的driver,从而尽量block进程。以下kernel源代码来自于:<linux/poll.h> 与 fs/select.cstatic unsigned int scull_p_poll(struct file *filp, poll_table *wait){ struct scull_pipe *dev = filp->private_data; unsigned int mask = 0; /* * The buffer is circular; it is considered full ... 阅读全文
摘要:
Surpring point: 1 _IOC_TYPECHECK的写法。2 对32位cmd定义的macro类型。介绍之前先说下32位的cmd被分为4块,不罗嗦,直接看宏便知道了。#define _IOC_NRBITS 8#define _IOC_TYPEBITS 8#define _IOC_SIZEBITS 14#define _IOC_DIRBITS 2#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)#define _IOC_SIZEMASK 阅读全文
摘要:
为了在acm中使用stl标准库,果断在写acm的时候,投靠了c++。这里总结一下cin cout scanf printf:scanf("%c", &temp); ---- 回车换行也会被当做一个字符来输入。cin >> temp ---- 回车换行不会被当做一个字符读入。printf(); cout 倒是没有那么大的区别。不过需要特殊格式输出的时候,我还是倾向于使用printf。在写程序的时候,除特殊需要,要么就将代码风格写的像c++,要么就像c。不要混。!!! 阅读全文
摘要:
1 typedef struct { volatile int counter; } atomic_t; ----- volatile意思是不要对其进行优化,这里如果不优化的话就会被汇编成直接访问内存地址,而不是操作寄存器。2 #define automic_set(v, i) (((v)->counter) = (i)) ----- 会被汇编成一条访问内存的指令。3 Atomic_add(int i, atomic_t *v)static __inline__ void atomic_add(int i, atomic_t *v){__asm__ __volatile__(LOCK & 阅读全文
摘要:
昨天看了些page的东西,开眼界了。赶紧总结记下来,可别忘了。Page Hardware Protection Scheme:在页表项中的后12位,具体可看intel documentation,这里只说比较酷的跟用户有关的几个位。User/Supervisor ------ When this flag is 0, the page can be addressed only when the CPL is less than 3 (this means, for Linux, when the processor is in Kernel Mode). When the flag is 1 阅读全文
摘要:
先声明我们根据条件可以知道皇后肯定是每行都有且只有一个所以我们创建一个数组x[t]让数组角标表示八皇后的行,用这个角标对应的数组值来确定这个皇后在这行的那一列。我们用递归来做:这问题要求皇后所在的位置必须和其他皇后的位置不在同一行、列还有 把两个皇后看成点其|斜率|=1所以我们就要写这个限定条件用一个函数来实现:函数内对没一个已经放好的皇后的位置进行判断,所以就要有个循环。我们既然是用递归来解决问题那就要把这个问题分成一个个相同的小问题来实现对吧!这小问题是什么呢,不难发现我们要在8*8的方格里放好8个皇后那我们就要知道在8(列)*7(行)是怎么放的在有我们事先写好的判断函数放好最后行就搞定了 阅读全文
摘要:
ldd3已经读了4章了。在这里思考一下,为何dev file 和 proc file的创建方式有些不同。1 dev file的书写流程:需求:需要写一个driver,在/dev目录下创建4个文件scull0, scull1, scull2, scull3.按照从整体到细节的过程如下:1 使用alloc_chrdev_region 告诉kernel我是一个驱动,需要一个设备号,kernel就会动态分配一个设备号。(参数不细说)2 为不同的设备文件申请struct scull_dev的数据结构空间,struct scull_dev中包含struct cdev元素,[看注释2]3 初始化struct 阅读全文
摘要:
#的使用方法(因为老是忘,所以记录于此):Quoting macro arguments(当字符串引用)#define QUOTEME(x) #xthe codeprintf("%s\n", QUOTEME(1+2));will expand toprintf("%s\n", "1+2");Token concatenation(Token当做字符串连接)#define MYCASE(item,id) \case id: \ item##_##id = id;\break switch(x) { MYCASE(widget,23);} 阅读全文
摘要:
/proc/* ------ 映射了kernel中的一些信息。还有进程的信息。具体请看 【鸟哥私房菜 17.4.2】daemon/etc/init.d/* ----- 启动脚本放置处。系统上几乎所有的服务启动脚本都放置在这里。/etc/sysconfig/* ----- 各服务的初始化环境配置文件。比如/etc/sysconfig/syslog /etc/sysconfig/network/etc/xinetd.conf, /etc/xinetd.d ----- super daemon配置文件/etc/* ----- 系统的主要配置文件。/var/lib/* ----- 各服务产生的数据库。 阅读全文