经验

目 录

  1. 经验
    1. 新手入门
    2. 一个简单程序的分析----深至内核
      1. open
      2. read
    3. lisolog文章检索
      1. index
      2. list1
      3. list2
      4. list3
      5. list4
      6. list5
    4. AKA推荐书籍
    5. linux论坛推荐资源
    6. 数据结构
    7. 重新编译
    8. 重建内核选项
    9. 调试技术
    10. ptrace进程跟踪
    11. 宏#与##
    12. lxr和glimpse
    13. 内核阅读介绍
    14. 内核重编译常见故障


经验

[目录]


新手入门

入门

    针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制;

一.核心源程序的文件组织:

    1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心。

    本文基于稳定的2.2.5源代码,第二部分的实现平台为 Redhat Linux 6.0。

    2.核心源程序的文件按树形结构进行组织,在源程序树的最上层你会看到这样一些目录:

    ●Arch :arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体系结构的子目录。PC机一般都基于此目录;

    ●Include: include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在 include/linux子目录下,与 intel cpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录;

    ●Init: 这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和Version.c,这是研究核心如何工作的一个非常好的起点。

    ●Mm :这个目录包括所有独立于 cpu 体系结构的内存管理代码,如页式存储管理内存的分配和释放等;而和体系结构相关的内存管理代码则位于arch/*/mm/,例如arch/i386/mm/Fault.c

    ●Kernel:主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在arch/*/kernel中;

    ●Drivers: 放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block 下为块设备驱动程序,比如ide(ide.c)。如果你希望查看所有可能包含文件系统的设备是如何初始化的,你可以看drivers/block/genhd.c中的device_setup()。它不仅初始化硬盘,也初始化网络,因为安装nfs文件系统的时候需要网络其他: 如, Lib放置核心的库代码; Net,核心与网络相关的代码; Ipc,这个目录包含核心的进程间通讯的代码; Fs ,所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,例如fat和ext2;

    ●Scripts, 此目录包含用于配置核心的脚本文件等。

    一般,在每个目录下,都有一个 .depend 文件和一个 Makefile 文件,这两个文件都是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件这间的联系和依托关系很有帮助;而且,在有的目录下还有Readme 文件,它是对该目录下的文件的一些说明,同样有利于我们对内核源码的理解;

二.解读实战:为你的内核增加一个系统调用

    虽然,Linux 的内核源码用树形结构组织得非常合理、科学,把功能相关联的文件都放在同一个子目录下,这样使得程序更具可读性。然而,Linux 的内核源码实在是太大而且非常复杂,即便采用了很合理的文件组织方法,在不同目录下的文件之间还是有很多的关联,分析核心的一部分代码通常会要查看其它的几个相关的文件,而且可能这些文件还不在同一个子目录下。

    体系的庞大复杂和文件之间关联的错综复杂,可能就是很多人对其望而生畏的主要原因。当然,这种令人生畏的劳动所带来的回报也是非常令人着迷的:你不仅可以从中学到很多的计算机的底层的知识(如下面将讲到的系统的引导),体会到整个操作系统体系结构的精妙和在解决某个具体细节问题时,算法的巧妙;而且更重要的是:在源码的分析过程中,你就会被一点一点地、潜移默化地专业化;甚至,只要分析十分之一的代码后,你就会深刻地体会到,什么样的代码才是一个专业的程序员写的,什么样的代码是一个业余爱好者写的。

    为了使读者能更好的体会到这一特点,下面举了一个具体的内核分析实例,希望能通过这个实例,使读者对 Linux的内核的组织有些具体的认识,从中读者也可以学到一些对内核的分析方法。

以下即为分析实例:

【一】操作平台:

硬件:cpu intel Pentium II ;

软件:Redhat Linux 6.0; 内核版本2.2.5【二】相关内核源代码分析:

    1.系统的引导和初始化:Linux 系统的引导有好几种方式:常见的有 Lilo, Loadin引导和Linux的自举引导

    (bootsect-loader),而后者所对应源程序为arch/i386/boot/bootsect.S,它为实模式的汇编程序,限于篇幅在此不做分析;无论是哪种引导方式,最后都要跳转到 arch/i386/Kernel/setup.S, setup.S主要是进行时模式下的初始化,为系统进入保护模式做准备;此后,系统执行 arch/i386/kernel/head.S (对经压缩后存放的内核要先执行 arch/i386/boot/compressed/head.S); head.S 中定义的一段汇编程序setup_idt ,它负责建立一张256项的 idt 表(Interrupt Descriptor Table),此表保存着所有自陷和中断的入口地址;其中包括系统调用总控程序 system_call 的入口地址;当然,除此之外,head.S还要做一些其他的初始化工作;

    2.系统初始化后运行的第一个内核程序asmlinkage void __init start_kernel(void) 定义在/usr/src/linux/init/main.c中,它通过调用usr/src/linux/arch/i386/kernel/traps.c 中的一个函数

    void __init trap_init(void) 把各自陷和中断服务程序的入口地址设置到 idt 表中,其中系统调用总控程序system_cal就是中断服务程序之一;void __init trap_init(void) 函数则通过调用一个宏

    set_system_gate(SYSCALL_VECTOR,&system_call); 把系统调用总控程序的入口挂在中断0x80上;

    其中SYSCALL_VECTOR是定义在 /usr/src/linux/arch/i386/kernel/irq.h中的一个常量0x80; 而 system_call 即为中断总控程序的入口地址;中断总控程序用汇编语言定义在/usr/src/linux/arch/i386/kernel/entry.S中;

    3.中断总控程序主要负责保存处理机执行系统调用前的状态,检验当前调用是否合法, 并根据系统调用向量,使处理机跳转到保存在 sys_call_table 表中的相应系统服务例程的入口; 从系统服务例程返回后恢复处理机状态退回用户程序;

    而系统调用向量则定义在/usr/src/linux/include/asm-386/unistd.h 中;sys_call_table 表定义在/usr/src/linux/arch/i386/kernel/entry.S 中; 同时在 /usr/src/linux/include/asm-386/unistd.h 中也定义了系统调用的用户编程接口;

    4.由此可见 , linux 的系统调用也象 dos 系统的 int 21h 中断服务, 它把0x80 中断作为总的入口, 然后转到保存在 sys_call_table 表中的各种中断服务例程的入口地址 , 形成各种不同的中断服务;

    由以上源代码分析可知, 要增加一个系统调用就必须在 sys_call_table 表中增加一项 , 并在其中保存好自己的系统服务例程的入口地址,然后重新编译内核,当然,系统服务例程是必不可少的。

    由此可知在此版linux内核源程序中,与系统调用相关的源程序文件就包括以下这些:

1.arch/i386/boot/bootsect.S
2.arch/i386/Kernel/setup.S
3.arch/i386/boot/compressed/head.S
4.arch/i386/kernel/head.S
5.init/main.c
6.arch/i386/kernel/traps.c
7.arch/i386/kernel/entry.S
8.arch/i386/kernel/irq.h
9.include/asm-386/unistd.h

    当然,这只是涉及到的几个主要文件。而事实上,增加系统调用真正要修改文件只有include/asm-386/unistd.h和arch/i386/kernel/entry.S两个;

【三】 对内核源码的修改:

    1.在kernel/sys.c中增加系统服务例程如下:

asmlinkage int sys_addtotal(int numdata)
{
int i=0,enddata=0;
while(i<=numdata)
enddata+=i++;
return enddata;
}

    该函数有一个 int 型入口参数 numdata , 并返回从 0 到 numdata 的累加值; 当然也可以把系统服务例程放在一个自己定义的文件或其他文件中,只是要在相应文件中作必要的说明;

    2.把 asmlinkage int sys_addtotal( int) 的入口地址加到sys_call_table表中:

    arch/i386/kernel/entry.S 中的最后几行源代码修改前为:

... ...

.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork) /* 190 */
.rept NR_syscalls-190
.long SYMBOL_NAME(sys_ni_syscall)
.endr

    修改后为:

... ...
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork) /* 190 */
/* add by I */
.long SYMBOL_NAME(sys_addtotal)
.rept NR_syscalls-191
.long SYMBOL_NAME(sys_ni_syscall)
.endr

    3. 把增加的 sys_call_table 表项所对应的向量,在include/asm-386/unistd.h 中进行必要申明,以供用户进程和其他系统进程查询或调用:

    增加后的部分 /usr/src/linux/include/asm-386/unistd.h 文件如下:

... ...

#define __NR_sendfile 187
#define __NR_getpmsg 188
#define __NR_putpmsg 189
#define __NR_vfork 190

/* add by I */

#define __NR_addtotal 191

4.测试程序(test.c)如下:

#include
#include
_syscall1(int,addtotal,int, num)

main()
{
int i,j;
  do
printf("Please input a number\n");
while(scanf("%d",&i)==EOF);
if((j=addtotal(i))==-1)
printf("Error occurred in syscall-addtotal();\n");
printf("Total from 0 to %d is %d \n",i,j);
}

    对修改后的新的内核进行编译,并引导它作为新的操作系统,运行几个程序后可以发现一切正常;在新的系统下对测试程序进行编译(*注:由于原内核并未提供此系统调用,所以只有在编译后的新内核下,此测试程序才能可能被编译通过),运行情况如下:

$gcc -o test test.c
$./test
Please input a number

36
Total from 0 to 36 is 666

    可见,修改成功;

    而且,对相关源码的进一步分析可知,在此版本的内核中,从/usr/src/linux/arch/i386/kernel/entry.S

    文件中对 sys_call_table 表的设置可以看出,有好几个系统调用的服务例程都是定义在/usr/src/linux/kernel/sys.c 中的同一个函数:

asmlinkage int sys_ni_syscall(void)
{
return -ENOSYS;
}

    例如第188项和第189项就是如此:

... ...

.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork) /* 190 */

... ...

    而这两项在文件 /usr/src/linux/include/asm-386/unistd.h 中却申明如下:

... ...
#define __NR_sendfile 187
#define __NR_getpmsg 188 /* some people actually want streams */
#define __NR_putpmsg 189 /* some people actually want streams */
#define __NR_vfork 190

    由此可见,在此版本的内核源代码中,由于asmlinkage int sys_ni_syscall(void) 函数并不进行任何操作,所以包括 getpmsg, putpmsg 在内的好几个系统调用都是不进行任何操作的,即有待扩充的空调用; 但它们却仍然占用着sys_call_table表项,估计这是设计者们为了方便扩充系统调用而安排的; 所以只需增加相应服务例程(如增加服务例程getmsg或putpmsg),就可以达到增加系统调用的作用。

[目录]


一个简单程序的分析----深至内核

                A small trail through the Linux kernel

Andries Brouwer, [email protected] 2001-01-01

A program
---------------------------------------------------------------------------------------------------
#include <unistd.h>
#include <fcntl.h>
int main(){
        int fd;
        char buf[512];

        fd = open("/dev/hda", O_RDONLY);
        if (fd >= 0)
                read(fd, buf, sizeof(buf));
        return 0;
}
---------------------------------------------------------------------------------------------------

This little program opens the block special device referring to the first IDE disk, and if the open succeeded reads the first sector. What happens in the kernel? Let us read 2.4.0 source.

[目录]


open

The open system call is found in fs/open.c:

---------------------------------------------------------------------------------------------------
int sys_open(const char *filename, int flags, int mode) {
        char *tmp = getname(filename);
        int fd = get_unused_fd();
        struct file *f = filp_open(tmp, flags, mode);
        fd_install(fd, f);
        putname(tmp);
        return fd;
}
---------------------------------------------------------------------------------------------------

The routine getname() is found in fs/namei.c. It copies the file name from user space to kernel space:

---------------------------------------------------------------------------------------------------
#define __getname()     kmem_cache_alloc(names_cachep, SLAB_KERNEL)
#define putname(name)   kmem_cache_free(names_cachep, (void *)(name))

char *getname(const char *filename) {
        char *tmp = __getname();        /* allocate some memory */
        strncpy_from_user(tmp, filename, PATH_MAX + 1);
        return tmp;
}
---------------------------------------------------------------------------------------------------

