/*
* linux/fs/bitmap.c
*
* (C) 1991 Linus Torvalds
*/
/* bitmap.c contains the code that handles the inode and block bitmaps */
#include <string.h>
#include <linux/sched.h>
#include <linux/kernel.h> // һЩÄں˳£Óú¯ÊýµÄÔÐζ¨Òå
/* ½«Ö¸¶¨µØÖ·(addr)´¦µÄÒ»¿éÄÚ´æÇåÁã */
#define clear_block(addr) \
__asm__("cld\n\t" \
"rep\n\t" \
"stosl" \
::"a" (0),"c" (BLOCK_SIZE/4),"D" ((long) (addr)):"cx","di")
/* ÖÃλָ¶¨µØÖ·¿ªÊ¼µÄµÚnr ¸öÎ»Æ«ÒÆ´¦µÄ±ÈÌØÎ» */
#define set_bit(nr,addr) ({\
register int res __asm__("ax"); \
__asm__ __volatile__("btsl %2,%3\n\tsetb %%al": \
"=a" (res):"0" (0),"r" (nr),"m" (*(addr))); \
res;})
/* ¸´Î»Ö¸¶¨µØÖ·addr¿ªÊ¼µÄµÚnr Î»Æ«ÒÆ´¦µÄ±ÈÌØÎ» */
#define clear_bit(nr,addr) ({\
register int res __asm__("ax"); \
__asm__ __volatile__("btrl %2,%3\n\tsetnb %%al": \
"=a" (res):"0" (0),"r" (nr),"m" (*(addr))); \
res;})
/* ´Óaddr ¿ªÊ¼Ñ°ÕÒµÚ1 ¸ö0 Öµ±ÈÌØÎ»£¬²¢½«Æä¾àÀëaddr µÄ±ÈÌØÎ»Æ«ÒÆÖµ·µ»Ø */
#de ......
/*
* ¸ÃÎļþµÄÁ½¸öº¯ÊýÊÇΪÁËÏòopenºÍwriteº¯ÊýÌṩ½Ó¿Ú£¬ÊµÏÖÄÚºËÊý¾Ý
* ºÍÓû§Êý¾ÝµÄ½»»¥
*/
/*
* linux/fs/block_dev.c
*
* (C) 1991 Linus Torvalds
*/
#include <errno.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <asm/segment.h>
#include <asm/system.h>
/*
* | block1 |block 2|block 3|
* ---|-----|------|-------|-------|-------|-------|----
* ---|-----|------|-------|-------|-------|-------|----
* |<--->|<---->|------>|------>|
* offset chars chars1 chars2
* --pos--->|<--------count------->|
*/
/* ÏòÖ¸¶¨É豸´Ó¸ø¶¨Æ«ÒÆ´¦Ð´ÈëÖ¸¶¨³¤¶È×Ö½ÚÊý¾Ý£¬count - Òª´«Ë͵Ä×Ö½ÚÊý */
/* dev - É豸ºÅ£»pos - É豸ÎļþÖÐÆ«ÒÆÁ¿Ö¸Õ룻buf - Óû§µØÖ·¿Õ¼äÖлº³åÇøµØÖ· */
int block_write(int dev, long * pos, char * buf, int count)
{
// ¶ÔÓÚÄÚºËÀ´Ëµ£¬ ......
/*
* linux/fs/fcntl.c
*
* (C) 1991 Linus Torvalds
*/
#include <string.h>
#include <errno.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <asm/segment.h>
#include <fcntl.h>
#include <sys/stat.h>
extern int sys_close(int fd);
/* ¸´ÖÆÎļþ¾ä±ú£¬²ÎÊýfdÊÇÖ¸Óë¸´ÖÆµÄÎļþ¾ä±ú£¬argÊÇÖ¸¶¨ÐÂÎļþµÄ¾ä±úµÄ×îСֵ */
static int dupfd(unsigned int fd, unsigned int arg)
{
// Èç¹ûÎļþ¾ä±úÖµ´óÓÚÒ»¸ö³ÌÐò×î¶à´ò¿ªÎļþÊýNR_OPEN£¬»òÕ߸þä±úµÄÎļþ½á¹¹²»´æÔÚ£¬Ôò³ö´í£¬
// ·µ»Ø³ö´íÂë²¢Í˳ö
if (fd >= NR_OPEN || !current->filp[fd])
return -EBADF;
// Èç¹ûÖ¸¶¨µÄоä±úÖµarg ´óÓÚ×î¶à´ò¿ªÎļþÊý£¬Ôò³ö´í
if (arg >= NR_OPEN)
return -EINVAL;
// ÔÚµ±Ç°½ø³ÌµÄÎļþ½á¹¹Ö¸ÕëÊý×éÖÐѰÕÒË÷ÒýºÅ´óÓÚµÈÓÚarg µ«»¹Ã»ÓÐʹÓõÄÏî
while (arg < NR_OPEN)
if (current->filp[arg])
arg++;
else
break;
// Èç¹ûÕÒµ½µÄоä±úÖµarg ´óÓÚ×î¶à´ò¿ªÎļþÊý£¬Ôò³ö´í
if (arg >= NR_OPEN)
return ......
/*
* linux/fs/inode.c
*
* (C) 1991 Linus Torvalds
*/
#include <string.h>
#include <sys/stat.h> // Îļþ״̬ͷÎļþ
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <asm/system.h>
struct m_inode inode_table[NR_INODE]={{0,},}; // ÄÚ´æÖÐi ½Úµã±í
static void read_inode(struct m_inode * inode);
static void write_inode(struct m_inode * inode);
/* µÈ´ýÖ¸¶¨µÄi ½Úµã¿ÉÓà */
static inline void wait_on_inode(struct m_inode * inode)
{
cli();
while (inode->i_lock) // // Èç¹ûi ½ÚµãÒѱ»Ëø¶¨
sleep_on(&inode->i_wait); // ²»¿ÉÖжϵĵȴý״̬
sti();
}
/* ¶ÔÖ¸¶¨µÄi ½ÚµãÉÏËø */
static inline void lock_inode(struct m_inode * inode)
{
cli();
while (inode->i_lock)
sleep_on(&inode->i_wait);
inode->i_lock=1; // ÖÃËø¶¨±êÖ¾
sti();
}
/* ¶ÔÖ¸¶¨µÄi ½Úµã½âËø */
static inline void unlock_inode(struct m_inode * inode)
{
inode->i_lock=0; // ¸ ......
/*
* ioctl.c ÎļþʵÏÖÁËÊäÈë/Êä³ö¿ØÖÆÏµÍ³µ÷ÓÃioctl()£¬¸Ãº¯Êý
* Ö÷ÒªÊǵ÷Óú¯Êýtty_ioctl()¶ÔÖն˵ÄIO½øÐпØÖÆ
*/
/*
* linux/fs/ioctl.c
*
* (C) 1991 Linus Torvalds
*/
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
#include <linux/sched.h>
extern int tty_ioctl(int dev, int cmd, int arg);
typedef int (*ioctl_ptr)(int dev,int cmd,int arg);
/* ¶¨ÒåϵͳÖÐÉ豸ÖÖÊý */
#define NRDEVS ((sizeof (ioctl_table))/(sizeof (ioctl_ptr)))
/* ioctl ²Ù×÷º¯ÊýÖ¸Õë±í */
static ioctl_ptr ioctl_table[]={
NULL, /* nodev */
NULL, /* /dev/mem */
NULL, /* /dev/fd */
NULL, /* /dev/hd */
tty_ioctl, /* /dev/ttyx */
tty_ioctl, /* /dev/tty */
NULL, /* /dev/lp */
NULL}; /* named pipes */
/* ÊäÈëÊä³ö¿ØÖƺ¯Êý */
int sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
{
struct file * filp;
int dev,mode;
// Èç¹ûÎļþÃèÊö·û³¬³ö¿É´ò¿ªµÄÎļþÊý£¬»òÕß¶ÔÓ¦ÃèÊö·ûµÄÎļþ½á¹¹Ö¸ ......
LinuxÎļþ²éÕÒÃüÁîfind,xargsÏêÊö
Ò»¡¢find ÃüÁî¸ñʽ
1¡¢findÃüÁîµÄÒ»°ãÐÎʽΪ£»
find pathname -options [-print -exec -ok ...]
2¡¢findÃüÁîµÄ²ÎÊý£»
pathname: findÃüÁîËù²éÕÒµÄĿ¼·¾¶¡£ÀýÈçÓÃ.À´±íʾµ±Ç°Ä¿Â¼£¬ÓÃ/À´±íʾϵͳ¸ùĿ¼¡£
-print£º findÃüÁƥÅäµÄÎļþÊä³öµ½±ê×¼Êä³ö¡£
-exec£º findÃüÁî¶ÔÆ¥ÅäµÄÎļþÖ´ÐиòÎÊýËù¸ø³öµÄshellÃüÁî¡£ÏàÓ¦ÃüÁîµÄÐÎʽΪ'command' { } \;£¬×¢Òâ{ }ºÍ\£»Ö®¼äµÄ¿Õ¸ñ¡£
-ok£º ºÍ-execµÄ×÷ÓÃÏàͬ£¬Ö»²»¹ýÒÔÒ»ÖÖ¸üΪ°²È«µÄģʽÀ´Ö´ÐиòÎÊýËù¸ø³öµÄshellÃüÁÔÚÖ´ÐÐÿһ¸öÃüÁî֮ǰ£¬¶¼»á¸ø³öÌáʾ£¬ÈÃÓû§À´È·¶¨ÊÇ·ñÖ´ÐС£
3¡¢findÃüÁîÑ¡Ïî
-name
°´ÕÕÎļþÃû²éÕÒÎļþ¡£
-perm
°´ÕÕÎļþȨÏÞ²éÕÒÎļþ¡£
-prune
ʹÓÃÕâһѡÏî¿ÉÒÔʹfindÃüÁî²»ÔÚµ±Ç°Ö¸¶¨µÄĿ¼ÖвéÕÒ£¬Èç¹ûͬʱʹÓÃ-depthÑ¡ÏÄÇô-prune½«±»findÃüÁîºöÂÔ¡£
-user
°´ÕÕÎļþÊôÖ÷À´²éÕÒÎļþ¡£
-group
°´ÕÕÎļþËùÊôµÄ×éÀ´²éÕÒÎļþ¡£
-mtime -n +n
°´ÕÕÎļþµÄ¸ü¸Äʱ¼äÀ´²éÕÒÎļþ£¬ - n±íʾÎļþ¸ü¸Äʱ¼ä¾àÏÖÔÚnÌìÒÔÄÚ£¬+ n±íʾÎļþ¸ü¸Äʱ¼ä¾àÏÖÔÚnÌìÒÔǰ¡£findÃüÁÓÐ-atimeºÍ-ctime Ñ¡Ïµ«ËüÃǶ¼ºÍ-m timeÑ¡Ïî¡£
-n ......