linux_011
文章平均质量分 61
傲世阿龍
这个作者很懒,什么都没留下…
展开
-
linux0.11中head.s分析
/**注意!32位启动代码是从绝对地址0x0000 0000开始的,这里同样也是页目录*将要存在的地方,因此启动代码会被页目录覆盖掉*/.text.globl _idt,_gdt,_pg_dir,_tmp_floppy_area_pg_dir: !页目录将会放在这里startup_32: /**注意!!!这里已处于3位运行模式,因此这里的0x10并不是把地址0x10放入到原创 2017-05-03 11:06:08 · 821 阅读 · 0 评论 -
linux-011之utime.h头文件
#ifndef _UTIME_H#define _UTIME_H#includestruct utimbuf{ time_t actime; //文件访问时间 time_t modtime; //文件修改时间};//设置文件访问和修改时间函数extern int utime(const char*filename,struct utimbuf*times);原创 2017-05-07 17:37:55 · 922 阅读 · 0 评论 -
linux-011之termios.h头文件
#ifndef _TERMIOS_H#define _TERMIOS_H#define TTY_BUF_SIZE 1024 //tty缓冲区长度/**0x54只是一个魔数,目的是位来使这些常数唯一*tty设备的ioctl调用命令集合,iosctl将命令编码在低位字中*下面TC的含义是tty控制命令*///取相应终端termios结构中的信息#define TCGETS原创 2017-05-07 13:40:41 · 6914 阅读 · 0 评论 -
linux-011之stdarg.h头文件
#ifndef _STDARG_H#define _STDARG_Htypedef char * va_list; //定义va_list是一个字符类型指针/**取整后的TYPE类型的字节长度值,是int长度(4)的倍数*/#define _va_rounded_size(TYPE) \(((sizeof(TYPE)+sizeof(int)-1)/sizeof(int))*原创 2017-05-05 09:22:25 · 1101 阅读 · 1 评论 -
linux-001之头文件signal.h
#ifndef _SIGNAL_H#defing _SIGNAL_H#includetypedef int sig_atomic_t;typedef unsigned int sigset_t;#define _NSIG 32 //定义信号#define NSIG _NSIG#define SIGHUP 1 //hang up 挂断控制终端或进程原创 2017-05-04 16:51:32 · 3573 阅读 · 0 评论 -
linux_011之const.h头文件
#ifndef _CONST_H#define _CONST_H#define BUFFER_END 0x200000/* i节点数据结构中i_mode字段的标志位 */#define I_TYPE 0170000/*指明i节点类型*/#define I_DIRECTORY 0040000/*目录文件*/#define I_REGULAR原创 2017-05-04 08:16:35 · 460 阅读 · 0 评论 -
linux_011之库函数wait.c
#define _LIBRARY_#include#include/*等待调用头文件.定义了系统调用wait和waitpid及相关常数符号*//**等待进程终止系统调用函数*下面宏函数对应:pid_t waitpid(pid_t pid,int* wait_stat, * int options)*参数:pid-等待被终止进程的进程id,或者是用于指定原创 2017-05-03 23:13:19 · 393 阅读 · 0 评论 -
linux0.11中bootsect.s文件分析
.globl begtext,begdata,begbss,ebdtext,enddata,endbss.textbegtext:.databegdata:.bssbegbss:.text:SETUPLEN = 4 !setup.s占4个扇区BOOTSEG = 0x07c0 !启动地址INITSEG = 0x9000 !启动原创 2017-05-02 11:28:53 · 629 阅读 · 2 评论 -
linux0.11内存管理之page.s文件
!page.s包括页异常处理程序,(中断14),主要分两种情况处理.一是由于缺页引起的!页异常中断,通过调用do_no_page(err_code,address)来处理,二是由页写保护引起!的页异常,此时通过调用页写保护处理函数do_wp_page(err_code,address)处理哦!其中出错码(err_code)由CPU自动产生并压入堆栈,出现异常时访问的线性地址是从控制!寄存器原创 2017-05-03 13:22:23 · 478 阅读 · 0 评论 -
linux011之内存管理的makefile分析
CC=gcc #GNU C 语言编译器CFLAGS=-O -Wall -fstrength-reduce -fcombine-regs -fomit-frame-pointer\ -finline-functions -nostdinc -I../include#C编译程序选项.-Wall显示所有的警告信息;-O优化选项,优化代码长度和执行时间;#-fstrength-reduc原创 2017-05-03 14:19:12 · 453 阅读 · 0 评论 -
linux-011之库函数_exit.c文件解析
/*::"a"(_NR_exit)*程序调用内核的退出系统调用函数*/#define _LIBRARY_#include/**内核使用的程序终止函数.*直接调用系统中断int 0x80,功能号_NR_exit.*参数exit_code--退出码*/volatile void _exit(int exit_code){ /* * %0-ea原创 2017-05-03 22:12:24 · 781 阅读 · 0 评论 -
linux_011之库文件close.c解析
#define _LIBRARY_#include /*linux标准头文件.定义了各种符号常量并申明了各种函数.如定义了__LIBRARY__,还含系统调用号和内嵌汇编syscall0()等*//**关闭文件函数.下面该调用宏函数对应:int close(int fd).直接调用了*系统中断int 0x80,参数是__NR_close*其中fd是文件描述符*/_sysca原创 2017-05-03 22:18:08 · 268 阅读 · 0 评论 -
linux_011之库文件dup.c解析
#define _LIBRARY_#include/**复制文件描述符函数*下面该调用宏函对应:int dup(int fd).直接调用了系统中断int 0x80*参数是_NR_dup,其中fd是文件描述符*/_syscall1(int,dup,int,fd);该程序包括一个创建文件描述符拷贝的函数dup().在成功返回后,新的和原来的描述符可以交替原创 2017-05-03 22:28:43 · 506 阅读 · 0 评论 -
linux_011之库函数execve.c解析
#define _LIBRARY_#include/**加载并执行子进程(其他程序)函数*下面该调用宏函数对应:int execve(const char*file,char**argv, * char** envp).参数file被执行程序文件名,argv命令行参数指针数组*envp环境变量指针数组,直接调用了系统中断int 0x80,参数是* _NR_execv原创 2017-05-03 22:38:01 · 259 阅读 · 0 评论 -
linux_011-open.c库文件解析
#define _LIBRARY_#include#include/*标准参数头文件.以宏的形式定义变量参数列表.主要说明了一个类型(va_list)和三个宏(va_start,va_arg,va_end),用于vsprintf,vprintf,vfprintf函数*//**打开文件函数.打开并有可能创建一个文件*参数:filename文件名,flag文件打开标志*返回原创 2017-05-03 22:51:33 · 347 阅读 · 0 评论 -
linux_011之库函数string.c
#ifndef __GNUC__ //需要GNU编译器#error I want gcc!#endif#define exterm#define inline#define _LIBRARY_#include/*所有字符操作函数都在string.h中实现,故只要包含头文件就好*/原创 2017-05-03 23:12:44 · 237 阅读 · 0 评论 -
linux011-unstd.h头文件
#ifndef _UNISTD_H#define _UNISTD_H//指出符合IEEE标志1003.1实现的版本#define _POSIX_VERSION 19808L//chown和fchown的使用受限于进程的权限#define _POSIX_CHOWN_RESTRICTRD//长于(name max)的路径名将产生错误,不会自动截断#define _POSIX_NO_TRU原创 2017-05-07 17:34:39 · 1024 阅读 · 0 评论 -
linux-011之string.h头文件
#ifndef _STRING_H#define _STRING_H#ifndef NULL#define NULL ((void *)0)#endif#ifndef _SIZE_T#define _SIZE_Ttypedef unsigned int size_t; #endifextern char * strerror(int errno);/**这个字符串头文件原创 2017-05-07 11:09:48 · 2558 阅读 · 0 评论 -
linux-011之io.h头文件
/硬件端口字节输出函数**参数:value-要输出的字节,port-端口*/#define outb(value,port) \__asm__("outb %%al,%%dx"::"a"(value),"d"(port));/*硬件端口输入函数*参数:port-端口。返回读取的字节*/#define intb(port)原创 2017-05-07 17:49:52 · 3344 阅读 · 0 评论 -
linux-011之segment.h头文件
/*读取fs段中指定地址处的字节*参数:addr-指定的内存地址*%0-(_v),%1-内存地址*返回:返回内存fs:[addr]处的字节*/extern inline unsigned char get_fs_byte(const char*addr){ unsigned register char _v; __asm__("movb %%fs:%1,%0":"=r"(_v):"原创 2017-05-07 18:14:21 · 764 阅读 · 0 评论 -
一站式linux0.11内核head.s代码段图表详解
阅读本文章需要的基础: 计算机组成原理:针对8086,80386CPU架构的计算机硬件体系要有清楚的认知,我们都知道操作系统是用来管理硬件的,那我们就要对本版本的操作系统所依赖的硬件体系有系统的了解,有了系统的了解后才能全面的管理它,我们对8086,80386CPU架构的计算机硬件体系如果有非常深刻的认识,我们看源代码内核的时候,就可以更可能的以一种开发者的角度去思考代码的作转载 2017-05-03 10:59:52 · 1206 阅读 · 0 评论 -
linux011中调度算法
/*调度函数*/void schedule(void){ int i,next,c; struct task_struct ** p;/* check alarm, wake up any interruptible tasks that have got a signal *//* *这里检查每个任务的alarm值,如果已经过期,就设置SIGALRM信号,并设置alarm为0.唤原创 2017-07-14 15:11:38 · 288 阅读 · 0 评论 -
linux-011文件系统超级块的操作函数(挂载卸载系统)解析
#define set_bit(bitnr,addr)({\register int _res __asm__("ax");\__asm__("bt %2 %3;setb %%al":"=a"(__res):"a"(0),\ "r"(bitnr),"m"(*(addr)));\ __res; \})/*超级块表*/struct super_block super_block[NR_原创 2017-07-11 00:17:19 · 814 阅读 · 0 评论 -
linux-011中位图操作函数(申请释放节点,申请释放block)解析
/*把addr开始一块block地址清0*/#define clear_block(addr) \__asm__("cld\n\t" \ "rep\n\t" \ "stosl" \ ::"a" (0),"c" (BLOCK_SIZE/4),"D" ((long) (addr)):"cx","di")/*把addr中偏移为nr的位置1*/#define set_bit(nr,addr原创 2017-07-10 18:08:39 · 581 阅读 · 0 评论 -
linux-011中休眠函数以及唤醒函数的分析(sleep_on,wake_up)
先看一下代码:void sleep_on(struct task_struct **p){ struct task_struct *tmp; if (!p) return; if (current == &(init_task.task)) panic("task[0] trying to sleep"); tmp = *p; *p = current; current原创 2017-07-05 10:18:20 · 1636 阅读 · 0 评论 -
linux-011文件系统节点操作函数解析
struct m_inode inode_table[NR_INODE]={{0,},};static void read_inode(struct m_inode * inode);static void write_inode(struct m_inode * inode);/*参考sleep_on函数,另一篇文中有说*/static inline void wait_on_ino原创 2017-07-10 18:04:53 · 445 阅读 · 0 评论 -
linux011文件系统中缓冲区管理函数分析
extern int end;struct buffer_head * start_buffer = (struct buffer_head *) &end;struct buffer_head * hash_table[NR_HASH];static struct buffer_head * free_list;static struct task_struct * buffer_wai原创 2017-07-10 16:20:00 · 433 阅读 · 0 评论 -
linux011文件系统中按照名字查找节点的算法分析
/* #define NO_TRUNCATE */#define MAY_EXEC 1#define MAY_WRITE 2#define MAY_READ 4static int permission(struct m_inode * inode,int mask){ int mode = inode->i_mode;/*i节点有设备号,但是链接数为0,说明是空的,为已经删除原创 2017-07-10 14:52:09 · 544 阅读 · 0 评论 -
linux-011上文件系统中超级块和inode的使用分析
总的访问线路:超级块inode在磁盘上的分布:超级块结构如下/*磁盘中存储结构*/struct d_super_block { unsigned short s_ninodes; //节点(inode)总数 unsigned short s_nzones; //逻辑块(block)总数 unsigned short s_imap_原创 2017-07-06 15:07:43 · 1593 阅读 · 0 评论 -
linux011-system.h
#define move_to_user_mode() \ //__asm__("movl %%esp,%%eax\n\t" \ //保存指针esp到eax中 "pushl $0x17\n\t" \ //首先将堆栈选择符ss入栈 "pushl %%eax\n\t" \ //将保存的堆栈指针esp入原创 2017-05-15 19:42:11 · 653 阅读 · 0 评论 -
linux_011之库函数write.c
#define _LIBRARY#include/**写文件系统调用函数.该宏函数对应于函数:*int write(int fd,const char* buf,off_t count)*参数:fd文件描述符,buf-写缓冲区指针,count-写字节数*返回:成功时返回写入的字节数(0表示写入0字节)* 出错就返回-1,并且设置了出错号*/_syscal原创 2017-05-03 23:20:01 · 312 阅读 · 0 评论 -
linux_011-_ctype.h头文件
#ifndef _CTYPE_H#define _CTYPE_H/*对应与ascii码表*/#define _U 0x01 /*大写字母*/#define _L 0x02 /*小写字幕*/#define _D 0x04 /*数字[0-9]*/#define _C 0x08 /*控制字符*/#define _P 0x10 /*标点符号*/#define原创 2017-05-04 08:14:45 · 581 阅读 · 0 评论 -
linux_011-lib-_ctype.c库文件
#includechar _ctmp;unsigned char _ctype[]={ 0x00, /*EOF*/ _C,_C,_C,_C,_C,_C,_C,_C, /*0-7 */ _C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /*8-15 */ _C,_C原创 2017-05-04 08:15:31 · 437 阅读 · 0 评论 -
linux-011-errno.h头文件
#ifndef _ERRNO_H#DEFINE _ERRNO_Hextern int errno;#define ERROR 99 /*error 一般错误*/#define EPERM 1 /*eperm 操作没有许可*/#define ENOENT 2 /*enoent 文件或目录不存在*/#define ESRCH 3 /*原创 2017-05-04 12:16:56 · 505 阅读 · 0 评论 -
linux_011之fcntl.h头文件
/*文件控制选项头文件。主要定义了函数fcntl和open中用到的一下选项*/#ifndef _FCNTL_H#define _FCNTL_H#include/*类型头文件,定义了基本的系统数据类型*/#define O_ACCMODE 00003 //文件访问模式屏蔽码#define O_RDONLY 00 //只读方式打开#define O_WRONLY原创 2017-05-04 15:29:57 · 4035 阅读 · 0 评论 -
linux-011之time.h头文件
#ifndef _TIME_H#define _TIME_H#ifndef _TIME_H#define _TIME_Htypedef long time_t;//从GMT1970年1月1日开始以秒计数的时间#endif#ifndef _SIZE_T#define _SIZE_Ttypedef unsigned int size_t;#endif#define CLOCK原创 2017-05-05 09:21:37 · 625 阅读 · 0 评论 -
linux-011之stddef.h头文件
#ifndef _STDDEF_H#define _STDDEF_H#ifndef _PTRDIFF_T#define _PTRDIFF_Ttypedef long ptrdiff_t; //两个指针相减结果类型#endif#ifndef _SIZE_T#define _SIZE_T typedef unsigned long size_t; //sizeof返回类型#en原创 2017-05-05 09:23:07 · 665 阅读 · 0 评论 -
分析linux011版本中inode节点使用直接块,间接块所能表示的一个文件的大小
inode节点的映射图如下:计算过程:计算一个节点使用直接,一次间接块,二次间接块能表示的文件的大小:前提:每块大小1024字节,每个块号使用32位(4字节)1,直接快:使用直接块时,一个块号表示一个块,也就是1K字节2,一个一次间接块:一个间接块大小为1024,其能记录的块的数量为1024/4(32位)=256,也就是说一个间接块可以记录256个块的地址,也就原创 2017-07-07 09:43:21 · 2931 阅读 · 0 评论