
Linux内核设计的艺术
文章平均质量分 81
jltxgcy
热爱Android,热爱开源。
展开
-
Linux内核设计的艺术-从开机加电到执行main函数之前的过程
我们假定本书所用的计算机是基于 IA—32 系列 CPU, 安装了标准单色显示器、 标准键 盘、一个软驱、一块硬盘、16 MB 内存,在内存中开辟了 2 MB 内存作为虚拟盘,并在 BIOS 中设置软驱为启动设备。后续所有的讲解都以此为基础。 目前处于实模式下,内存地址为0x00000~0xFFFFF,共1MB,20位地址线,BIOS所占地址为0xFE000~原创 2014-02-17 12:40:36 · 2063 阅读 · 0 评论 -
Linux内核设计的艺术-进程间通信-信号
有两个用户进程,一个进程用来接受及处理信号,名字叫做processing。它所对应的程序源代码如下:#include #include void sig_usr(int signo){ if(signo == SIGUSR1) printf("received SIGUSR1\n"); else printf("received %d\n",signo); signa原创 2014-03-25 09:56:06 · 2022 阅读 · 0 评论 -
页写保护
1、进程A和进程B共享页面,代码如下:if (!(pid=fork())) { 压栈操作;//子进程B}if (pid>0){ 压栈操作;//父进程A} 2、我们假设现在系统有一个用户进程A,他自己对应的程序代码已经载入内存中,此时该进程内存中所占用的页面原创 2015-02-10 14:10:56 · 2232 阅读 · 2 评论 -
文件系统
一、文件系统的结构 超级块的数据结构是:struct super_block { unsigned short s_ninodes; unsigned short s_nzones; unsigned short s_imap_blocks; unsigned short s_zmap_blocks; unsigned short s_firstdatazone; unsigne原创 2015-02-09 17:32:39 · 1211 阅读 · 0 评论 -
多个用户进程同时进行
我们以三个用户进程(str1、str2、str3)为例,来看看多个进程是如何运行的,他们又是如何切换的。 进程的源代码如下,str1、str2、str3三者代码一样。#include int foo(int n){ char text[2048]; if(n==0) return 0; else { int i = 0; for(i; i<2048; i++)原创 2015-02-10 09:59:33 · 2341 阅读 · 0 评论 -
Linux 0.11总结
1、内存分布示意图 主要说一下全局描述符中的内容: 每一项都是8个字节。 第一项为全0,没有别使用。 第二项为数据段描述符原创 2015-02-11 15:24:18 · 2173 阅读 · 0 评论 -
Linux内核设计的艺术-进程2的创建及执行
1、打开终端设备文件及复制文件句柄 代码路径:init/main.c 目前处于进程1的3特权级void init(void){ int pid,i; setup((void *) &drive_info); (void) open("/dev/tty0",O_RDWR,0); (void) dup(0); (void) dup(0); ...} op原创 2014-03-03 09:56:17 · 1754 阅读 · 1 评论 -
通过进程2加载shell进程,详解execve
一直以来都对execve到底做了什么,总是犯迷糊,原来看Linux内核设计的艺术,这部分讲解的非常不细致,这次结合赵博士的书,重新理解了这部分代码。 首先列出代码,如下: if (!(pid=fork())) {//进程1创建进程2 close(0); if (open("/etc/rc",O_RDONLY,0)) _exit(1); execve("/bin/sh",ar原创 2015-02-07 14:11:27 · 2883 阅读 · 1 评论 -
通过开始执行shell进程,理解缺页异常
通过进程2加载shell进程,详解execve,这篇文章,最后shell程序开始执行的线性地址是128MB,由于free_page_tables,已经释放了第32位页目录项。所以会产生缺页异常。程序会执行,如下代码: do_no_pagevoid do_no_page(unsigned long error_code,unsigned long address)//address为128MB原创 2015-02-07 15:54:18 · 1063 阅读 · 0 评论 -
Linux内核设计的艺术-设备环境初始化及激活进程0
代码路径:init/main.c...#define DRIVE_INFO (*(struct drive_info *)0x90080)#define ORIG_ROOT_DEV (*(unsigned short *)0x901FC)...struct drive_info { char dummy[32]; } drive_info;void main(void)原创 2014-02-20 10:52:03 · 2212 阅读 · 0 评论 -
Linux内核设计的艺术-进程1的创建及执行b
代码路径:init/main.c ...static inline _syscall0(int,fork) // 对应 fork() 函数static inline _syscall0(int,pause)static inline _syscall1(int,setup,void *,BIOS) ...void main(void){ sti(原创 2014-02-24 11:58:35 · 1999 阅读 · 0 评论 -
Linux内核设计的艺术-进程间通信-管道
管道操作分为两部分,一部分是创建管道,另一部分是管道的读写操作。代码如下:#include #include int main(){ int n,fd[2]; pid_t pid; int i,j; char str1[]="ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABC原创 2014-03-24 09:47:14 · 1603 阅读 · 0 评论 -
Linux内核设计的艺术-多进程操作文件的综合实例
进程A是一个写盘进程,目的是往hello1.txt文件中写入str[]中的字符“ABCED”,代码如下:void FunA();void main(){ ... FunA(); ...}void FunA(){ char str1[]="ABCDE"; int i,j; int fd = open("/mnt/user/user1/user2/hello1.txt",O原创 2014-03-23 21:18:53 · 1408 阅读 · 0 评论 -
Linux内核设计的艺术-用户进程与内存管理、缓冲区和多进程操作文件
1、用户进程与内存管理 父子进程共享同一页面,如果这个页面设置为可写状态,那么两个进程同时写一个页面会造成混乱,所以此时页表表项后三位设置为101,U/S=1,R/W=0,P=1。对应代码如下: 代码路径:mm/memory.cint copy_page_tables(unsigned long from,unsigned long to,long size原创 2014-03-13 10:09:18 · 1688 阅读 · 0 评论 -
Linux内核设计的艺术-关于缓冲块的进程等待队列
进程A是一个读盘进程,目的是将hello.txt文件中的100字节读入buffer[100]。 代码如下:void FunA();void main(){ ... FunA(); ...}void FunA(){ char buffer[100]; int i,j; int fd = open("/mnt/user/user1/user2/hello.txt"原创 2014-03-23 17:11:31 · 1663 阅读 · 1 评论 -
Linux内核设计的艺术-文件操作
1、安装文件系统 在shell下输入mount /dev/hd1 /mnt,shell进程接到命令后,会创建一个新进程,新进程调用mount()函数,并最终映射到sys_mount函数执行 代码路径:fs/super.cint sys_mount(char * dev_name, char * dir_name, int rw_flag)//dev_name为/dev原创 2014-03-09 21:28:15 · 1835 阅读 · 0 评论 -
Linux内核设计的艺术-前三章总结
特权级变化的本质是,cs,ds,es,fs,gs,ss的不同,特权级0从GDT中取得描述符,前面这些寄存器后3位为000,描述符特权级为00,特权级3从LDT中取得描述符,前面这些寄存器后3位为111,描述符特权级为11。中断int 0x80从特权级3进入特权级0,并把信息保存在特权级0的堆栈中,iret从特权级0返回特权级3。进程切换的本质是在内核态把当前寄存器的值(内核态数据)放入当前进程原创 2014-03-02 13:58:26 · 1948 阅读 · 0 评论 -
中断机制
中断分为非屏蔽中断和屏蔽中断。异常又分为故障和陷阱。 异常的向量和非屏蔽中断的向量和是固定的,而屏蔽中断的向量可以通过对中断控制器的编程来改变。Linux对256个向量的分配如下: 1、从0~31的向量对应于异常和非屏蔽中断。 2、从32~47的向量(即由I/O设备引起的中断)分配给屏蔽中断。 3、剩余的从48~255的向量用来标识软中断。Linux只用了其中的一个(即12原创 2015-02-09 15:32:06 · 1235 阅读 · 0 评论