OS课程与Linux内核相结合之同步实例(一)

学生们最近在学进程的同步,去他们的博客看了看,欣喜!他们把OS的原理与Linux内核相结合,写出了具体的实例:

niutao写的信号量使用的实例:

#include
#include
#include
#include
MODULE_LICENSE(“GPL”);
int num[2][5]={
{0,2,4,6,8},
{1,3,5,7,9}
};
struct semaphore sem_first;
struct semaphore sem_second;
int thread_print_first(void *);
int thread_pr[……]

Read more

Linux 内核代码赏析与应用(三)-链表API之应用

如前文所述,Linux内核中的代码,经过稍加改造后,可以在用户态下使用。
linclude/linux/list.h 中的函数和宏,是一组精心设计的API,有比较完整的注释和清晰的思路。在用户态下使用list.h,查看改造后的list.h
1. 举例
下面是用户态下的例子,用以创建、增加、删除和遍历一个双向链表。

#include <stdio.h>
#include <stdlib.h>

#include "list.h"

struct kool_list{
	int to;
	struct list_head list;
	int fro[......]

Read more

list.h

#ifndef __LIST_H
#define __LIST_H

/* This file is from Linux Kernel (include/linux/list.h)
* and modified by simply removing hardware prefetching of list items.
* Here by copyright, credits attributed to wherever they belong.
* Kulesh Shanmugasundaram (kulesh [squiggly] isis.poly.edu)
*/

/*
[……]

Read more

Linux内核代码赏析与应用(一)-链表之衍生

在Linux内核代码中,常常会看到一些经典的实现机制和策略,犹如在万花丛中看到一枝枝特立的花红,惊艳而又令人玩味。

作为实现Linux内核代码的主体语言C,它是朴素的、直接的,直接到你可以对硬件寄存器的某一位进行操作,C语言又是原始的,基本的,基本的就像构建大厦的一块块砖,运用它,你可以随意地建造自己梦想中的大厦。

但是,与其他语言不同,C语言标准库中并没有对数据结构的支持函数,比如,没有对链表、队、栈、树等数据结构操作的函数集合,但在Linux内核代码中,随处都可以觅见这些数据结构的踪影。
现实世界中数据的组织形式逃脱不出数据结构课程所涵盖的那些结构,相对于其他数据结构而言,链表这种组[……]

Read more

Linux内核代码赏析与应用(二)-链表之实现

抽象是软件设计中一项基本技术,如上所述,在众多数据结构中,选取双向链表作为基本数据结构,这就是一种提取和抽象。
1. 简约而又不简单的链表定义

于双向链表而言,内核中定义了如下简单结构:

struct list_head {
struct list_head *next, *prev;
};

这个不含任何数据项的结构,注定了它的通用性和未来使用的灵活性,例如前面的例子就可以按如下方式定义:

struct my_list{ 
void *mydata;
struct list_head list;
};  

在此,进一步说明几点:
1)list字段,隐藏[……]

Read more

虚地址转换为物理地址

一、 与页相关的数据结构及宏的定义
    分页机制是硬件对分页的支持,这是虚拟内存管理的硬件基础。要想使这种硬件机制充分发挥其功能,必须有相应软件的支持,我们来看一下Linux所定义的一些主要数据结构,其分布在include/asm-i386/目录下的page.hpgtable.hpgtable-2level.h三个文件中。
 1. 表项的定义
   如上所述,PGDPMDPT表的表项都占4个字节,因此,把它们定义为无符号长整数,分别叫做pgd_tpmd_tpte_t(pte Page table Entry),在page.h中定义如下:
    typedef str[……]

Read more

2.6驱动程序-字符驱动

驱动程序:

/*chardev.c*/
#include
#include /*for file-f_op*/
#include
#include /*for copy_to_user()*/
#include /*for cdev ,cdev_init,cdev_add….*/

MODULE_LICENSE(“GPL”);
MODULE_AUTHOR(“Helight”);

#define DP_MAJOR 250[……]

Read more