The routine get_unused_fd() is found in fs/open.c again. It returns the first unused filedescriptor:

---------------------------------------------------------------------------------------------------
int get_unused_fd(void) {
        struct files_struct *files = current->files;
        int fd = find_next_zero_bit(files->open_fds,
                                    files->max_fdset, files->next_fd);
        FD_SET(fd, files->open_fds);    /* in use now */
        files->next_fd = fd + 1;
        return fd;
}
---------------------------------------------------------------------------------------------------

Here current is the pointer to the user task struct for the currently executing task.

The routine fd_install() is found in include/linux/file.h. It just stores the information returned by filp_open()

---------------------------------------------------------------------------------------------------
void fd_install(unsigned int fd, struct file *file) {
        struct files_struct *files = current->files;
        files->fd[fd] = file;
}
---------------------------------------------------------------------------------------------------

So all the interesting work of sys_open() is done in filp_open(). This routine is found in fs/open.c:

---------------------------------------------------------------------------------------------------
struct file *filp_open(const char *filename, int flags, int mode) {
        struct nameidata nd;
        open_namei(filename, flags, mode, &nd);
        return dentry_open(nd.dentry, nd.mnt, flags);
}
---------------------------------------------------------------------------------------------------

The struct nameidata is defined in include/linux/fs.h. It is used during lookups.

---------------------------------------------------------------------------------------------------
struct nameidata {
        struct dentry *dentry;
        struct vfsmount *mnt;
        struct qstr last;
};
---------------------------------------------------------------------------------------------------

The routine open_namei() is found in fs/namei.c:

---------------------------------------------------------------------------------------------------
open_namei(const char *pathname, int flag, int mode, struct nameidata *nd) {
        if (!(flag & O_CREAT)) {
                /* The simplest case - just a plain lookup. */
                if (*pathname == '/') {
                        nd->mnt = mntget(current->fs->rootmnt);
                        nd->dentry = dget(current->fs->root);
                } else {
                        nd->mnt = mntget(current->fs->pwdmnt);
                        nd->dentry = dget(current->fs->pwd);
                }
                path_walk(pathname, nd);
                /* Check permissions etc. */
                ...
                return 0;
        }
        ...
}
---------------------------------------------------------------------------------------------------

An inode (index node) describes a file. A file can have several names (or no name at all), but it has a unique inode. A dentry (directory entry)describes a name of a file: the inode plus the pathname used to find it. Avfsmount describes the filesystem we are in.

So, essentially, the lookup part op open_namei() is found in path_walk():

---------------------------------------------------------------------------------------------------
path_walk(const char *name, struct nameidata *nd) {
        struct dentry *dentry;
        for(;;) {
                struct qstr this;
                this.name = next_part_of(name);
                this.len = length_of(this.name);
                this.hash = hash_fn(this.name);
                /* if . or .. then special, otherwise: */
                dentry = cached_lookup(nd->dentry, &this);
                if (!dentry)
                        dentry = real_lookup(nd->dentry, &this);
                nd->dentry = dentry;
                if (this_was_the_final_part)
                        return;
        }
}
---------------------------------------------------------------------------------------------------

Here the cached_lookup() tries to find the given dentry in a cache of recently used dentries. If it is not found, the real_lookup() goes to the filesystem, which probably goes to disk, and actually finds the thing.After path_walk() is done, the nd argument contains the required dentry,which in turn has the inode information on the file. Finally we do dentry_open() that initializes a file struct:

---------------------------------------------------------------------------------------------------
struct file *
dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags) {
        struct file *f = get_empty_filp();
        f->f_dentry = dentry;
        f->f_vfsmnt = mnt;
        f->f_pos = 0;
        f->f_op = dentry->d_inode->i_fop;
        ...
        return f;
}
---------------------------------------------------------------------------------------------------

So far the open. In short: walk the tree, for each component hope the information is in cache, and if not ask the file system. How does this work? Each file system type provides structs super_operations,file_operations, inode_operations, address_space_operations that contain the addresses of the routines that can do stuff. And thus

---------------------------------------------------------------------------------------------------
struct dentry *real_lookup(struct dentry *parent, struct qstr *name, int flags) {
        struct dentry *dentry = d_alloc(parent, name);
        parent->d_inode->i_op->lookup(dir, dentry);
        return dentry;
}
---------------------------------------------------------------------------------------------------

calls on the lookup routine for the specific fiilesystem, as found in the struct inode_operations in the inode of the dentry for the directory in which we do the lookup.

And this file system specific routine must read the disk data and search the directory for the file we are looking for. Good examples of file systems are minix and romfs because they are simple and small. For example,in fs/romfs/inode.c:

---------------------------------------------------------------------------------------------------
romfs_lookup(struct inode *dir, struct dentry *dentry) {
        const char *name = dentry->d_name.name;
        int len = dentry->d_name.len;
        char fsname[ROMFS_MAXFN];
        struct romfs_inode ri;
        unsigned long offset = dir->i_ino & ROMFH_MASK;
        for (;;) {
                romfs_copyfrom(dir, &ri, offset, ROMFH_SIZE);
                romfs_copyfrom(dir, fsname, offset+ROMFH_SIZE, len+1);
                if (strncmp (name, fsname, len) == 0)
                        break;
                /* next entry */
                offset = ntohl(ri.next) & ROMFH_MASK;
        }
        inode = iget(dir->i_sb, offset);
        d_add (dentry, inode);
        return 0;
}

romfs_copyfrom(struct inode *i, void *dest,
               unsigned long offset, unsigned long count) {
        struct buffer_head *bh;

        bh = bread(i->i_dev, offset>>ROMBSBITS, ROMBSIZE);
        memcpy(dest, ((char *)bh->b_data) + (offset & ROMBMASK), count);
        brelse(bh);
}
(All complications, all locking, and all error handling deleted.)
---------------------------------------------------------------------------------------------------

[目录]


read

Given a file descriptor (that keeps the inode and the file position of the file) we want to read. In fs/read_write.c we find:

---------------------------------------------------------------------------------------------------
ssize_t sys_read(unsigned int fd, char *buf, size_t count) {
        struct file *file = fget(fd);
        return file->f_op->read(file, buf, count, &file->f_pos);
}
---------------------------------------------------------------------------------------------------

That is, the read system call asks the file system to do the reading,starting at the current file position. The f_op field was filled in the dentry_open() routine above with the i_fop field of an inode.

For romfs the struct file_operations is assigned in romfs_read_inode(). For a regular file (case 2) it assigns generic_ro_fops. For a block special file (case 4) it calls init_special_inode() (see devices.c) which assigns
def_blk_fops.

How come romfs_read_inode() was ever called? When the filesystem was mounted, the routine romfs_read_super() was called, and it assigned romfs_ops to the s_op field of the superblock struct.

---------------------------------------------------------------------------------------------------
struct super_operations romfs_ops = {
        read_inode:     romfs_read_inode,
        statfs:         romfs_statfs,
};
---------------------------------------------------------------------------------------------------

And the iget() that was skipped over in the discussion above (in romfs_lookup()) finds the inode with given number ino in a cache, and if it cannot be found there creates a new inode struct by calling get_new_inode()(see fs/inode.c):

---------------------------------------------------------------------------------------------------

struct inode * iget(struct super_block *sb, unsigned long ino) {
        struct list_head * head = inode_hashtable + hash(sb,ino);
        struct inode *inode = find_inode(sb, ino, head);
        if (inode) {
                wait_on_inode(inode);
                return inode;
        }
        return get_new_inode(sb, ino, head);
}

struct inode *
get_new_inode(struct super_block *sb, unsigned long ino,
              struct list_head *head) {
        struct inode *inode = alloc_inode();
        inode->i_sb = sb;
        inode->i_dev = sb->s_dev;
        inode->i_ino = ino;
        ...
        sb->s_op->read_inode(inode);
}
---------------------------------------------------------------------------------------------------

So that is how the inode was filled, and we find that in our case (/dev/hda is a block special file) the routine that is called by sys_read is def_blk_fops.read, and inspection of block_dev.c shows that that is the routine block_read():
---------------------------------------------------------------------------------------------------

ssize_t block_read(struct file *filp, char *buf, size_t count, loff_t *ppos) {
        struct inode *inode = filp->f_dentry->d_inode;
        kdev_t dev = inode->i_rdev;
        ssize_t blocksize = blksize_size[MAJOR(dev)][MINOR(dev)];
        loff_t offset = *ppos;
        ssize_t read = 0;
        size_t left, block, blocks;
        struct buffer_head *bhreq[NBUF];
        struct buffer_head *buflist[NBUF];
        struct buffer_head **bh;

        left = count;                   /* bytes to read */
        block = offset / blocksize;     /* first block */
        offset &= (blocksize-1);    /* starting offset in block */
        blocks = (left + offset + blocksize - 1) / blocksize;

        bh = buflist;
        do {
                while (blocks) {
                        --blocks;
                        *bh = getblk(dev, block++, blocksize);
                        if (*bh && !buffer_uptodate(*bh))
                                bhreq[bhrequest++] = *bh;
                }
                if (bhrequest)
                        ll_rw_block(READ, bhrequest, bhreq);
                /* wait for I/O to complete,
                   copy result to user space,
                   increment read and *ppos, decrement left */
        } while (left > 0);
        return read;
}
---------------------------------------------------------------------------------------------------

So the building blocks here are getblk(), ll_rw_block(), and wait_on_buffer().

The first of these lives in fs/buffer.c. It finds the buffer that already contains the required data if we are lucky, and otherwise a buffer that is going to be used.

---------------------------------------------------------------------------------------------------
struct buffer_head * getblk(kdev_t dev, int block, int size) {
        struct buffer_head *bh;
        int isize;

try_again:
        bh = __get_hash_table(dev, block, size);
        if (bh)
                return bh;
        isize = BUFSIZE_INDEX(size);
        bh = free_list[isize].list;
        if (bh) {
                __remove_from_free_list(bh);
                init_buffer(bh);
                bh->b_dev = dev;
                bh->b_blocknr = block;
                ...
                return bh;
        }
        refill_freelist(size);
        goto try_again;
}
---------------------------------------------------------------------------------------------------

The real I/O is started by ll_rw_block(). It lives in drivers/block/ll_rw_blk.c.

---------------------------------------------------------------------------------------------------
ll_rw_block(int rw, int nr, struct buffer_head * bhs[]) {
        int i;

        for (i = 0; i < nr; i++) {
                struct buffer_head *bh = bhs[i];

                bh->b_end_io = end_buffer_io_sync;

                submit_bh(rw, bh);
        }
}
---------------------------------------------------------------------------------------------------

Here bh->b_end_io specifies what to do when I/O is finished. In this case:

---------------------------------------------------------------------------------------------------
end_buffer_io_sync(struct buffer_head *bh, int uptodate) {
        mark_buffer_uptodate(bh, uptodate);
        unlock_buffer(bh);
}
---------------------------------------------------------------------------------------------------

So, ll_rw_block() just feeds the requests it gets one by one to submit_bh():

---------------------------------------------------------------------------------------------------
submit_bh(int rw, struct buffer_head *bh) {
        bh->b_rdev = bh->b_dev;
        bh->b_rsector = bh->b_blocknr * (bh->b_size >> 9);

        generic_make_request(rw, bh);
}
---------------------------------------------------------------------------------------------------

So, submit_bh() just passes things along to generic_make_request(), the routine to send I/O requests to block devices:

---------------------------------------------------------------------------------------------------
generic_make_request (int rw, struct buffer_head *bh) {
        request_queue_t *q;

        q = blk_get_queue(bh->b_rdev);
        q->make_request_fn(q, rw, bh);
}
---------------------------------------------------------------------------------------------------

Thus, it finds the right queue and calls the request function for that queue.

---------------------------------------------------------------------------------------------------
struct blk_dev_struct {
        request_queue_t         request_queue;
        queue_proc              *queue;
        void                    *data;
} blk_dev[MAX_BLKDEV];

