linux 0.11 ÄÚºËѧϰ file_dev.c
/*
* linux/fs/file_dev.c
*
* (C) 1991 Linus Torvalds
*/
#include <errno.h>
#include <fcntl.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <asm/segment.h>
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
/* ¸ù¾Ýi ½ÚµãºÍÎļþ½á¹¹£¬¶ÁÉ豸Êý¾Ý£¬ÎªÉϲãµÄreadº¯ÊýÌṩº¯Êý */
int file_read(struct m_inode * inode, struct file * filp, char * buf, int count)
{
// ÓÉi ½Úµã¿ÉÒÔÖªµÀÉ豸ºÅ£¬ÓÉfilp ½á¹¹¿ÉÒÔÖªµÀÎļþÖе±Ç°¶ÁдָÕëλÖá£buf Ö¸¶¨Óû§Ì¬ÖÐ
// »º³åÇøµÄλÖã¬count ΪÐèÒª¶ÁÈ¡µÄ×Ö½ÚÊý¡£·µ»ØÖµÊÇʵ¼Ê¶ÁÈ¡µÄ×Ö½ÚÊý£¬»ò³ö´íºÅ(СÓÚ0)
int left,chars,nr;
struct buffer_head * bh;
// ÈôÐèÒª¶ÁÈ¡µÄ×Ö½Ú¼ÆÊýֵСÓÚµÈÓÚÁ㣬Ôò·µ»Ø
if ((left=count)<=0)
return 0;
while (left)
{
// ¸ù¾Ýi ½ÚµãºÍÎļþ±í½á¹¹ÐÅÏ¢£¬È¡Êý¾Ý¿éÎļþµ±Ç°¶ÁдλÖÃÔÚÉ豸É϶ÔÓ¦µÄÂß¼¿éºÅnr¡£Èônr ²»
// Ϊ0£¬Ôò´Ói ½ÚµãÖ¸¶¨µÄÉ豸É϶ÁÈ¡¸ÃÂß¼¿é
if (nr = bmap(inode,(filp->f_pos)/BLOCK_SIZE)) // µÃµ½Âß¼¿éºÅ
{
if (!(bh=bread(inode->i_dev,nr)))
break;
} else
bh = NULL;
// ¼ÆËãÎļþ¶ÁдָÕëÔÚÊý¾Ý¿éÖÐµÄÆ«ÒÆÖµnr
nr = filp->f_pos % BLOCK_SIZE;
// È»ºóÓ뻹Ðè¶ÁÈ¡µÄ×Ö½ÚÊýleft ×÷±È½Ï£¬ÆäÖÐСֵ¼´Îª±¾´ÎÐè¶ÁµÄ×Ö½ÚÊýchars
chars = MIN( BLOCK_SIZE-nr , left );
// µ÷Õû¶ÁдÎļþÖ¸Õë
filp->f_pos += chars;
// Ê£Óà×Ö½Ú¼ÆÊýÏàÓ¦¼õÈ¥chars
left -= chars;
if (bh) // Èç¹û¶Á³öÁËÊý¾Ý
{
char * p = nr + bh->b_data; // ½«p Ö¸Ïò¶Á³öÊý¾Ý¿é»º³åÇøÖпªÊ¼¶ÁÈ¡µÄλÖÃ
// ¸´ÖÆchars×Ö½Úµ½Óû§µÄ»º³åÇø
while (chars-->0)
put_fs_byte(*(p++),buf++);
brelse(bh);
}
// ·ñÔò½«Óû§µÄ»º³åÇøÈ«²¿ÉèÖóÉ0
else
{
/*************************************/
while (chars-->0)
put_fs_byte(0,buf++);
/**************************************/
}
}
// Ð޸ĸÃi ½ÚµãµÄ·ÃÎÊʱ¼äΪµ±Ç°Ê±¼ä¡£·µ»Ø¶ÁÈ¡µÄ×Ö½ÚÊý
inode->i_atime = CURRENT_TIME;
return (count-left)?(count-left):-ERROR;
/*
* ¸Ãº¯ÊýʵÏÖµÄÊǸ
Ïà¹ØÎĵµ£º
±¾ÎIJ¢·Ç½âÊÍʲôÊÇ·Ç×èÈûsocket£¬Ò²²»ÊǽéÉÜsocket APIµÄÓ÷¨£¬ È¡¶ø´úÌæµÄÊÇÈÃÄã¸ÐÊÜʵ¼Ê¹¤×÷ÖеĴúÂë±àд¡£ËäÈ»ºÜ¼òª£¬µ«Äã¿ÉÒÔͨ¹ýmanÊÖ²áÓëÆäËü×ÊÔ´·Ç¸»ÄãµÄ´úÂë¡£Çë×¢Òâ±¾½Ì³ÌËù˵µÄÖ÷Ì⣬Èç¹ûϸ˵£¬ÄÚÈÝ¿ÉÒÔ´ïµ½Ò»±¾ÊéÄÚÈÝ£¬Äã»á·¢ÏÖ±¾½Ì³ÌºÜÓÐÓá£
±¾½Ì³ÌÄÚÈÝÈçÏ£º
......
ѹËõºÍ´ò°üÎļþ
¡¡¡¡* .bz2 — ʹÓÃbzip2ÃüÁîѹËõµÄÎļþ£¬¿ÉÒÔʹÓÃbzip2 -d filename ½â°ü
¡¡¡¡* .gz — ʹÓÃgzipÃüÁîѹËõµÄÎļþ£¬¿ÉÒÔʹÓÃgunzip -d filename ½â°ü
¡¡¡¡* .tar — ʹÓÃtar´ò°üµÄÎļþ£¬¼´tarballÎļþ£¬¿ÉÒÔʹÓÃtar xf filename ½â°ü
¡¡¡¡* .tbz — ʹÓÃtar´òÍê°üºóÔÙÒÔbzip2ÃüÁ ......
Ìõ¼þ±äÁ¿Í¨¹ýÔÊÐíÏß³Ì×èÈûºÍµÈ´ýÁíÒ»¸öÏ̷߳¢ËÍÐźŵķ½·¨ÃÖ²¹ÁË»¥³âËøµÄ²»×㣬Ëü³£ºÍ»¥³âËøÒ»ÆðʹÓá£Ê¹ÓÃʱ£¬Ìõ¼þ±äÁ¿±»ÓÃÀ´×èÈûÒ»¸öỊ̈߳¬µ±Ìõ¼þ²»Âú×ãʱ£¬Ïß³ÌÍùÍù½â¿ªÏàÓ¦µÄ»¥³âËø²¢µÈ´ýÌõ¼þ·¢Éú±ä»¯¡£Ò»µ©ÆäËüµÄij¸öÏ̸߳ıäÁËÌõ¼þ±äÁ¿£¬Ëü½«Í¨ÖªÏàÓ¦µÄÌõ¼þ±äÁ¿»½ÐÑÒ»¸ö»ò¶à¸öÕý±»´ËÌõ¼þ±äÁ¿×èÈûµ ......
//
ͬ²½ÎÊÌ⣺
¶Ô¹²ÏíÊý¾ÝµÄ·ÃÎÊ£¬ÐèҪͬ²½£¬»¥³â¡£
ÔÚÖжϣ¬ÇÀÕ¼£¬¶àCPU£¬¶àÏß³Ì »·¾³ÏÂÓÈÆäÖØÒª¡£
ͬ²½·ÖΪ: ×èÈûͬ²½£¬·Ç×èÈûͬ²½
×èÈûͬ²½ÓÐÐí¶àʵÏÖ·½Ê½ÁË£ºmutex, semaphore. ×èÈûͬ²½Ê¹Óò»µ±¾Í¿ÉÄÜÔì³ÉËÀËø£¬»îËø£¬ÓÅÏȼ¶·´×ª¡£
·Ç×èÈûͬ²½£º£¨ÏÖÔÚÁ÷ÐÐÈýÖÖ£©
wait free ºÜÄÑʵÏÖ£¬Ë¼ÏëÊDZ¾Ïß³ÌÓÐÏÞ²½¾Í ......
LinuxÄÚºËÅäÖð취£º
1. make config
ÕâÖÖ°ì·¨»á±éÀúËùÓÐÅäÖÃÏҪÇóÓû§Öð¸öÑ¡ÔñY/N/M
2. make menuconfig
Õâ¸ö°ì·¨ÊÇ»ùÓÚncurse¿â±àÖÆµÄͼÐνçÃæ¹¤¾ß¡£³£ÓÃ
3. make xconfig
ÓÃÓÚ»ùÓÚX11µÄͼÐι¤¾ß
4. make gconfig
ÓÃÓÚ»ùÓÚgtk+ͼÐι¤¾ß
5. make defconfig
´´½¨Ò»¸öĬÈϵÄÅäÖã¬Éú³Éµ±Ç°µÄ.config
6. make x ......