??xml version="1.0" encoding="utf-8" standalone="yes"?>
2008-11-30
OSDI '08上MSR发的paperQ针对ƈ发编E中难以发现的bug问题?/p>
paper的内容主要分两大块?/p>
一是如何在发现bug的时候记录下U程的运行先?thread interleaving)Q途径是在U程API和用L(fng)序多写一层wrapper functionsQ这里还有一些其他的问题Q比如只记录下了(jin)thread interleaving的话出现data race怎么解决{?/p>
另外一块内Ҏ(gu)如何遍历出给定程序运行后所能生的l果的集合,加入q个能实现的话那p把所有隐藏的bug都找出来?jin)。但是这个搜索空间很大,?
指数U的Q的一个结论就是:(x)l定一个程序有n个的U程Q所有线E共完成k条指令,那么cơ占先调度后U程的排列情冉|的复杂度?img src="http://10.132.140.73/wordpress/wp-content/cache/tex_d7c6a39b544e9306f24feffdc769cfc7.gif" class="tex" alt="k^{c}" align="absmiddle" />的,所以在实现遍历代码的时候必L效的降低k和c的倹{?/p>
System Call Optimization with the SYSENTER Instruction
by John Gulbrandsen
Windows下的
2. The SLUB allocator
slab的改q版?/p>
http://lwn.net/Articles/229984/
http://lwn.net/Articles/229096/
Christoph’s response is the SLUB allocator, a drop-in replacement for the slab code. SLUB promises better performance and scalability by dropping most of the queues and related overhead and simplifying the slab structure in general, while retaining the current slab allocator interface.
Wider use may be in the cards: the SLUB allocator is in the -mm tree now and could hit the mainline as soon as 2.6.22. The simplified code is attractive, as is the claimed 5-10% performance increase. If merged, SLUB is likely to coexist with the current slab allocator (and the SLOB allocator intended for small systems) for some time. In the longer term, the current slab code may be approaching the end of its life.
3. Compilers and More: Parallel Programming Made Easy?
http://www.hpcwire.com/features/Compilers_and_More_Parallel_Programming_Made_Easy.html
by Michael Wolfe, Compiler Engineer, The Portland Group, Inc.
4. OpenCL slides, SIGGRAPH '08
发信? jjgod (while(!asleep()) sheep++;), 信区: CSArch
标?? SIGGRAPH 08 上的 OpenCL slides
发信? 水木C (Mon Sep 15 01:32:03 2008), 站内
?来源:·水木C newsmth.net·[FROM: 125.33.176.*]
附g: munshi-opencl.pdf (1338 KB) 链接:
http://att.newsmth.net/att.php?p.272.35430.226.pdf
全文链接Q?a >http://www.newsmth.net/bbscon.php?bid=272&id=35430
5. linux-gate.so
http://www.trilithium.com/johan/2005/08/linux-gate/
linux下用sysenter的机?/p>
Linux 2.4.18的linux/linkage.h文g定义?jin)若q相关的?br />
用ENTRY(name)p定义函数?jin)。后来发现Flux OSKit中本来就提供?jin)类似功能的宏,定义在inc/asm.h中?br />使用的时候需要再写一个c语言的wrapper functionQ至?.4.18里面是这么做的)(j)
asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
Time : 2008-08-22 15:56
OS Lab 4 debugging notes [1]
pȝ调用 fork()
用Simics跟踪一条条汇编分析表映射、寄存器D真是体力zd。?/p>
1. 实现Copy On WriteӞ如果某一个用h页面有多个q程׃nQ其中一个进E修改该面旉要创Z个新的页面。一开始偶忘了(jin)把原来页面的内容复制到新的页面了(jin) =_= 另外׃新的面要代替老的面Q或者说它们的物理地址不同Q但虚拟地址相同Q我的方法是在内核态开辟一个大ؓ(f)一个页面的I间作ؓ(f)中{?/p>
2. do_fork函数中,子进E复制父q程的页表的同时?x)把父进E页表项|ؓ(f)不可写,注意最后要flush tlb。因Z开始没有flush tlbQ导致最后用hforkq回以后d的信息来自于tlbQ直接改写了(jin)׃n面中fork的返回地址Q导致切换到子进E时fork的返回地址丢失。这个bug让我郁闷?jin)两三个时。?/p>
3. 使用两次forkӞW二ơforkq回的pid?x)被?gu)。查?jin)下发现为用L(fng)间分配物理页面的代码里居然在分配好以后没有把对应的struct|ؓ(f)已用,l果DW二个子q程COW创徏新页面时得到?jin)原来的父进E页面,改写?jin)父q程面内容?br />
1. 清空表的用L(fng)间映的函数一开始写得ytsQbug到处都是Q比如free的时候没使用指向内存块首地址的指针,记录内存地址的变量没有篏加?/p>
2. exec传递给内核态的两个参数必须先在内核态保存一个副本,否则清空用户态页表后无法得到这两个参数信息?jin)?/p>
3. 分配l用h的面必须先清Ӟ一斚w考虑到安全性,另一斚w不清零会(x)隐藏一些潜在的bug。一开始我没有在内核执行exec的时候完整的复制所有的参数Q而是直接指向?jin)原q程的内存空_(d)׃清空表后再ơ申h表时得C(jin)原来的页面,l果正好原来那个保存参数的页面和新进E的该页面重合了(jin) =_= 于是费?jin)不时间在q个bug?/p>
Time : 2008-08-31 1:18
OS Lab5 debugging notes
q算利Q不q这个lab蛮无聊的Q等有空?jin)把syscallҎ(gu)cMlinux的做法,单一中断?寄存器选择syscall?/p>
1. 最花时间的一个bug是lsq回值没有改成应用程序数Q结果一开始一直以为是brkpȝ调用没写好,最后才发现问题出在q么的地方?/p>
2. brk的逻辑q不是很清楚Q尽通过?jin)简单的试Q但是debug输出的信息显Cbrk增长的很快,l常是一个页一个页涨的Q看来还得查下brk的具体行为?/p>
3. 写了(jin)个比MAGIC_BREAK好用一点的宏,因ؓ(f)用户态的E序都是按二q制d的,Simics无法得到函数信息Q函数名、当前行数等Q,利用C99的宏写了(jin)个新的INFO_BREAK
面的分配与回收使用?jin)一个叫做buddy allocator的机Ӟkernelnewbies上的解释
The memory allocation scheme used in the kernel. A vector of lists of free pages is kept, ordered by the size of the chunk (in powers of two). When a chunk is allocated, it is removed from the relevant list. When a chunk is freed back to the free pages pool, it is placed in the relevant list, starting from the top. If it is physically contiguous with a present chunk, they are merged and placed in the list above (i.e. where the chunks are twice the size), and this operation percolates up the vector. As regions are merged whenever possible, this design helps to reduce memory fragmentation.
首先在zone_struct{} 中保存了(jin)一个free_area_t数组Q这个数l记录了(jin)各种大小的空闲内存块的信息?br />include/linux/mmzone.h:
mode׃n的内存的d权限Q和chmod的参数有点像。mode低九(ji)位定义了(jin)讉K许可Q解释如下:(x)
0400 用户可读 0200用户可写 0040 l成员可读?0020 l成员可写?0004 其他用户可读 0002 其他用户可写
没有执行?0100 0010 ?0001
作者:(x)晏渭?
随着Linux2.6的发布,׃2.6内核做了(jin)新的改动Q各个设备的驱动E序在不同程度上要进行改写。ؓ(f)?jin)方便各位Linux爱好者我把自己整理的q分 文档share出来。该文当列D?.6内核同以前版本的l大多数变化Q可惜的是由于时间和_֊有限没有详细列出各个函数的用法?/p>
1?使用新的入口
必须包含 <linux/init.h>
module_init(your_init_func);
module_exit(your_exit_func);
老版本:(x)int init_module(void);
void cleanup_module(voi);
2.4中两U都可以用,对如后面的入口函C必要昄包含M头文件?/p>
2?GPL
MODULE_LICENSE("Dual BSD/GPL");
老版本:(x)MODULE_LICENSE("GPL");
3?模块参数
必须昑ּ包含<linux/moduleparam.h>
module_param(name, type, perm);
module_param_named(name, value, type, perm);
参数定义
module_param_string(name, string, len, perm);
module_param_array(name, type, num, perm);
老版本:(x)MODULE_PARM(variable,type);
MODULE_PARM_DESC(variable,type);
4?模块别名
MODULE_ALIAS("alias-name");
q是新增的,在老版本中需?etc/modules.conf配置Q现在在代码中就可以实现?/p>
5?模块计数
int try_module_get(&module);
module_put();
老版本:(x)MOD_INC_USE_COUNT ?MOD_DEC_USE_COUNT
http://www.fsl.cs.sunysb.edu/~sean/parser.cgi?modules
In 2.4 modules, the MOD_INC_USE_COUNT macro is used to prevent unloading of the module while there is an open file. The 2.6 kernel, however, knows not to unload a module that owns a character device that's currently open.
However, this requires that the module be explicit in specifying ownership of character devices, using the THIS_MODULE macro.
You also have to take out all calls to MOD_INC_USE_COUNT and MOD_DEC_USE_COUNT.
static struct file_operations fops =
{
.owner = THIS_MODULE,
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
}
The 2.6 kernel considers modules that use the deprecated facility to be unsafe, and does not permit their unloading, even with rmmod -f.
2.6,2.5的kbuild不需要到处加上MOD_INC_USE_COUNT来消除模块卸载竞争(module unload raceQ?/p>
6?W号导出
只有昄的导出符h能被其他模块使用Q默认不导出所有的W号Q不必用EXPORT_NO_SYMBOLS
老板本:(x)默认导出所有的W号Q除非用EXPORT_NO_SYMBOLS
7?内核版本(g)?
需要在多个文g中包?lt;linux/module.h>Ӟ不必定义__NO_VERSION__
老版本:(x)在多个文件中包含<linux/module.h>Ӟ除在L件外的其他文件中必须定义__NO_VERSION__Q防止版本重复定义?/p>
8?讑֤?
kdev_t被废除不可用Q新的dev_t拓展C(jin)32位,12位主讑֤P20位次讑֤受?
unsigned int iminor(struct inode *inode);
unsigned int imajor(struct inode *inode);
老版本:(x)8位主讑֤P8位次讑֤?
int MAJOR(kdev_t dev);
int MINOR(kdev_t dev);
9?内存分配头文件变?
所有的内存分配函数包含在头文g<linux/slab.h>Q而原来的<linux/malloc.h>不存?
老版本:(x)内存分配函数包含在头文g<linux/malloc.h>
10?l构体的初试?
gcc开始采用ANSI C的structl构体的初始化Ş式:(x)
static struct some_structure = {
.field1 = value,
.field2 = value,
..
};
老版本:(x)非标准的初试化Ş?
static struct some_structure = {
field1: value,
field2: value,
..
};
11?用户模式帮助?
int call_usermodehelper(char *path, char **argv, char **envp, int wait);
新增wait参数
12?request_module()
request_module("foo-device-%d", number);
老版本:(x)
char module_name[32];
printf(module_name, "foo-device-%d", number);
request_module(module_name);
13?dev_t引发的字W设备的变化
1、取L讑֤号ؓ(f)
unsigned iminor(struct inode *inode);
unsigned imajor(struct inode *inode);
2、老的register_chrdev()用法没变Q保持向后兼容,但不能访问设备号大于256的设备?
3、新的接口ؓ(f)
a)注册字符讑֤范围
int register_chrdev_region(dev_t from, unsigned count, char *name);
b)动态申请主讑֤?
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, char *name);
看了(jin)q两个函数郁闷吧^_^Q怎么和file_operationsl构联系h啊?别急!
c)包含 <linux/cdev.h>Q利用struct cdev和file_operationsq接
struct cdev *cdev_alloc(void);
void cdev_init(struct cdev *cdev, struct file_operations *fops);
int cdev_add(struct cdev *cdev, dev_t dev, unsigned count);
Q分别ؓ(f)Q申请cdevl构Q和fopsq接Q将讑֤加入到系l中Q好复杂啊!Q?
d)void cdev_del(struct cdev *cdev);
只有在cdev_add执行成功才可q行?
e)辅助函数
kobject_put(&cdev->kobj);
struct kobject *cdev_get(struct cdev *cdev);
void cdev_put(struct cdev *cdev);
q一部分变化和新增的/sys/dev有一定的兌?/p>
14?新增?proc的访问操?
<linux/seq_file.h>
以前?proc中只能得到string, seq_file操作能得到如long{多U数据?
相关函数Q?
static struct seq_operations 必须实现q个cMfile_operations得数据中得各个成员函数?
seq_printf()Q?
int seq_putc(struct seq_file *m, char c);
int seq_puts(struct seq_file *m, const char *s);
int seq_escape(struct seq_file *m, const char *s, const char *esc);
int seq_path(struct seq_file *m, struct vfsmount *mnt,
struct dentry *dentry, char *esc);
seq_open(file, &ct_seq_ops);
{等
15?底层内存分配
1?lt;linux/malloc.h>头文件改?lt;linux/slab.h>
2、分配标志GFP_BUFFER被取消,取而代之的是GFP_NOIO ?GFP_NOFS
3、新增__GFP_REPEATQ__GFP_NOFAILQ__GFP_NORETRY分配标志
4、页面分配函数alloc_pages()Qget_free_page()被包含在<linux/gfp.h>?
5、对NUMApȝ新增?jin)几个函敎ͼ?x)
a) struct page *alloc_pages_node(int node_id, unsigned int gfp_mask, unsigned int order);
b) void free_hot_page(struct page *page);
c) void free_cold_page(struct page *page);
6?新增Memory pools
<linux/mempool.h>
mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void *pool_data);
void *mempool_alloc(mempool_t *pool, int gfp_mask);
void mempool_free(void *element, mempool_t *pool);
int mempool_resize(mempool_t *pool, int new_min_nr, int gfp_mask);
16?per-CPU变量
get_cpu_var();
put_cpu_var();
void *alloc_percpu(type);
void free_percpu(const void *);
per_cpu_ptr(void *ptr, int cpu)
get_cpu_ptr(ptr)
put_cpu_ptr(ptr)
老版本?
DEFINE_PER_CPU(type, name);
EXPORT_PER_CPU_SYMBOL(name);
EXPORT_PER_CPU_SYMBOL_GPL(name);
DECLARE_PER_CPU(type, name);
DEFINE_PER_CPU(int, mypcint);
2.6内核采用?jin)可剥夺得调度方式这些宏都不安全?/p>
17?内核旉变化
1、现在的各个q_的HZ?
Alpha: 1024/1200; ARM: 100/128/200/1000; CRIS: 100; i386: 1000; IA-64: 1024; M68K: 100; M68K-nommu: 50-1000; MIPS: 100/128/1000; MIPS64: 100; PA-RISC: 100/1000; PowerPC32: 100; PowerPC64: 1000; S/390: 100; SPARC32: 100; SPARC64: 100; SuperH: 100/1000; UML: 100; v850: 24-100; x86-64: 1000.
2、由于HZ的变化,原来的jiffies计数器很快就溢出?jin),引入了(jin)新的计数器jiffies_64
3?include <linux/jiffies.h>
u64 my_time = get_jiffies_64();
4、新的时间结构增加了(jin)U秒成员变量
struct timespec current_kernel_time(void);
5、他的timer函数没变Q新?
void add_timer_on(struct timer_list *timer, int cpu);
6、新增纳U延时函数
ndelay()Q?
7、POSIX clocks 参考kernel/posix-timers.c
18?工作队列QworkqueueQ?
1、Q务队列(task queue Q接口函数都被取消,新增?jin)workqueue接口函数
struct workqueue_struct *create_workqueue(const char *name);
DECLARE_WORK(name, void (*function)(void *), void *data);
INIT_WORK(struct work_struct *work,
void (*function)(void *), void *data);
PREPARE_WORK(struct work_struct *work,
void (*function)(void *), void *data);
2、申明struct work_structl构
int queue_work(struct workqueue_struct *queue, struct work_struct *work);
int queue_delayed_work(struct workqueue_struct *queue, struct work_struct *work,
unsigned long delay);
int cancel_delayed_work(struct work_struct *work);
void flush_workqueue(struct workqueue_struct *queue);
void destroy_workqueue(struct workqueue_struct *queue);
int schedule_work(struct work_struct *work);
int schedule_delayed_work(struct work_struct *work, unsigned long delay);
19?新增创徏VFS?libfs"
libfsl创Z个新的文件系l提供了(jin)大量的API.
主要是对struct file_system_type的实现?
参考源代码Q?
drivers/hotplug/pci_hotplug_core.c
drivers/usb/core/inode.c
drivers/oprofile/oprofilefs.c
fs/ramfs/inode.c
fs/nfsd/nfsctl.c (simple_fill_super() example)
20?DMA的变?
未变化的有:(x)
void *pci_alloc_consistent(struct pci_dev *dev, size_t size, dma_addr_t *dma_handle);
void pci_free_consistent(struct pci_dev *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle);
变化的有Q?
1?void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag);
void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle);
2、列举了(jin)映射方向Q?
enum dma_data_direction {
DMA_BIDIRECTIONAL = 0,
DMA_TO_DEVICE = 1,
DMA_FROM_DEVICE = 2,
DMA_NONE = 3,
};
3、单映射
dma_addr_t dma_map_single(struct device *dev, void *addr, size_t size, enum dma_data_direction direction);
void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, enum dma_data_direction direction);
4、页面映?
dma_addr_t dma_map_page(struct device *dev, struct page *page, unsigned long offset, size_t size, enum dma_data_direction direction);
void dma_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, enum dma_data_direction direction);
5、有关scatter/gather的函敎ͼ(x)
int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction direction);
void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, enum dma_data_direction direction);
6、非一致性映(Noncoherent DMA mappingsQ?
void *dma_alloc_noncoherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag);
void dma_sync_single_range(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size,
enum dma_data_direction direction);
void dma_free_noncoherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle);
7、DAC (double address cycle)
int pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask);
void pci_dac_dma_sync_single(struct pci_dev *dev, dma64_addr_t dma_addr, size_t len, int direction);
21?互斥
新增seqlock主要用于Q?
1、少量的数据保护
2、数据比较简?没有指针)Qƈ且用频率很?
3、对不生Q何副作用的数据的讉K
4、访问时写者不被饿?
<linux/seqlock.h>
初始?
seqlock_t lock1 = SEQLOCK_UNLOCKED;
或seqlock_t lock2; seqlock_init(&lock2);
void write_seqlock(seqlock_t *sl);
void write_sequnlock(seqlock_t *sl);
int write_tryseqlock(seqlock_t *sl);
void write_seqlock_irqsave(seqlock_t *sl, long flags);
void write_sequnlock_irqrestore(seqlock_t *sl, long flags);
void write_seqlock_irq(seqlock_t *sl);
void write_sequnlock_irq(seqlock_t *sl);
void write_seqlock_bh(seqlock_t *sl);
void write_sequnlock_bh(seqlock_t *sl);
unsigned int read_seqbegin(seqlock_t *sl);
int read_seqretry(seqlock_t *sl, unsigned int iv);
unsigned int read_seqbegin_irqsave(seqlock_t *sl, long flags);
int read_seqretry_irqrestore(seqlock_t *sl, unsigned int iv, long flags);
22?内核可剥?
<linux/preempt.h>
preempt_disable()Q?
preempt_enable_no_resched()Q?
preempt_enable_noresched()Q?
preempt_check_resched()Q?/p>
23?眠和唤醒
1、原来的函数可用Q新增下列函敎ͼ(x)
prepare_to_wait_exclusive()Q?
prepare_to_wait()Q?
2、等待队列的变化
typedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int sync);
void init_waitqueue_func_entry(wait_queue_t *queue, wait_queue_func_t func);
24?新增完成事gQcompletion eventsQ?
<linux/completion.h>
init_completion(&my_comp);
void wait_for_completion(struct completion *comp);
void complete(struct completion *comp);
void complete_all(struct completion *comp);
25?RCUQRead-copy-updateQ?
rcu_read_lock();
void call_rcu(struct rcu_head *head, void (*func)(void *arg),
void *arg);
26?中断处理
1、中断处理有q回g(jin)?
IRQ_RETVAL(handled)Q?
2、cli(), sti(), save_flags(), ?restore_flags()不再有效Q应该用local_save
_flags() 或local_irq_disable()?
3、synchronize_irq()函数有改?
4、新增int can_request_irq(unsigned int irq, unsigned long flags);
5?request_irq() 和free_irq() ?<linux/sched.h>改到?<linux/interrupt.h>
27?异步I/O(AIO)
<linux/aio.h>
ssize_t (*aio_read) (struct kiocb *iocb, char __user *buffer, size_t count, loff_t pos);
ssize_t (*aio_write) (struct kiocb *iocb, const char __user *buffer, size_t count, loff_t pos);
int (*aio_fsync) (struct kiocb *, int datasync);
新增C(jin)file_operationl构中?
is_sync_kiocb(struct kiocb *iocb)Q?
int aio_complete(struct kiocb *iocb, long res, long res2);
28?|络驱动
1、struct net_device *alloc_netdev(int sizeof_priv, const char *name, void (*setup)(struct net_device *));
struct net_device *alloc_etherdev(int sizeof_priv);
2、新增NAPI(New API)
void netif_rx_schedule(struct net_device *dev);
void netif_rx_complete(struct net_device *dev);
int netif_rx_ni(struct sk_buff *skb);
(老版本ؓ(f)netif_rx())
29?USB驱动
老版本struct usb_driver取消?jin),新的l构体ؓ(f)
struct usb_class_driver {
char *name;
struct file_operations *fops;
mode_t mode;
int minor_base;
};
int usb_submit_urb(struct urb *urb, int mem_flags);
int (*probe) (struct usb_interface *intf,
const struct usb_device_id *id);
30?block I/O ?
q一部分做的改动最大。不叙?/p>
31?mmap()
int remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long to, unsigned long size, pgprot_t prot);
int io_remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long to, unsigned long size, pgprot_t prot);
struct page *(*nopage)(struct vm_area_struct *area, unsigned long address, int *type);
int (*populate)(struct vm_area_struct *area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock);
int install_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, struct page *page, pgprot_t prot);
struct page *vmalloc_to_page(void *address);
32?零拷贝块I/O(Zero-copy block I/O)
struct bio *bio_map_user(struct block_device *bdev, unsigned long uaddr, unsigned int len, int write_to_vm);
void bio_unmap_user(struct bio *bio, int write_to_vm);
int get_user_pages(struct task_struct *task, struct mm_struct *mm, unsigned long start, int len, int write, int force, struct page **pages, struct vm_area_struct **vmas);
33?高端内存操作kmaps
void *kmap_atomic(struct page *page, enum km_type type);
void kunmap_atomic(void *address, enum km_type type);
struct page *kmap_atomic_to_page(void *address);
老版本:(x)kmap() ?kunmap()?/p>
34?驱动模型
主要用于讑֤理?
1?sysfs
2?Kobjects
推荐文章Q?
http:/www-900.ibm.com/developerWorks/cn/linux/kernel/l-kernel26/index.shtml
http:/www-900.ibm.com/developerWorks/cn/linux/l-inside/index.shtml
2.6里不需要再定义“__KERNEL__”?#8220;MODULE”?jin)?
用下面的Makefile文g~译Q?/p>
代码:
obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
中断处理Q?/strong>
Interrupt in Linux
相当不错的中文资?br />
内核调度Q?/strong>
Inside the Linux scheduler
讲的是用expired/active两个数组l护的O(1)法Q大多数?.6内核的书上都?x)提到的调度?(2008-02-06)
Multiprocessing with the Completely Fair Scheduler
最新的2.6.23采用的CFSQ还没搞?(2008-02-06)
http://www.ibm.com/developerworks/cn/linux/l-cn-scheduler/index.html
Linux 调度器发展简q?(2008-02-13)
内核模块Q?br />2.6 内核中的模块注入 (2008-02-17)
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=security&Number=536404&page=0&view=collapsed&sb=5&o=31&fpart
pȝ调用Q?/strong>
Linux 2.6 新增?vsyscall pȝ服务调用机制 (2008-02-18)
http://blog.csdn.net/wishfly/archive/2005/01/23/264435.aspx
Linux on-the-fly kernel patching without LKM (2008-02-19)
http://doc.bughunter.net/rootkit-backdoor/kernel-patching.html
内存理Q?br />http://linux-mm.org/LinuxMM
Linux-mm.org is a wiki for documenting how memory management works and for coordinating new memory management development projects. (2008-02-21)
q发同步Q?/strong>
http://hi.baidu.com/charleswen/blog/item/61f3e40ebc26dcce7acbe1c8.html
Linux内核中的同步和互斥分析报?(2008-02-21)
http://www-128.ibm.com./developerworks/cn/linux/kernel/sync/index.html
Linux 2.4.x内核同步机制 (2008-02-22)
Big Picture:
http://www.linuxdriver.co.il/kernel_map
Interactive Linux kernel map (2008-02-16)
把内怸的函数相互调用做成了(jin)一张可攑֤~小的地图,单击相应函数名会(x)跌{到l(f)xr的相应代码链接?
~程资料Q?br />http://www.jegerlehner.ch/intel/
Intel Assembler CodeTable 80x86 (2008-02-21)
相关站点Q?br />http://kernelnewbies.org
Linux Kernel Newbies
http://bbs4.newsmth.net/bbsdoc.php?board=KernelTech
水木KernelTech?br />
http://www.phrack.org
Phrack is an underground ezine made by and for hackers.
有不和内核相关的hack资料