request_queue_t *blk_get_queue(kdev_t dev)
{
        return blk_dev[MAJOR(dev)].queue(dev);
}
---------------------------------------------------------------------------------------------------

In our case (/dev/hda), the blk_dev struct was filled by hwif_init (from drivers/ide/ide-probe.c):
and this ide_get_queue() is found in drivers/ide/ide.c:

---------------------------------------------------------------------------------------------------
blk_dev[hwif->major].data = hwif;
        blk_dev[hwif->major].queue = ide_get_queue;

#define DEVICE_NR(dev)       (MINOR(dev) >> PARTN_BITS)

request_queue_t *ide_get_queue (kdev_t dev) {
        ide_hwif_t *hwif = (ide_hwif_t *) blk_dev[MAJOR(dev)].data;
        return &hwif->drives[DEVICE_NR(dev) & 1].queue;
}
---------------------------------------------------------------------------------------------------

This .queue field was filled by ide_init_queue():
And blk_init_queue() (from ll_rw_blk.c again):

---------------------------------------------------------------------------------------------------
ide_init_queue(ide_drive_t *drive) {
        request_queue_t *q = &drive->queue;

        q->queuedata = HWGROUP(drive);
        blk_init_queue(q, do_ide_request);
}

blk_init_queue(request_queue_t *q, request_fn_proc *rfn) {
        ...
        q->request_fn           = rfn;
        q->make_request_fn      = __make_request;
        q->merge_requests_fn    = ll_merge_requests_fn;
        ...
}
---------------------------------------------------------------------------------------------------

Aha, so we found the q->make_request_fn. Here it is:

---------------------------------------------------------------------------------------------------
       __make_request(request_queue_t *q, int rw, struct buffer_head *bh) {
               /* try to merge request with adjacent ones */
               ...
               /* get a struct request and fill it with device, start,length, ... */
               ...
               add_request(q, req, insert_here);
               if (!q->plugged)
                       q->request_fn(q);
       }

       add_request(request_queue_t *q, struct request *req,
                   struct list_head *insert_here) {
               list_add(&req->queue, insert_here);
       }

---------------------------------------------------------------------------------------------------

When the request has been queued, q->request_fn is called. What is that? We can see it above - it is do_ide_request() and lives in ide.c.

---------------------------------------------------------------------------------------------------

       do_ide_request(request_queue_t *q) {
               ide_do_request(q->queuedata, 0);
       }

       ide_do_request(ide_hwgroup_t *hwgroup, int masked_irq) {
               ide_startstop_t startstop;

               while (!hwgroup->busy) {
                       hwgroup->busy = 1;
                       drive = choose_drive(hwgroup);
                       startstop = start_request(drive);
                       if (startstop == ide_stopped)
                               hwgroup->busy = 0;
               }
       }

       ide_startstop_t
       start_request (ide_drive_t *drive) {
               unsigned long block, blockend;
               struct request *rq;

               rq = blkdev_entry_next_request(&drive->queue.queue_head);
               block = rq->sector;
               block += drive->part[minor & PARTN_MASK].start_sect;
               SELECT_DRIVE(hwif, drive);
               return (DRIVER(drive)->do_request(drive, rq, block));
       }
---------------------------------------------------------------------------------------------------

So, in the case of a partitioned disk it is only at this very low level that we add in the starting sector of the partition in order to get an absolute sector.
The first actual port access happened already:

---------------------------------------------------------------------------------------------------
       #define SELECT_DRIVE(hwif,drive) \
               OUT_BYTE((drive)->select.all,
hwif->io_ports[IDE_SELECT_OFFSET]);
---------------------------------------------------------------------------------------------------

but this do_request function must do the rest. For a disk it is defined in ide-disk.c, in the ide_driver_t idedisk_driver, and the function turns out to be do_rw_disk().

---------------------------------------------------------------------------------------------------
       ide_startstop_t
       do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long
block) {
               if (IDE_CONTROL_REG)
                       OUT_BYTE(drive->ctl,IDE_CONTROL_REG);
               OUT_BYTE(rq->nr_sectors,IDE_NSECTOR_REG);
               if (drive->select.b.lba) {
                       OUT_BYTE(block,IDE_SECTOR_REG);
                       OUT_BYTE(block>>=8,IDE_LCYL_REG);
                       OUT_BYTE(block>>=8,IDE_HCYL_REG);

OUT_BYTE(((block>>8)&0x0f)|drive->select.all,IDE_SELECT_REG);
               } else {
                       unsigned int sect,head,cyl,track;
                       track = block / drive->sect;
                       sect  = block % drive->sect + 1;
                       OUT_BYTE(sect,IDE_SECTOR_REG);
                       head  = track % drive->head;
                       cyl   = track / drive->head;
                       OUT_BYTE(cyl,IDE_LCYL_REG);
                       OUT_BYTE(cyl>>8,IDE_HCYL_REG);
                       OUT_BYTE(head|drive->select.all,IDE_SELECT_REG);
               }
               if (rq->cmd == READ) {
                       ide_set_handler(drive, &read_intr, WAIT_CMD, NULL);
                       OUT_BYTE(WIN_READ, IDE_COMMAND_REG);
                       return ide_started;
               }
               ...
       }
---------------------------------------------------------------------------------------------------

This fills the remaining control registers of the interface and starts the actual I/O. Now ide_set_handler() sets up read_intr() to be called when we get an interrupt. This calls ide_end_request() when a request is done, which calls
end_that_request_first() (which calls bh->b_end_io() as promised earlier) and end_that_request_last() which calls
blkdev_release_request() which wakes up whoever waited for the block.


[目录]


lisolog文章检索

[目录]


index


索引的内容:
我比较喜欢的帖子. 和精华收藏多有冲突.


索引的使用:
支持分类, 从这里找帖子, 然后分类,要比在论坛里搜索方便. 有这一点作用, 也不枉我遍历一次论坛.( 折叠起来看,不然太乱了)



索引的更新:
我们记录了索引更新的时间. 下一次更新时, 比方说一个月后, 只需选择显示一个月内发表的文章. 这样就不会丢掉文章. 但是,有可能重复, 因为新的回应会使帖子位置前移.这个问题这样解决:凡是我收集的文章统统加入我的收藏夹, 这样,更新时我只向索引里加入那些可以加入我的收藏夹的文章.



索引的局限:
水平有限, 不免错漏. 我尽力保留有价值的帖子. 不敢说没有在索引中的帖子就没有价值.但我一直在努力.

编辑者: hyl (07/12/02 13:56)

[目录]


list1


关于faq----征求建议和合作者

请教linux内核版本2.0.35的进程切换

诚征版主,祝内核版越办越好!

编译内核时有很多东东不明白什么含义,哪位知道什么地方可以找到比较全面的资料

高手是怎么编译内核的啊?

编译内核之一

编译内核之三

编译内核之四

编译内核之五

编译内核之六(后记)

大家对NeXT,BeOS,Darwin这些变种如何看待,似乎国内很少有人谈及?

编译内核之二

提问:the STRUCTURE of Linux?

编译内核时,在哪部分把PCMIA卡编译掉?

微内核?进程调度?

linux的非微内核一直受竞争对手的非议,请问未来linux的发展在这方面有什么计划?(null)

一点题外话

书上说段页式内存管理是最好的内存管理方式,但LINUX的内存管理使用的是页式,为什莫?

1f是指什么,好象并没有1f的标签

编译内核是否只是简单的make config,若不是,请给我详细步骤。

那位大侠知道如何记录通过ipchains网关的数据报

要怎样建立放火墙

模块程序却出错如下:invalid parameter parm_a

块设备驱动程序的注册似乎都是通过调用register_blkdev(),

调用了netif_rx 函数。

请问tunable parameter

关于进程数

如何编写自己的设备驱动程序,又如何在C语言中调用

where the kernel start? why I can not find the function 'main()'?

请问可不可以在Linux下改网卡的硬件地址(将每个发送出去的数据包的硬件地址改为特定的值)?

编译的时候他说我的最后一行:missing seprator

lilo怎么改?image=? initrd

init在哪儿

__asm__是干什么的?

编译setup.S为什么有一大堆错误

想让内核将printk输出到messages文件

get_current(void)

在内核态,进程如何访问用户态空间的数据?

Bug大侠,该如何研究Linux的源代码

head.s中调用setup_paging时,内存0x1000起开始的几页全被清零,岂不是将内核代码head.s部分覆盖了,这是怎么回事?

内核首先读入内存0x10000处,但后又移至0x1000处,这样岂不是与内核页目录swapper_pg_dir地址冲突吗

inw()/outw()、inl()/outl(),其中b、w、l各是什么意思

如何安装3块网卡,每个网卡在一个网段

要写一个PCI卡(自制的)driver

加载modules时就提示有些目标文件中存在unresolved simbol

linux -- driver的编写 -- file_operations

装载lilo时会显示:“LILO:”,请问如何改变这个显示

关于BluePoint2.0的几个烂点:

include头文件modversions.h时,一般用什么条件?为什么我用的时候它总是和#include asm/uaccess.h冲突

用insmod装载模块时,出现了unresolved symbol

Linux的整体式结构决定了其内核的高效性

我用命令 mount -t vfat /dev/hda1 /mnt/c 发现,我的linux好象,不支持vfat

如何查看当前内核的配置参数

我们也做嵌入式,欢迎一起创业

kmalloc(),返回的地址不用设置页表,而vmalloc()需要。 这说明什么

__get_free_pages()返回的是物理地址还是虚拟地址

分析do_fork chldreg指针的赋值的问题小弟感觉很糊涂

linux -- driver -- __put_user

linux -- driver -- ioctl

How can I do a Linux Boot/Root Disk

编写驱动程序时,需要将硬件的物理地址为虚地址. LINUX内核如何保证这种影射对每个进程都是有效的.

如何在Windows或者DOS下编译内核

内核过程所允许使用的堆栈空间有多大

system.map到底有什么用

想利用时钟中断,想自己加入一些代码形成自己的中断服务程序.

用signal 的确可以做当异步地运行某个函数, 信号是否是以中断的形式运行的

起动盘为什么mount不上去

看不出head.s是如何调用start_kernal()函数的

start_kernel()中我怎么没有发现初始化网络部分的函数

head.s究竟是怎样调用start_kernel()函数的呢

Linux是不是对中断控制器重新编程过了

系统初始化

阅读setup.S原程序时,对下面进入保护模式程序段有点不理解

kernel_thread()是用来产生init进程的,然后由init全权处理进程,它怎么会初始化网络呢

段描述符高速缓存寄存器和描述符投影寄存器有什么区别

段描述符中有一位p用来区分此段是否在内存中,问题是若一段中部分叶在内存,部分不在内存,此位如何赋值

如何有效阅读内核代码?

init 进程启动之后,所有其他进程就由INIT进程全权处理。这时可以说系统内核已经完全启动起来吗?

在head.s-->start_kernel()-->启动init这个过程我还没有发现内核调用调度函数

能不能将内核的地址空间动态映射到用户空间的0xc0000000-0xffffffff 上去

已分配并不再使用的堆栈页面是对换到交换空间中还是直接被系统回收

Why I can't boot linux form fd(volume 1.722M) but fd(volume 1.44) can do?

调入系统模块到0x1000:0处时,为虾米还要判断es为64k对齐 为什么还要调用kill_motor

Pentium CPU CR0中的WP位是干什么用的?

CPU从用户的特权级3进入到内核的特权级0,请问这时是CPU如何完成这个中断指令的?

setup.S的bootsect_helper程序时,对于bios的15h中断的87号移低端内存到高端内存的参数有点不明白

do_mmap()函数 off&~PAGE_MASK的含义是什么?mm->map_count 是何含义?mm->locked_vm不是被锁定的vm的个数吗?

Oops是什么意思

为什么要去分析内核 我是菜鸟,但我是鹰的后代

setup.S中为什么需要置A20线

setup.S中移动剩余setup代码区的一个问题

那么当系统物理内存为最大值4G时,内核似乎只能管理它自已地址空间中的1G? 应用程序0-0x8048000有何作用?

pmd是指什麽

vfork的原意是什么

东东太多,我不知从哪下手!

8295A的断口号是怎么分配的

一篇ELF格式的详细说明

SYMBOL_NAME(...)和__asm__volatile(...)的功能是什么呢?

Linux中,局部描述符表LDT有何用呢?

__pa(x)是干什么用的

内核不使用虚拟内存,但是却把0xc0000000-4g的地址做为内核保留地址,这是怎么一会事

vmalloc分配的内存能否被swap out

ping的源代码

MEM_ALT_K是什么

__volatile__是什么功能

将一个极小的GUI机制引入内核可否?

Linux console font operation

在共享库定义共享段

Linux交换内存的一个缺陷

do_page_fault部分时,对里边提及的Pentium cpu缺陷(f00fc7c8冻结指令)很迷惑

解读vmlinux.lds.S

fixmap_init()函数是用来干虾米的?

lcall7 读trap_init()

paging_init()中的end_mem = (end_mem + ~mask) & mask;

static定义的变量放于哪个段

_edata和_end在哪儿定义

如何往内核加载模块

勇敢地蜕去你的陈年旧皮!

do_IRQ()中断号错误码的正负问题

build_irq"#"前缀

编译内核VFS:can't open root device 08:0a

mem_map结构数组中每个页面的age值是在什么时候更新的

GCC为2.96版,这是个非稳定的版本

说说用户进程的页面切换

kernel_threadregs.esp由从何而来呢?

Too many open files"问题

3g的虚拟内存到物理内存的映射是否都在task_struct中

为什么要有8M的隔离带?

为何总是报错VFS:unable to mount root fs on 08:01?

\linux\kernel\init\main.c开始的部分其偏移地址是否都被编译为从大于3G开始

lds定义了内核映象所有符号从PAGE_OFFSET(3G)处开始编址

Linux目前的体系只能管理2G物理内存?

编译好的内核为什么要要经过压缩?

系统状态保存在当前进程任务结构和内核堆栈中。进程间的切换点都在schedule()中

setup_arch()函数是如何得到命令行参数的

进程数据结构页面是如何保证不被换出内存的?

问_end的定义

mount和insmod一个模块的区别?网卡的混杂模式是什么意思?

mmap用于进程间文件共享,SYSV IPC用于进程间内存共享

当当前进程current的调度策略是FIFO时,其时间片current.counter为何没有重新赋值

加载模块时,想给参数赋值

开机后不要人干与就直接可起动我的应用

FIFO策略进程的时间片(counter)没有重新赋值

如何使linux进程的堆栈是不可运行的?

可重入 和 ret_from_intr

FIFO的进程其时间片在schedule()中被忽视而没有重新赋值.请问这是否会导致它被频繁的重新调度呢?

推荐内核分析风格

__asm__ __volitile__

我的看法

如何编程接收ppp0上的裸IP包?

PS/2鼠标工作原理和硬件编程的技术资料

请教如何读linux的Kernel

模块的版本相关性指什么?

当物理内存超过3G时就管理不了?

lcall7的入口处比system_call多压栈了一项pushfl

原代码看的工具lxr是怎么用的?

调用_free_page()后,该内存页真的被释放了吗

free_area_init()中bitmap_size 是否有问题?

对try_to_swap_out()的一点改进

Where is file for mapping kernel virtual address

有没有关于gunzip()的解压算法

gunzip()函数在解压缩piggy.o(真正的内核)时,是如何定位或寻址到piggy.o的内存地址的呢

堆中内存是如何分配的

这里的set_pte使我很疑惑,为什么用的不是物理地址,而是加上0xC0000000的虚拟地址呢

编译时决定virtual address吗?

boot.S, setup.S ... is running with real-mode?Need not mmu settings?

idle是内核线程,init线程已转变为普通进程

a paper about debugger

由于ELF中允许用.section自定义段

trampoline乱谈

SMP不太熟悉,有几个入门性的问题

如何在内核中获得键盘和鼠标的消息

引用内核中变量求助 EXPORT_SYMBOL()宏添加相应内核符号

outb_p :where define?what does "%w1" mean ?

Linux太难学了

读kmem_cache_estimate ()这个函数

kmem_cache_estimate 中的 L1_CACHE_ALIGN

slab分配器的设计思想

page aligned 是什么意思

用nice等命令设定的进程优先级有什么确切的含义

模块中的全局符号自动添加到系统符号表中,模块中不能使用EXPORT_SYMBOL(), 可用EXPORT

在内核态与用户态转变时,地址映射是相同的,堆栈区域不同

linux核心程序中怎样打开设备呢

怎样调试内核???gdb行吗?

硬件内存在系统内存空间中的映射问题

和malloc,calloc一样,一般是用sbrk系统调用实现的

Linux头文件中定义了进行串操作的函数,驱动程序可以使用它们来获得比C语言写的循环更好的性能

readahead使用的各个变量的意义

About kernel stack

section __ex_table,"a"和.previous 以及.fixed

请教各位如何使用SYSCTL的问题

System Call is a limitation??

About GET_CURRENT

Linux的TCP/IP协议栈阅读笔记(1)

Linux的TCP/IP协议栈阅读笔记(2)

Linux的TCP/IP协议栈阅读笔记(3)

Linux的TCP/IP协议栈阅读笔记(4)

Linux的TCP/IP协议栈阅读笔记(5)

Linux的TCP/IP协议栈阅读笔记(6)

Linux的TCP/IP协议栈阅读笔记(7)

About the Linux Kernel Analysis Book

Linux的TCP/IP协议栈阅读笔记(8)

请大虾们推柬一下读核工具

请问内核2.4版本的zone分配器的设计思想

可否在内核中进行截短文件操作?

在模块中调用系统调用

请问怎样正确查找函数原型?

MTRR是什么?

Linux-2.4.0网络部分改变

About multiple txt segment in an elf

建议阅读linux device drivers

模块化编程可否替换所有的系统调用

How to release a Module by itself ?

Linux设备驱动程序勘误表(部分)

内核中替代realloc()函数 的具体实现方法

什么是NR?

MAP_FIXED是什么固定映射?

正交持续性 自反系统

为何要保存flags? 只用cli()和sti()不可以么?

如何写直接读写硬盘的驱动程序

这种kmalloc,优先级参数应为GFP_AUTOMIC?

因为"Hello,World"在内核段中,使用段超越试试看

##是文本连接运算符

详细介绍slab的linux实现的文章连接

Linux防火墙程序设计

编译内核后,一定要重新链接System.map到新的System.map吗?

tty 到底是谁的abbreviation

Linux 模块调度问题和抢占

about EXPORT_SYMBOL

什么叫映象文件

mm/memory.c和mm/vmalloc.c各负责什么功能

怎样把自行编写的设备驱动程序添加到Linux核心中

谁知道netstat下的TIME_WAIT如何产生和避免

内核代码中经常使用固定数组而不是链表是为了编程简单?

用ioperm申请要存取的端口范围的访问权

TIME_WAIT状态有什么用

要先包含<linux/module.h> <linux/kernel.h>然后sleep_on_interruptible_timeout就正常了,不会崩掉了

函数init()的最后执行了 execve()函数,为什么内核代码没有被execve()所创建的新进程覆盖掉

dput()和dget()

个时间片大小是固定的吗?

kmem_cache_grow()开头的一串标志检测也让我不理解
[目录]


list2



Shaper是一个限制网络速率的虚拟网络设备

jmpi go,INITSEG 是什么意思?

关于进程的flag,以及调度的一些概念

为何在 console_init()之后还不能打开/dev/console呀

do_wp_page

内存管理--end_mem解读

Unable to handle kernel paging request at virtual address...是从哪个模块报出来的?

按照原来配置重新编译2.4.0,重启后,屏幕显示:Uncompressing Linux ...Ok,booting the kernel.后就死机了

如何研究内核

有关kdev_t结构与次设备号的问题?

内存管理--free_area结构解读

内核地址手工转换,多是在填写页表时用到

进程管理--在时钟中断处理中为什么没有调用schedule函数

内存管理--memmap解读

请教Gcc源码的阅读问题

Unable to handle kernel paging request at virtual address....

Linux源代码讨论专用线索

我所看到的switch过程以及我的理解

我实现了一个进程切换方法

VFS: can't mount root filessystem . 这是怎么回事儿

内核栈

head.s中的LGDT装入gdt_descr处的内容...

内核空间在0xc0000000之上,但是如何使内核程序中访问的变量等的线形地址能够达到这个范围之上呢(因为段描述符的基地址是0),这是怎么做到的?(lds?)

汇编语言的语法

增加系统调用

块设备驱动,DMA内存,IDE硬盘的预读

traceroute的问题

在用户空间编写驱动程序

内核中的高端内存选项是怎么回事

在内核空间访问用户空间的问题

在地址0000开始的作了个中断向量表,这个是bios引导后实现的,还是dos获得系统控制权利后才做的事情??

中国的操作系统为什么停滞不前

在文件系统中struct dentry 是用来描述什么?

在x86平台上,io空间跟内存空间是分别编址的吗

Heap and Internal Fragmentation

文档最新动向 3月5日

/dev/ram,/dev/tty1等等,这些i节点是如何被创建的

消息可以代替信号?

About brk value, malloc, and heap

About contigeous virtual memory

About brk explaination from book.

在linux中,是怎么实现动态连接库的共享?地址和重入

raw disk I/O 的资料

todo & 遗留问题 & 计划介绍

一些资源

专题认领

源代码学习专题认领

编译过多次,但还是有些问题不能理解

外部中断的驱动怎么知道自己的3.硬件产生哪个中断?

对bottom half概念的一点理解

进程切换的时机


http://www.xfree86.org/
ftp://metalab.unc.edu/
http://www.xfree.org/FAQ/
http://www.xfree.org/#resources/
http://www.kde.org/
http://www.qt.org/
http://www.gnome.org/
http://www.gtk.org/
http://www.enlightenment.org/
http://www.opengroup.org/openmotif/
http://www.lesstif.org/
http://www.windowmaker.org/
http://www.gnustep.org/
http://www.itresearch.com/
ftp://ftp.funet.fi/pub/Linux/PEOPLE/Linus/SillySounds/
http://members.xoom.com/gnulix_guy/geek-gourmet/
http://www.csustan.edu/bazaar/


init process

在理解linux虚存的时候,我确总有些绕不过来

希望解决:3.硬件产生哪个中断的判别问题

Makefile 初探

所有的进程都公用_LDT(0)?

BUILD_IRQ宏

虚存难绕

Makefile解读之二

进程陷入内核时CR3的内容会改变吗?如果不变,如何存取内核空间呢?

barrier()的作用

Makefile解读之三: 模块的版本化处理

LDT:有点眉目了

系统调用流程

LINUX的系统内核空间的保护

Makefile解读之四: Rules.make的注释

HELP! printk() does not work in device module

as86汇编语言的语法说明

中断嵌套的问题

问题犹在:BUILD_COMMON_IRQ的宏展开

中断的部分代码解读

内核初起时如何从核心态进入用户态?

ASM格式简介

增加系统调用时的问题,虽已解决,但有的地方不太明白。

8259A的工作原理

Linux下的jiffies是10ms吗?

fork进程的学习

netfilter.c剖析1

getpid()

netfilter各个HOOK的关系

分析sockfs套接字文件系统

netfilter剖析2

backlog field in sock struct

所有进程在内核态的地址空间是一致的,可以相互访问的么

外设中的目录项(以EXT2为例)和内存中的"目录项"的比较

关于文件系统的安装与访问

Kernel 2.4中bottom half好象已经演化到soft-interrupt了

从系统调用open看源码

分析内核对gzip压缩文件进行解压的方法

sock 中zapped成员表示什

ip_tables.h分析

initrd 是干什么用的?

内核对以太网设备的探测过程

ISA网卡驱动程序的探测过程

sock结构的链接问题

read_lock()和write_lock()的过程描述如下

UNIX系统技术内幕》的第七章,介绍了自旋锁,看不懂他的改进

ISA网卡驱动程序发送和接收过程

EXT2的超级块与组描述符

新兵笔记--ULK(C2) beta版 Segmentation in Linux

网络包的排队发送过程

Linux secret.... (maybe)[Cross post]

Export了怎么还是无法resolve?

新兵笔记--ULK(Understanding the Linux Kernel) 序

关于netfilter的一点问题

ip_tables.c中组织规则的方式

内核打印的限速函数 net_ratelimit()

Confirm SA_INTERRUPT

trap和中断有什么不同啊

假如我要把PLT映射到内存的低端

Linux的硬件地址解析过程

inode和block之间有什么联系和区别

ip_tables.c的防火墙规则处理

内核堆栈与GET_CURRENT

根文件系统指的是哪个? 如何安装?

进程映象的过约束方法(overcommit_memory)

新兵笔记--ULK(C2) beta版 Paging in Hardware

ip_tables.c中防火墙规则环的检测

建立双向链表的一种常见方法

将root文件系统也放在一张软盘上

伙伴(buddy)算法的页面释放过程

ERR_PTR PTR_ERR(ptr) IS_ERR(ptr)

路由缓冲表的基本结构

IP包的接收过程

ip_tables.c的面向应用程序的接口

关于目录文件对象操作的一致性问题

IP包碎片重组过程

缓冲区管理与块设备

IP包的本地分发过程

vm_struct vs. vm_area_struct

从一个函数返回时,做什么?

套接字的基本结构

AT&T汇编与Intel汇编的比较1

AT&T汇编与Intel汇编比较2

设备驱动几个数据结构关系

对数据报套接字文件的select过程

MODULE_PARM(var,type)的功能是什么

EXT2:超级块----外部结构

EXT2:超级块----读入

EXT2:组描述符----外部结构

EXT2:组描述符----读入

EXT2:组描述符----查找

EXT2:inode位图----外部结构

EXT2:inode位图----读入

EXT2:概述

新兵笔记--ULK(C2) Paging in Linux

EXT2:inode----外部结构

EXT2:inode----查询与读入

EXT2:inode----分配

包缓冲区操作的几个内嵌函数

包队列操作的一些内嵌函数(续)

About init_mm and processes' mm

包缓冲的分配操作

信号处理问题

ip_tables.c的各个注册函数解释

execve的疑问

FD_SETSIZE问题,我补充了一点说明

get_user的使用

AT&T汇编语言的帮助文件

扩展的行内汇编手册

IP包的生成和发送接口

Linux网络接口层分析(之一):netif_rx

Kernel Hacking

open系统调用中对用户指针的检测

movl $pg0-_PAGE_OFFSET,%edi 其中的$pg0-_PAGE_OFFSET是什么意思?

关于Linux的路由

Segments are as follows:ds=es=ss=cs-INITSEG?

__get_free_pages()和free_pages()是最低层的内存分配和释放函数

新兵笔记--ULK(C3) Process Switching

EXT2:块----外部结构
[目录]


list3



LOOPBACK网络回送设备

网络设备的IP地址结构

pci_bios_find_device

网络过滤器的基本结构

表驱动IP过滤器的基本工作过程

barrier()的疑问

open打开一个设备时,内核做了一些什么事情后才去调用相应的驱动的呀

新兵笔记--ULK(C3) Process Descriptor

核心中内存访问是否要进行页表转换

__init具体是什么作用

do_softirq() 初步探讨

内核semaphore初步

[rainfall]系统调用

时钟概述

init进程如何从内核态切换到用户态。

init进程从内核态切换到用户态(2)

我觉得现在的进度比较慢。

8259A的编程原理(2?)

分析rwlock的结构

分析rt_sigframe结构

tasklet_action()初步

分析access_ok的结构

请问2.4中实现net_bh功能的函数到哪里去了

分析test_wp_bit的过程

ptype_all结构的一点理解和网络初始化以后的组织图

set_call_gate以及其中的汇编

zone allocator

虚拟内存的管理,搞不懂!!

分析内核检测CPU时钟频率的过程

Process Scheduling灌水版

at&t汇编说明

分析几个页目录处理的宏

Solar Designer设计的stack不可运行的patch

外部中断的上半部分(一)

怎样取得skb结构中的内容!

Linux调试技术介绍

如何编程获得系统时间

(*(unsigned long *)&jiffies)与jiffies有何不同

谁能改变中断的优先级别

分页,自己瞎琢磨,想破头都搞不定

什么情况下需要使用volatile修饰符

硬件中断:8259部分

关于保护模式

不是linux的问题-一个切入保护模式的问题

内核重入

kernel和modules的区别

分析进入和退出VM86模式的过程

分析get_wchan()过程(调度)

分析两个用于进程链表的宏:SET_LINKS和REMOVE_LINK

中断门的设置

强烈推荐大家看看《Linux内核原代码分析》

硬件中断的入口

关于ptype_all链表和pypte_base的理解

什么是footprint,hotpath?

VM86模式下的保护异常处理

分析一下FPU状态的切换

2.4.1中lock_kernel()和unlock_kernel()的问题

在什么情况下会触发一般保护故障(GFP)

linux内核内存分配初探

足印footprint

分析__udelay()算法

分析进程信号队列的结构.

如何捕获所有的ip包

分析spinlock的结构

从系统调用中返回

在mm_struct中,active_mm 表示什么

内核只是将用户虚存区域描述成vm_area_struct链表

Page Table and Memory Cost

解释一下__attribute__

对semaphore初步分析

ret_from_intr 非抢占的判断

map_user_kiobuf 注释

解释一下memcmp

小课题 & 焦点(请跟贴)

十分的困惑--get_user?

软中断「一」

粗略分析一下Linux对进程调试的支持

谈一谈gcc编绎出的跳板(trampolines)代码。

_end在那儿定义的

使Linux堆栈不可执行的简易补丁

我的错误,大家可以借鉴(driver)

map_user_kiobuf的注释

[ jkl ]active_mm是什么

对BUILD_IRQ中 -256的解释

对重入的理解

分析内核模块的结构

内核空间偏移3G的疑问

VFS文件系统(1)

防火墙技术分析讲义( for aka lecture)

linux的Kernel映像可以存放在压缩文件系统中吗

VFS文件系统(2)

About swap_page_dir, kmalloc

分析内核模块的加载过程

内核变量声明问题 (switch)

free_area 中的map

About 2 pages of task_struct

About vm_area

About symbol and loadable module

定时器:实现机制:思想

Linux Kernel中,对线程的支持如下

os的对于进程的内存分配是基于线性地址还是物理的

About Copy On Write--do_wp_page()

分析用户对文件访问权的算法

分析任务切换时虚存的切换

关于kmalloc和vmalloc的问题

VFS文件系统(3)

分析路径名搜索过程

分析文件页缓冲结构

解读softirq

内核也好,用户进程也好都是线性0-4G地址

Linux内核网络参数的意义及应用

我对spinlock中rep nop的理解

请教有关ELF文件格式

网络设备的初始化是在何时做的

set_fs(get_fs())应改为set_fs(KERNEL_DS)

2.4的file_operations结构问题

Qdisc链的含义

请教关于GDT和LDT的问题?

为什么找不到__initcall__start变量的赋值语句(lds)

分析文件名检索的散列算法

软中断

dev_queue_xmit真不知道是怎么“蹦”出来的??

分析IDE硬盘驱动器读写过程

"paranoia"问题

__init free_area_init 中bitmap_size = (end_mem -PAGE_OFFSET) >> (PAGE_SHIFT + i); 的问题

讲讲notifier机制-看到register_netdevice_notifier是的困惑

定时器:介绍&使用

malloc是如何调用内核的服务来实现的

mmap 的问题

分析list_head结构

可以自定义内存区的操作函数吗

内核中网络部分问题

进程调度

应将__MODULE__改成MODULE。

硬件中断处理的三个对象

关于内核内存分配, 依然需要努力

想读内核,可是lxr始终不能用

看了二个多月的源代码很气馁!

分析RAMFS文件系统

讲解一下文件系统中主要的数据结构

虚拟文件系统的基本原理

#define MODVERSIONS(模块的问题真多)

我想恐怕可以提前结束了。<Linux的文件系统分析>

示例clone系统调用的使用方法

__builtin_constant_p()在哪里

页IO

请教一个模块编程键盘中断的例子

几个非阻塞socket连续向一个ip的不同端口connect 时

分析应用程序加载时堆栈中的参数结构

分析ELF的加载过程

请问“:”是什么意思? (fixup:)

Linux动态链接技术

setup.S的到head.S的跳转在那里

fib_lookup的疑问:fib表是如何构造以及在何时构造的呢?

vm_area_struct 的vm_flags 有一位VM_SHARED是什么意思

某些语句会导致gcc隐含地生成一个memset()调用

系统调用时的NR_syscall中是什么地址

netfilter各个HOOK的关系

将核心空间的内存映射到用户空间,或者将用户空间的内存映射到核心空间

netfilter.h的解释

有关ext2 super_block 的疑问

分析ext2文件系统物理块的分配过程

connect超时时间的一点探讨

关于TCP连接的应答问题

可以把整个ext2的分区的东西移植到reiserfs的分区?

内核是怎么得到网卡的硬件地址的

关于as86的一些资料

ip_input,ip_forward和ip_output

分析ext2文件系统文件块的分配过程

lvm技术

网卡混杂模式(promisc)

分析EXT2文件系统目?

主机端口

关于pagh_hash函数

关于framebuffer的问题

BUG()?

about tss?

ip_nat_hash的参数问题?

What's numa and CONFIG_DISCONTIGMEM

net_family_read_lock,为什么要lock,其中的原子操作是什么

tty终端的写入过程

Linux-2.4等待队列头的结构有了很大变化,应该用DECLEARE_WAIT_QUEUE_HEAD()定义等待队列头

I can't catch some codes in kernel/sched.c , why?

LKM中分配内存的问题。

When I read do_fork() in kernel/fork.c,??

新兵笔记--ULK(C4) Returning from Interrupts and Except

tty终端文件的异步操作

Why not find tss in task_struct

请教关于LINUX设备驱动编程的问题

Linux下IP――分片与重组

发送、接受、转发包处理结构框图--again:)

rt_priority?

PPP驱动程序的基本原理

有没有人对Ipsec感兴趣?

FIB的数据结构问题?

驱动程序与用户进程

谁能告诉我atomic_inc(Atomic.h)函数是什么意思?

BSD伪终端设备驱动程序

Help me check some codes about bootmem

uname的系统调用?

请教:tty.h 中的宏定义

What's meaning of "mapping" in struct page

a question about memory_pressure

local_table是什么?在哪里初始化的?inet_addr_inet函数有点看不懂

如何获得网络因CRC校验错丢失包的个数

struct page {...struct buffer_head *buffers...};

转发表的检索过程(fib_lookup)

ZERONET(x)和BADCLASS(x)是怎样确定广播地址的

哪位大侠帮忙解释一下fn_hash_lookup函数的作用,谢谢!

策略路由的NAT和netfilter的NAT的区别

请问get_fs和set_fs的作用

__attribute__ 是何意?

do_wp_page()函数的疑问??

PPP帧的发送

各位大虾,键盘如何来处理??

LinuxKernel的错误?--“console的问题

Linux设备驱动程序的中断

在中断处理中分配内存时没有使用GFP_ATOMIC标志

make modules" error on rh7.1

Booting:BIOS POST?

tcp_hashinfo结构里的那些hash table都是什么作用?

关于mmap的问题

Linux上gdb如何跟踪调试进dlopen内??

请问msg_name派什么用处?

分析ip_route_output_key( )中的一个疑惑?

为什么check_region不可解析?

对volatile的解释

套接字地址的绑定

关于2.4的内核初始化的问题

关于free_area空闲块数组?  

一个LKM的初级问题 (包含头文件)

关于Ext2文件系统

嵌入式Linux内核精解

freeswan中,谁在操纵SADB?

linux下几种地址的区别


http://www.sgi.com/processors/r10k/timing/perf_count.html


我们的CPU-胡伟武

一个关于通过/proc与内核通信的问题

关于BOOT引导的问题?

中断描述符分析小问.

分析块设备缓冲区结构

kmalloc等内核常用函数的文档有没有

关于buffer cache的问题

进程,轻量级进程,内核线程,库线程的切换分别是由谁来负责,切换时都分别保存了什么信息?

为什么 virt_to_ phys( )不能用

分析sigframe的结构

分析信号的执行过程

请教核心0.01中head.s的检测A20地址线代码的意义

我在Kernel里定义的函数,在用户空间里怎么才能用呢

关于内存布置的问题

lilo与bootsect.s,setup.s的关系

有谁知道这个结构多少字节

start_kernel(void)函数的分析

分析虚拟文件系统的结构

slab

在驱动程序中可以直接从I/O内存读数据到用户空间?

start_kernel()后是怎么工作的

内核程序中分配内存最大是多少?

有关gcc内嵌汇编代码的问题

请问.S和.s文件的不同?



关于汇编
http://www.linuxassembly.org
Linuxkernel推荐


关于AT&T格式:

http://www-106.ibm.com/developerworks/linux/library/l-ia.html
lisoleg推荐

关于汇编:
http://www-aig.jpl.nasa.gov/public/home/decoste/HTMLS/GNU/binutils/as_toc.html
http://www.linuxassembly.org/resources.html#tutorials
lucian推荐


别谢我,这都是从http://www2.linuxforum.net/ker_plan/index/main.htm
找到的,有空去看看。

///////////////////////////////////////////////////////////////
你可以下载bochs:http://sf.net/projects/bochs/

其中就有BIOS的汇编源程序,你认为是C也可以(C也内嵌着汇编嘛!).

不过,这个BIOS比较简单, 功能比较弱.
/////////////////////////////////////////////////////////////////


__builtin_constant_p 与移植

象CTRL~C和CTRL~V这样的中断信号内核中何时被初始化

A20可以通过两种方式进行控制



大概的意思是将代码段放到.text.init中去,至于为什么要这样做,这里有对于__section__的讨论。
http://gcc.gnu.org/ml/gcc/2000-05/msg00536.html
你可以去看看。




calibrate-delay

最大分配128K?

Makefile中$<是什么?

请教有关usb编程的问题

[ chstar ]linux内核内存分配初探



links:
http://developer.intel.com/design/pentium4/manuals/

documents in pdf is good and enough for intel asm


Linux内核源代码漫游

386硬件支持得任务切换如何进行

linux0.0.1的内存转换问题

请问在内核中 HZ 是干什么用的

哪里有2.2内核的写驱动程序的文档

Ramdisk 和initrd,有什么用处?

诸位高手,看内核,从哪个入手的

哪位高人了解此函数usb_submint_urb

do_page_fault( )的几点疑惑

硬盘启动时,setup存储在哪里

内存转换问题

再问有关存储的三个问题

为什么动态连接库一定需要一个符号连结文件

我在查找内存分配错误的时候,找到了这 (ld 的_end)

build kernel步骤

.text .data .bss不要了会怎么样?

漫谈linux ieee1394

linux下能不能用c++来开发驱动程序呢

kpiod进程是做什么用的

关于内核内存初始化

请教一个linux下分段与分页的问题

spinlock_t?

请教mmap()的问题

有关ramdisk的问题

关于在proc下创建一个新项源代码的疑问

一个关于通过/proc与内核通信的问题

proc 文件系统分析(二)

对proc文件系统的分析(三)

proc文件系统分析(四)

关于南桥82371AB中断

创建进程和添加进程代码的概念

那位朋友讲一讲Linux对GDT的布置吗


增加系统调用的资料
http://202.113.16.117/cgi-bin/bbscon?linux/M.1005336295.A=4959

锁的实现
http://groups.yahoo.com/group/lisoleg/files/MultiProcessing/





请教关于内存访问的问题

更改后的发送、接受、转发包处理结构框图

386 boot代码分析

请教关于assert

对 proc 文件系统的分析(一)

逻辑地址如何转换为线性地址

Linux启动问题

内核中无法睡眠?

一个内核网络代码的问题:skbuff->dst_entry跟rtable结构是什么关系?

pci_bios_read_config_byte

ODL-One Disk Linux

[jkl]宏#与##(例子见BUILD_IRQ)

bbs.zsu上讨论的一个关于arp的问题,至今没有好的答案

有关linux引导扇区的问题?

谁能介绍一下变量的属性是如何设置的?

内核程序无法睡眠(续?)

bbs.zsu上讨论的一个关于arp的问题,至今没有好的答案 (又贴了一遍?)

分析serial.c

HZ问题

就是为什么可以用send_sig_info使阻塞的函数返回的原因

为什么一执行lidt就重起

只知道可用宏put_user和get_user macrocs使内核能够存取用户内存缓冲区。但究竟怎么用呢

setjmp、longjmp的问题

在内核中如何得到当前系统的时间

给个内存管理的整体概念先

请问各位,printk()将调试信息写到哪去了

limit标志表示分配区内可分配页面的富余程度

双向规则是什么意思

What's diefference between vmlinux & bImage

rt cache的问题

用户程序可以自己将自己切换到内核态吗

keywords: execve,vfork,kernel_thread,vm

如何在系统加一个自己的ioctl命令号

Linux Notification 机制的分析

请问__builtin_return_address在哪儿定义的

打开A20地址线为什么要写0x60口?

[ Feiyun ]linux/arch/i386/kernel/head.S (2.4.9)

[ Feiyun ]linux/arch/i386/boot/bootsect.S (2.4.9)

[ Feiyun ]linux/arch/i386/boot/setup.S (2.4.9)

[ Feiyun ]linux/arch/i386/boot/compressed/head.S

[ Feiyun ]Linux makefiles (Linux 2.4.9)

在unix下可以加入自己的协议模块吗?......

如何将Module和整个内核分离开?

中断服务程序怎么没有运行

something about neighbour Table

关于netfilter 里nfcache字段

建议用module_init()宏来调用card_init

请教一个内存管理的问题

中断描述(todo用)

stack of kernel mode and user mode

交换缓冲

分析信号的发送过程

Signal 11 while compiling the kernel(转)

堆栈上的current指针

一大堆序列号呀?

关于local的含义

关于nmap的问题 (tcp)

LINUX TCP层分析之一-------------主动连接发送SYN包的tcp_connect

缺frame和缺page table是如何区分的?

C.O.W到底到那一级

do { } while (0)是什么意思

怎样得到kmalloc分配的内存地址的实际物理地址

asmlinkage

怎样获得系统的精确计时?越精确越好

这个bug是由于内核将用户进程在内核空间引起的页保护故障错误地当成了内核vmalloc区域的页不存在故障所致

Linux下IrDA方面的开发资料

关于smp的疑问

TLB到底存储了写什么

有关任务切换的问题

内核空间的预映射是怎么回事

我知道肯定是有些我没注意到的代码改动了skb->len

about improved long long code sequences by linus

内核和用户态怎么共享内存

网络部分的proto_ops的方法是如何重载的

裁减内核到多少K等等,那么具体是那个文件的大小呢?

请教如何精简LINUX到8M以下

有关等待队列的问题

内核方式是否需要三级页表转化
[目录]


list4



elf_check_arch是什么函数

请问#APP和#NOAPP是什么意思

什么是L1 cache aligned

d_cache 与 inode _cache的问题

linux网络部分重要结构体联系图

linux网络部分重要结构体联系图(?)

用\续行, NR

请问ENTRY( ... ) 语法

在中断例程中如何与其他进程通讯??(用信号量还是全局变量)

内核模块编译需要优化

About task->active_mm

驱动程序怎样锁定内存

linux 2.4.x initialization for IA-32 howto

Booting Linux for IA64

About task->active_mm (bnn 续)

About Our China's CPU-Fang Zhou

我在你的帖子中注释了一下,不一定对.

RTL8139 驱动程序解析(转)

Sun YongYao--发送、接受、转发包处理结构框图修正

Linux内核分析文档计划

windowsXP和linux在系统结构上谁更好?

TCP协议的核心守护进程echod

请教一个中断方面的问题

再谈page cache和buffer cache

稀疏文件是怎么的概念呢

请教frees/wan的原理问题

块设备文件和普通文件有什么区别?普通文件不也是放在块设备上的吗?

关于I/O请求优化

请教一个MBR的问题

page cache与buffer cache的关系。

请问系统中有几个针对磁盘读写的request队列?

TCP传输控制块的初始状态

net_rx()网络数据流向

这样的内核程序能阻塞吗

Linux设备驱动程序的中断

页故障的处理过程

网卡的初始化过程

2.4内核网络部分的初始化

2.4网络代码阅读笔记(1)

2.4网络代码阅读笔记(2)

2.4网络代码阅读笔(3)

2.4网络代码阅读笔(4)

2.4网络代码阅读笔记(5)

RAM DISK 和 DiskOnChip 有什么关系?

文件映射区域的分配方式

未经accept的socket是如何处理数据的?

如何对拷不同长度的socket缓冲区?

Linux内核地址空间的布局

netfilter一问

请教GDT

我非得用SMP吗?

关于LDT的疑问

请教一个tcp连接性能的问题?

能解释一下A20地址线是怎么回事吗?为何要打开?

如何显示GDT,IDT,LDT表的内容

物理内存的分配结构

重入的疑惑

高端页面的映射

2.4.1内核中页结构PG_refrenced标志什么时候置位?

怎样在内核中写文件?

一些问题(网络方面)

网卡驱动程序(inw,insw提问)

向所有做内核分析的朋友提个问题

netfilter这里还是不明白

交换页分配方法

在网卡驱动程序中如何实现包转发?

请教一个内核寻址的问题

非分页、连续内存?

FreeBSD内核文件的结构

FreeBSD内核的编绎方法

virtual address to physical address - HOWTO?

关于printk的一个问题:

关于内存管理的一个问题

如何加一个文件系统到内核中

如何实现临界区

关于引导程序问题

不让root process使用1024以下的端口

get_current()的问题

hard_smp_processor_id()与smp_processor_id()有什么区别?

新兵笔记--ULK(C3) Exception Handing

TCP包处理的后备队列(backlog)和预备队列(prequeue)

解释一下__wait_queue_head结构?还有wake_up

TCP包的校验和

内核日志和内核控制台

minix文件系统的物理结构

关于buddy system的几个问题?

void page_cache_init(u_long mempages)

信号能否重入?

static __inline__和extern __inline__有什么区别?

void __remove_shared_vm_struct(vma)

spinlock

TCP PAWS处理

About Major Number

linux内核启动到底做了什么的资料

listen和accept过程的简要描述

真正的信号高手请进

有关页寿命的疑问

完了,没耐心看了,大侠帮忙,给我讲一下tcp_connect就好!

linux中如何设置stack的大小?

关于struct

GET_CURRENT还有疑问

谁有ARM远程调试的stub的源代码

[精华] 辞职申明 和 学习内核的一些感想

分析calibrate_delay过程

请教内存初始化的问题(reserve mem)

详细解释一下Thread(线程)???

linux 支持内核线程吗


asmlinkage
http://www.kernelnewbies.org/faq/index.php3#asmlinkage.xml




linuxdoc.org的对于Linux线程的一个比较完整的回答

行内汇编中,"o"(var)(不是零)"o"是什麽寄存器,谢谢!

如何在模块中增加系统调用

red black tree

iptables内核数据结构关系图

[serial]中断问题?

console注册与tty注册的区别

make_pages_present(),不知它的具体作用是什么

宏mb()是什么意思?

这是我搜集的linuxkernel兄的大作

linuxkernel兄大作之2

TCP层向外发包时为什么总是将skb进行克隆?

内核防火墙iptables的一条规则(图)

struct dentry中各项意义

关于read_super_block 的一点疑问!

端口读硬盘信息疑问

asmlinkage这个关键字是什么意思

fork()与vfork()的区别

pg0 的问题?

Linux的启动盘与DOS中的启动盘不一样

__attribute__是什么东西,怎么用呀


800 种文件格式
http://www.wotsit.org/default.asp


在linux下读取、修改(如果可能)主板bios的内容

制作基于软盘的Linux系统

调试信息过多造成dmesg无法完全显示怎么办?

Ctrl-D被按下后,产生什么信号?或者根本不产生信号?

关于中断响应

linux内核概念问题,欢迎讨论

介绍一下e820 map的内容

新兵笔记--ULK(C4) Initializing the idt

_set_gate分析

Linux A-Z书中实例的源程序

关于end_mem的一点疑惑

新兵笔记--ULK(C2) beta版

防火墙分析总结

网络包复制

head.S 中的问题

现转载对我帮助很大的文件,十分感谢那位作者!!!

关于MBR的一个问题:)

ELF的 e_ident[EI_NIDENT]是什么意思?

Makefile中Config.in是什麽文件

virtual address space and physical address

time quantum

Lisoleg的昨天、今天和明天

System.map中的几个标志T,t,B,b,..的问题

内存初始化mem_init中的两个问题


ldd2
Chapter 9: Interrupt Handling
http://www.xml.com/ldd/chapter/book/pdf/ch09.pdf
C & C

mmap
http://kernelnewbies.org/code/mmap/



内核代码可以读取文件或共享内存吗?

内核镜像是如果映射到3G去的?

进程的页目录表中的768项之后的项是不是都是有效的?

内核页目录

关于进程内存空间的映射问题*

Special expression from linux-kernel mailing list

discussion about MaxNumber Of Threads From KernelT

核心态对用户态的数据访问

内核是怎么访问PCI配置空间的?

这么做行不?(请大伙抽空看看)内核中共享内存的如何使用

which Compiler to Use for kernel compiling

GLIBC被多个进程共享疑问

fork()一个子进程时,IPC资源是否可以被子进程继承

malloc()在内核中对应的函数是什么

支持热插拔的驱动程序的框架疑问

回答“关于页面映射计数”

关于内核中加入自己得代码得可行性

用户空间和内核空间之间的数据传输

为什么需要copy_from_user?(转载)

内核启动过程问题(rush老哥看过来,我知道你看过启动代码)

软中断图解

早期的任务切换

谁能说一下iptables.c 和 netfilter.c 的关系?

最近看mm的人很多啊,和大家分享我给自己写的教程

一个疑问 --《Understanding Linux Kernel》

请教linux源代码中的数组问题

skb_reserve - adjust headroom

UNIX核心介绍

分配虚存空间有了mmap和munmap为什么还需要sys_brk?

Write Your Own Operating System Tutorial && FAQ !

some valuable HowtoS for KernelStudy

To get intelX86 docs

如何修改IP流程中的数据包???

请问怎样让我的一个可执行程序在开机过程中自动执行

关于ctags的问题?

关于copy sk_buff的问题

Kernel2.4.18的交换机制分析

系统初启时中断向量表放在哪里

swap in (2.4.0)

handle mm fault (2.4.0)

swap out for Kernel2.4.0

实时进程的时间片赋值问题?

关于驱动程序与实际设备的关联问题

本论坛关于时钟的一个悬而未决的问题

A20是什么东西?

bootsect.s和setup.s问题集锦


bios ox15中断ah=e801
http://www.ctyme.com/intr/int.htm


gas 文档
http://www.gnu.org/manual/gas-2.9.1/


用什么办法可以将系统的gdt给显示出来?

这么生动的赋值方法

在0x104000处的硬件参数表的详细说明

转贴一篇关于mm的文章。

这不是自己覆盖自己吗

do_irq()的问题

misc两个head.s, end, __PAGE_OFFSET

关于interrup和exception

一个setup.S与head.S连接的问题?

终于独立看懂了一个内嵌汇编,兼问个问题

draft BIOS use document for the kernel(里面有讲e820)

start_arch中copy e820_map的问题

2.2的一些task数据结构在2.4里是什么?

关于bottom half

mem_map array

__init 在那儿定义的

有个prototype用了pgprot来做变量。刚好pgprot_t的数据结构定义里又用了pgprot

fixed_addresses 的排列

how to smp

空闲页面free_area结构初试话一问?

setup_arch中的reserve resource!

slab里的free buffer

list_entry的疑惑

linux内核中的同步和互斥专题 (1)

linux内核中的同步和互斥专题(2)

setup_arch()中PFN_UP,PFN_DOWN,PFN_PHYS这三个函数是什么意思

cache_cache里的slab的大小是不是一个page

几个变量的意思(page,mm)

remap_page_range()的疑问!!??

start_kernel 里的 init_modules()问题

linux 内核原代码汇编中 .align 伪指令的意思是什么?

关于task_union

多个内核问题提问

请问关于页计数和页的使用情况的关系的一个问题?

CR3问题?

Linux字符设备基础(转贴)

又是start_kernel里的变量定义问题

ioremap是干什么用的?

Makefile :这行为什麽要有( )

关于flash的一些问题!

100个最佳Linux站点(推荐)

判断process是在user mode还是在kernel mode的标准是什么?

关于ext2的几个问题

谁知道unistd.h里的这段解释是什么意思

关于skbuff得资料

bdata.last_offset和last_pos在何处初始化?

内存管理问题?空闲页的bitmap是干什么的?

noncontiguous memory究竟指的是什么?

再聊聊free_area的bitmap

关于gcc内嵌汇编的一个问题

对bh_base[32]和bh_task_vec[32]的一些猜测

明白了free_area的bitmap了!

软中断softirq

路由问题


http://linux-mm.org/



super block是用来干什么的

研读Linux内核主要是为了做些什么?

Linux内核抢占补丁的基本原理

page描述符起名page,确实不好

请教一个术语--”堆“

#if 1肯定是满足条件,else后面的有什么用

内存管理中常常见到“round up”,它具体是什么意思呢?

我也来问几个关于gcc内嵌汇编的问题

"aka inode"? that is "as know as inode"

谁知道”16M以上的低位物理内存“到底有多大?占了多少百分比物理内存

如何做源程序的补丁?

local_table是什么?在哪里初始化的

汇编call命令调用C函数时,参数是如何通过stack传递的

一段boot的测试代码,有问题,来看看……

读do_basic_setup时碰到的问题(pci)

start_kernel里面的prof_shift干什么用的

HA开发,增强内核,学习好方式

关于spin_lock

vfs的索引节点号i_ino是怎么管理的

ip_route_input

想听听大家是怎么读核的

我的分析是应该首先发送第一片

谈一谈我的内核精简计划,以及目前的进展情况

IP分片与重组的分析与整理

“Practical Unix & Internet Security"。号称是”圣经”式著作

Linux源代码中的几个缩写

几个网络有关的变量

为什么不立刻用长跳转指令重载CS段寄存器呢

当物理空间的的线性地址>1G的时候,虚拟空间如何解决

请教关于睡眠和唤醒进程的两个函数...

如何读取系统物理内存

freeswan是什么东西呢?

ip_rcv_finish函数一问

inflate.c文件的fill_inbuf()函数中insize的赋值的问题

裁减Linux内核的心得体会

linux下的一个文件的最大尺寸是多少?由什么决定?windows下呢?

请教一个Netfilter的应用问题

使用register_blkdev( ), 做完insmod后,为什么/proc/devices没有我的块设备

应用层->pci->disk,这种情况disk的驱动该如何写?

请教一个内存管理问题(挺典型的一个问题)

快速找到connect,socket函数实现的代码

致地讲一下IP_FORWARD那个函数

如何在内核中唤醒和睡眠用户进程??

如何打开.patch文件?

关于IP_FRAGMENT的问题

How It Works: DOS Floppy Disk Boot Sector

How It Works -- Master Boot Record

Minix代码分析之一:引导扇区代码

同一程序加载执行空间分布一样吗?

锁和信号量

内核与根文件系统

读kernel时容易漏掉的几个细节

推荐课题及"目的"

devfs_entry是干什么用的

2.2里的vfsmntlist,2.4改什么了

如何直接向网卡读写数据包?

如何在内核中加入PF_KEY套接字?

enable_irq(),disable_irq().和cli(),sti()之间有什么区别

关于slip模块中使用ioperm

gfp是什么的缩写阿?

关于中断例程中的子进程睡眠问题

连续空间分配的大小问题!

skb->data为物理地址。为何在第一句中又进行转换

可加载模块写文件出现的奇怪现象 (程序设计经验)

SYMBOL_NAME( )

zone_struct

关于物理地址和虚拟地址的问题

请问linux文件系统层次结构的问题

kmalloc(size)返回的是物理地址,还是虚拟地址

VFS初始化过程中的一些问题

how to use create_proc_info_entry

中断上下文,进程上下文和任务上下文之间的区别---需要进一步深入

混杂模式

video adapter's ROM

本论坛和mailing list的区别!

很高兴能为大家服务, 及一些想法,大伙来参谋参谋

mkfs和fdisk的根本区别在哪儿?



amp - bios 资料
http://spr2.net/up_loader.php


内核等待队列机制介绍
http://www.linuxaid.com.cn/engineer/ideal/kernel/wait_queue.htm
linuxaid的网友ideal竹叶收藏




bootsect.s把大内核复制到高端内存的时候,还是实模式.如何实现的

page-》list

OWNOS操作系统设计书

need_resched 是怎么使用的

请教高手一个关于网络全局变量dev_base的问题

关于页面映射计数的讨论

free_area_init_core对其中struct page的virtual赋值为当前struct page所描述的物理页框的内核虚地址

再和4-1的反做与运算得到的又是什么呢?

__init , __exit , module_init, module_exit是什么意

写个小的OS项目,如何?加之一些感想(完全兴趣与学习目的)

mem_map数组

怎么解决这个include头文件时出现的矛盾

内核命令行是何时在何处传递给内核的

A20是什么?

关于brk与mmap的问题--已解决见另外一个帖子

在mm中,vm_area_struct为什么只用了单链表?

为什么要copy_from_user?

关于网络中接收软中断(net_rx_action)的问题

对UDP包在对包不做任何改变的情况下用udp_check()函数重新计算,结果与原校验和不符?

怎么初始化一个PCI设备?
[目录]


list5



关于queue_task的一个问题


打造软盘上的linux
http://www.linuxfromscratch.org/ to define your own OS distribution.
www.linuxdoc.org to get howtos you want


可以参见下面链接处:
http://www.linuxeden.com/edu/doctext.php?docid=1582
Linux内核调试技术介绍 :)希望有帮助

我根据这个
从源代码打造一个最小化的Linux系统实作篇
http://www.linux.org.tw/CLDP/gb/mini/BuildMin.html#toc6
编linux,但不知道如何安装到指定路径


为你的Linux快速编译所需要的模块
by 刘军民 ([email protected])
http://www-900.ibm.com/developerWorks/linux/l-tip-prompt/tip13/index.shtml





copy_e820_map()问题

合并相邻区函数merge_segments()--2.0.33

关于module的问题

关于卖广告和我对linux的一点意见 :-)

timer_interrupt()函数看不明白,请指点

如何驱动键盘灯?

schedule(void)函数一定是可以重入的,对吗?

mmap (2.4.0)

Linux: Using Video RAM as System RAM

Linux: -aa VM in 2.5

一个linux驱动程序的问题

大侠指点一下get_pid的算法?

怎样修改PIPE_BUF的大小限制

操作系统理论的探索 (序言部分)

问题出在你新编译的内核不支持模块的版本识别

版本2.4.16下path_init和path_walk,link_path_walk分析报告

怎么理解记录块缓冲区的内容是一致的?

mark_bh(TIMER_BH)和timer_bh( )

当今日新月异,“对象”横飞,潜读LINUX源码除了提高自身素质外还有哪些令人兴奋的应用前景

一个困扰很久的问题--paging_init()

Linux核心调试环境的搭建

磁盘扇区与磁盘块如何定义以及如何区分使用?

也表处理宏的定义释疑

为什么学习LINUX源码、学到什么程度及怎样学习才能在最短的时间里取得最大的收获?

关于时间中断的一个问题

事物总是从陌生开始认识

关于/dev/shm

怎么在本机上配置一个lxf看源代码?在下对apache网络配置一窍不通

哪位知道哪有/proc的手册么

请问叶框0(0 ~ 4K物理地址空间)是否一直未使用?

剖析Linux任务切换的细节。

请问linux下有没有好的看源码的工具?

system call

低1G虚存是做什么的?

bootsect,setup,head的总结

增加系统调用的血汗经验 贡献给大家

How to use ramfs ???

能否将framebuffer的源码说一下

entry.S(续)

谁知道系统刚启动时BIOS建立的参数表

指点一下《Understanding the Linux Kernel》中的难点

Linux: O(1) Update For 2.4

links4RealtimeLinux

A new era: Carrier-grade Linux for Telecommunicati

lwIP - A Lightweight TCP/IP Stack

sys_arch interface for lwIP 0.5

Raw TCP/IP interface for lwIP 0.5

links4EmbededLinux

man slabinfo , 对其中的SMP部分不得其解

请教一个关于Linux处理外设中断的问题

异常处理函数的压栈

使用VIDEO_CHAR检查内核启动时在何处挂起

为什么用files->fd[fd]而不用files->fd_array[fd]

Linux 下网卡混杂模式

修改时间片DEFAUT_PRIORITY,为什么当系统

Lan网卡收到包后,应该比较mac地址。

如果手工触发request_irq登记的中断服务

请介绍关于cacheline相关知识,比方cacheline_pingpong

网络包的接收过程

关于pt_regs

How the PCI Hot Plug Driver Filesystem


iptable用户空间和内核关系的问题?

LINUX文件系统分析草稿--面向微内核的OS设计

希望大家讨论讨论?我们学源码要学到什么时候才能收手?

中国有多少人在做关于kernel的开发(真遗憾偶挖了坑没有人跳进来)

Linux内核中对硬盘控制的有关资料

head.s 中“jmp 1f”的1f是什么意思?

how to get size fo ram?

谈谈自已所尝试的内核分析方法

linux中进程与线程的问题

如何在LKM中执行一个用户空间的程序

为什么32位的系统不支持大于2G的文件?

Linux上是否有类似winsock2上的SPI相对应的接口层?

请问如何驱动这个怪物

用双网卡如何同时传输数据(?)

在内核中如何进行大空间内存的分配??

请帮忙修改程序(do you like this?)

关于Login的一个问题(basic)

offsetof怎么理解

为什么每个磁道有63个扇区,而不是64个

ldd2的Backward Compatibility章节

LDD第三章的一个问题

如何根据pid得到进程的名称

如何将内核编译成无版本检查的呢

about init section (vmlinux.lds)

udp报文转发不了,而icmp报文可以,为什么(undstand it?)

张贴一个别人推荐的很好的内核线程的例子

2.4.16软中断分析图 (again)

about interrupt number : 15 or 16

关于引用内核输出符号的问题

cache不命中的情况

请教/proc/pci(有个pci图)

连续内存与离散内存的问题

请问怎样能够得到一个进程的所有的通讯流量

如何让root不能修改其他用户的口令?

slab对象的地址可以不通过页表映射吗?

atomic_fool_gcc的作用是什么?如果不加gcc可能怎么处理?为什么2.4中没有了

关于缺叶中断的内存管理1

slab对象的地址可以不通过页表映射吗(...?)

about "jmp *%eax

insmod的模块放在哪里?

linux smp 求救

8259A可编程控制器在linux上的初始化

在网络层构造UDP包好像不太合理

如何将内核中printk的输出到屏幕上

Linux在i386处理器在PAE模式下寻址

shell系统流程(哈哈)

网上那有关于a20线的详细介绍

调度 schedule 概念

zone balance 是何意

多一些供献,少一些..

大家看看,是不是《情景分析》说错了?(文件读写)

欢迎calfe,garycao加入版面管理



裁减libc的两个工具
一个是Montavista公司的lib优化工具
基本思想是扫描你的应用程序的库函数调用.将你的应用程序没有用到的库函数删除.
一个是IBM组织的一个minilibc project
http://www-124.ibm.com/developer/opensource/linux/projects/minilibc/


这儿摘录了其中的几个非正式观点,共享.

Some write for the fun/eduction of it and want to to it all.
Some have ego problems and must do it all.
Some do not know how to adapt existing code so they do it all.
Some have really wierd systems with nothing close so must do it all.
Some have not searched enough to know of simulair systems so must do it all.
Some have ethical/comercial problems with licenceses and must do it all.
Some rename code and say he did it all.
Some DO use existing code.



uclinux 分析
http://hhcn.org/uclinux.html


gnu/hurd 介绍
http://www.gnu.org/software/hurd/


几个手册
http://www.refcards.org


netlink socket资料
http://qos.ittc.ukans.edu/netlink/html/


截包零拷贝能不能实现

收集内核FAQ了! 大家如在版面上发现适合的话题请转载一份贴在这儿

local_irq_disable()在smp下究竟是关了所有处理器的中断还是当前处理器中断

读setup.s中的几个问题(openarm的几个连接)

spinlock的设计和实现

在linux中一个进程如何修改其它进程的数据(关注)

Linux的页式内存内存管理

head.S 分析

内核信号量的简单演示(几个进程并发调用down的情况 ppt)

i386内存结构示意图(intel and mine)

内存观点(2.4.0)(精华收集和自己的一点理解)

如何关闭linux的单用户模式

flush_tlb_xxx()这类函数都是干什么用的

设备初始化问题(basic)

System.map有什么用处?

Linux 内核笔记 -- 信号

如何读取指定硬盘扇区号的扇区数据?

关于swapper的问题

linus关于debug tools的一篇旧帖子

What is the meaning of "volatile"?

重新编译内核后不支持VFAT的中文文件名?(内核?)

忙里偷闲:Slab简要分析(一张图)

volatile的含义

kgdb文档

引导与启动部分之head.s部分的注释

系统引导与启动(suzhe前辈的一次报告)-----by linux3-III

系统引导与启动之深入lilo-----(zz by linux3-III)

有那位大虾做过内核裁减

jiffies耗尽后会发生什么

ip层及tcp层的处理究竟谁在做

关于tcp/ip不明白的地方

请问在Linux下如何得知每个CPU的使用率等信息

[ jkl ]__attribute__

问几个很弱地问题...

Ext2 文件系统的硬盘布局

如何修改或去掉以framebuffer方式启动的内核的小企鹅的标志

__copy_user的实现原理

boot loader 的一些研究

ip数据包接收发送

Linux的存储管理(一)

内核启动时传入的参数存放在甚么位置

编译linux内核及注意事项(支持ipv6)(看起来步骤详细)

我是怎样精通了linux内核的?(??)

pci_read_config_byte

[精华] LDD2-CH12-块设备

<<Linux设备驱动程序第二版>>第八章 硬件访问

<<Linux设备驱动程序第二版>>第六章 时钟管理

《Linux设备驱动程序》第二版译稿 第九章中断处理 by kongming etc

<<Linux设备驱动程序第二版>>第九章 中断处理

<<Linux设备驱动程序第二版>>导读计划

Linux 设备驱动程序》第二版翻译稿样章(前言)

《Linux 设备驱动程序》第二版中文翻译稿样章(第 6 章 时间流)

《Linux 设备驱动程序》第二版中文译稿样章(第 4 章 调试技术)

Linux设备驱动程序(第一版)完整勘误表

编译内核出错(为什么这种话题很多?)

gdtr,idtr,cr3乃至页目录表,他们之中的地址都是物理地址吗?

vm area的地址映射(多看些讨论有好处)

difference between "return" and "exit"?

关于booting部分的一些链接

[精华] Linux 内核笔记2 - 进程调度

Linux的存储管理(二)

linux内核调试(讨论)

推荐一本浅显易懂的书

此图如何看(e820)

论文“Linux内核进程调度与控制 --源代码分析与研究”

怎样用bochs和vmware测试内核

关于使用kgdb调试内核

Linux中的NAT能同时支持多少连接?

为什么会kernel panic(多多讨论)

task_struct结构中的comm成员是代表什么意思啊

《Linux 设备驱动程序》第二版中文译稿样章(第 15 章 外设总线概述)

注册设备文件处理函数的方法有问题(算个经验)

根文件在那里初始

关于in_interrupt的问题

为你的Linux快速编译所需要的模块 (zz)

关于《Linux 设备驱动程序》第二版中文译稿样章的说明

MODR/M and SIB,whar's the means?

What's the maximum preemption latency

LINUX下的设备驱动程序

[转贴]如何编写Linux操作系统下的设备驱动程序

关于vmalloc的疑问!!!

into entry-armv.s

设备驱动程序如何在启动时加载(faq)

bonding.c的原码分析

驱动开发的基础问题(硬件厂商提供驱动吗?)

LINUX的网络设备中,利用master 和slave来实现负载平衡

学习内核和驱动需要多少硬件知识

Linux 内核笔记3 --内核同步-- 第一部分

uClinux - BFLT Binary Flat Format

[精华] LINUX实时调度研讨。

mmap函数问题

Setup Terminal Systems

首席培训官教新手使用最新的内核

PG_active和PG_referenced

内核中的所有struct semaphore型变量都共享一个spinlock_t变量

进程互斥,PV操作

ldd2第十五章PCI总线阅读随记

Write Once protocol for multi processor

一个pci插槽的pci设备的中断是不是固定的

do_IRQ()问题

page->mapping和page->buffer分别是做什么用的?

do_softirq()问题

Linux内核进程调度与控制 --源代码分析与研究 by minipuss

可否核态和用户态直接进行通讯

Linux 内核笔记3 --内核同步-- 第三部分

Linux 内核笔记3 --内核同步-- 第二部分

How to open/read a file in interrupt_context?

Why "scheduling in interrupt" ?

when should i define a variable with "volatile" ?

Kernel/Device Driver questions?(mmap,kmalloc,irq)

"gdb-serial.txt" from "gdbstub.tar.gz"

gdtr中为什么放线形地址 ,而不是物理地址?

代表设备文件ext2_inode节点保存了什么信息保证找到设备的?

[精华] Linux 内核笔记3 - 内核同步(完整版)

内核与用户进程通讯的几种方式比较

我把内存管理FAQ重新整理了一下。

“逻辑地址”、“线性地址”、“物理地址”的区别和联系

关于在内核中向应用程序发送信号的问题

实际一个程序同时可能有多个进程,所以一般由pid找程序名较合理

refill_inactive()函数

又关于page->buffers和page->mapping

关于video.s的疑问

关于内存的几个问题

怎么添加上ip伪装和ip端口转发

Running Linux on Linux(User-Mode Linux )?

如何生成可被lilo引导的image?

同志们,为什么浪费0~08048000的进程地址空间不用

关于添加系统调用的问题

作linux向另一个硬件平台的移植工作应该如何入手?要做哪些工作(链接)

kernel精华!(文档包)已经上传到我公司的服务器上了! (有钱出钱)

Kongming给出了ldd2中文版的部分章节,大家抽空读读,对其中细节给点建议

请问如何使网关支持内网上任意IP的上网通讯?

那么MAIN这个进程是什么时候fork的呢?

怎样在内核中读写文件?

LINUX ALLOCATED DEVICES

Interview with Robert Love

请xshell结合这段代码对于cacheline做些解释

HZ 表示每两次时钟中断相隔的微秒数

head.S 中的__PAGE_OFFSET 和其他

谁能讲一讲Console和tty之间的关系?

wmb是干吗的函数 (zz)

这是我在学习设备驱动程序的一点问题?希望大家赐教!

2.4.16下网络结构全景图1.0 (包含模块接口变量名称)

谁有真正能用的Linux启动盘的资料?

Encrypted Ethernet Bridging

More Explicative Kernel Tainting