
linux
Fred-XU
https://www.zhihu.com/people/fredric-96
展开
-
AT&T 内联汇编注记
AT&T标准的汇编相对X86汇编主要有以下几点区别:%eax,加%表示寄存器,在内联中要加%% $0x04,立即数加$ 目的地址与源地址相反,mov %eax(源), %ebx(目的) 指令后加操作数长度,如movb(8 bit)、movw(16 bit)、movl(32 bit) 内存引用,如下:X86语法格式:section:[base + index*scale +...原创 2013-01-29 16:45:00 · 557 阅读 · 0 评论 -
linux 0.11 源码学习(十三)
字符设备驱动在linux 0.11版本中,字符设备驱动源码分为三块:向上暴露的字符设备驱动接口tty_io.c与tty_ioctl.c,与块设备驱动一样,在字符驱动文件(read_write.c)操作中被调用;实现串口的驱动rs_io.s和serial.c;实现键盘驱动的keyboard.s以及实现控制台输出的console.c。对于字符设备驱动linux为每个设备维护一个tty_stru...原创 2013-05-11 15:04:00 · 219 阅读 · 0 评论 -
linux 0.11 源码学习(十四)
文件系统综述linux 文件系统是基于MINIX 1.0文件系统,这部分的代码量是整个内核里最大的,但代码结构对应着MINIX文件系统的构成,还是比较清晰易读的。MINIX文件系统MINIX的文件系统由以下几部分组成:引导块:由BIOS自动读入的执行代码,这部分不在文件系统里描述; 超级块:存放盘设备上文件系统的信息,如逻辑块数、i节点数、最大文件长度等;对应结构体super_b...原创 2013-05-11 16:01:00 · 439 阅读 · 0 评论 -
Linux 2.6 源码学习-概述
linux 2.6 是当前比较主流的操作系统内核,一直想花时间系统的学习一遍。回顾之前研究的内核源码经历,ucos作为一个嵌入式操作系统,其版本2的总代码不超过5K,如果一个有研发经验、操作系统基础的工程师2,3周就可以深入的过一遍。linux 0.11版本就要复杂的多,虽然代码行也不超过15K,并且单个文件也没有超过1K(映像是大的也就7,800),但由于保护模式、设备驱动、文件系统、段页式内存...原创 2013-06-02 10:44:00 · 501 阅读 · 0 评论 -
Linux 2.6 源码学习-内存管理-buddy算法
核心数据结构linux 2.6 的内存管理支持NUMA(Non Uniform Memory Access Achitecture),即非一致内存访问体系,在该体系中存在多个CPU,并且拥有分离的存储器以及共享存储器。因此在linux的代码中将每一个CPU的可访问内存定义为一个内存节点。总体上linux采取了节点、域、页面三级结构描述物理内存,核心数据结构如下:typedef struc...原创 2013-07-10 21:25:00 · 395 阅读 · 0 评论 -
Linux 网络编程(IO模型)
针对linux 操作系统的5类IO模型,阻塞式、非阻塞式、多路复用、信号驱动和异步IO进行整理,参考《linux网络编程》及相关网络资料。阻塞模式在socket编程(如下图)中调用如下四类函数导致阻塞:读操作(read、readv、recv、recvfrom、recvmsg):当应用程序调用读函数,该系统调用进入内核态,若套接字接收缓冲区无数据则阻塞,数据到达则将接收缓冲区数据拷贝至进...原创 2013-07-16 22:24:00 · 489 阅读 · 0 评论 -
Linux 网络编程(TCP)
客户端代码#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<sys/types.h> #include<unistd.h> #include<netinet/in.h&原创 2015-06-03 15:43:00 · 265 阅读 · 0 评论 -
Linux 网络编程(UDP)
客户端代码#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<sys/types.h> #include<unistd.h> #include<netinet/in.h&原创 2015-06-03 15:44:00 · 275 阅读 · 0 评论 -
Linux 网络编程(多路复用)
服务器端代码#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<sys/types.h> #include<unistd.h> #include<netinet/in.h...原创 2015-06-03 15:45:00 · 401 阅读 · 0 评论 -
Linux 网络编程(epoll)
服务器端代码#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<sys/types.h> #include<unistd.h> #include<netinet/in.h...原创 2015-06-03 15:46:00 · 252 阅读 · 0 评论 -
linux 0.11 源码学习(十二)
块设备驱动管理linux的设备驱动管理遵循Unix的机制,向上以文件的形式暴露接口,见Read_write.c中的sys_read函数,在该系统调用函数中根据文件的类型以此调用块设备类驱动、字符设备驱动、管道和普通文件接口。对于块设备类这个分类主要针对如硬盘、软盘等以数据块为单位进行读写的设备,linux 0.11这部分的代码主要有4个.c文件,ll_rw_blk.c(块设备读写封装)、h...原创 2013-05-10 10:29:00 · 294 阅读 · 0 评论 -
linux 0.11 源码学习(十一)
memory.c在X86的保护模式中,线性地址由页目录表(10位)+页表(10位)+ 偏移(12位)组成,因此对线性地址而言可以寻址4G的地址空间。而实际中linux支持16M的内存,因此在memory.c或者说linux的内存管理模块中,维护了线性地址和实际物理地址的映射。本篇博客主要记录内存管理的几个主要函数学习。下面几个宏定义可以看出物理页面的分配数:#define USED ...原创 2013-05-09 15:29:00 · 121 阅读 · 0 评论 -
linux 0.11 源码学习(十)
signal信号是进程间通信的一种形式,signal文件实现信号处理的注册,以及信号处理函数的回调。信号在任务中的结构定义:struct task_struct { //省略 struct sigaction sigaction[32]}//定义在signal.h中struct sigaction { void (*sa_handler)(in...原创 2013-05-05 09:57:00 · 168 阅读 · 0 评论 -
linux 0.11 源码学习(一)
linux源码断断续续看过好多次,可能是工作中用到linux的项目也断断续续的,总感觉理解的东西还浮在面上。本系列文章记录对linux 0.11版本源码的学习,主要参考资料是赵炯的《Linux内核完全注释》。记得买这本书的时候还在念研究生,当时是完全看不下去,工作这些年算是粗读过,但都不求甚解,好像每次都有收获,但每次都不敢说理解这1万来行代码。今年抽年前这一两周又通读了一遍,这篇文章就作为一个引...原创 2013-02-03 20:33:00 · 790 阅读 · 0 评论 -
linux 0.11 源码学习(二)
linux 0.11的运行linux 0.11版本的编译和运行可以基于bochs,个人参考的是赵博的文章,主要是三块工作:制作linux镜像,按要求修改makefile后,可以直接在redhat上编译,生成image: 制作linux根文件镜像rootimage(即启动时存在的bin、home等目录); 设置bochs配置参数,将image和rootimage分别作为软盘A和软盘B;...原创 2013-05-01 23:01:00 · 383 阅读 · 0 评论 -
linux 0.11 源码学习(三)
bootsect.sbootsect完成的是整个内核的引导工作,简单的说就是将内核镜像中的bootsect、setup、system三部分从引导盘拷贝到内存的指定位置(当然对bootsect自己其实是已经被BIOS自动拷贝到内存0x7C00处,所以应该只能算是位置的搬迁)。bootsect依次做了如下工作:启动后首先将bootsect自身的512字节目标程序拷贝至0x9000;entr...原创 2013-05-02 20:42:00 · 338 阅读 · 0 评论 -
linux 0.11 源码学习(四)
setup.s在setup中最主要的工作是使系统进入保护模式,并转入system模块具体如下:通过BIOS中断读取系统数据,如光标、显卡、硬盘等信息,这些信息存放至内存0x9000至0x901FC处,典型代码如下:! ok, the read went well so we get current cursor position and save it for! posterity....原创 2013-05-04 08:26:00 · 216 阅读 · 0 评论 -
linux 0.11 源码学习(五)
head.shead.s 是系统模块的入口,其编译器已经是GNU汇编,但从功能上将仍然属于内核启动阶段,主要的功能是对386 CPU的初始化,如用户堆栈、IDT、GDT和页表。因此从文件夹的归属看,它仍然放在boot文件夹中,与bootsect和setup一块。head.s的核心功能(简单的寄存器初始化不做赘述)如下:初始化堆栈寄存器:lss stack_start, %esp,其中sta...原创 2013-05-04 09:27:00 · 170 阅读 · 0 评论 -
linux 0.11 源码学习(六)
main.cmain函数其实是内核的初始化,如果把内核功能比作业务软件的话,就相当于是业务的初始化,从该文件的文件夹归属(init文件夹)也可以看出这一点。main主函数很短,从代码中可以基本看出整个内核的功能模块,如下:void main(void) { //略去一部分初值设置 mem_init(main_memory_start,memo...原创 2013-05-04 09:54:00 · 230 阅读 · 0 评论 -
linux 0.11 源码学习(七)
trap.c & Asm.strap.c和Asm.s主要完成的是系统中断和陷阱的初始化定义。注:在80386体系的CPU中中断描述符表替代了中断向量表,IDT的描述符可以是中断门、陷阱门或者任务门。IDT中的中断门和陷阱门的定义如下:BYTE0/1(偏移底字节),BYTE2/3(选择子)、BYTE4/5(属性)、BYTE6/7 (偏移高字节)。通过两个字节的段描述符合四个字节的偏移...原创 2013-05-04 13:37:00 · 333 阅读 · 0 评论 -
linux 0.11 源码学习(八)
shed.csched实现内核的调度工作,最主要的是以下几个函数的实现:初始化 void sched_init(void),完成工作如下: 设置TSS和LDT的描述符: set_tss_desc(gdt+FIRST_TSS_ENTRY,&(init_task.task.tss)); //初始化一个TSS set_ldt_desc(gdt+FIRST_L...原创 2013-05-04 19:07:00 · 371 阅读 · 0 评论 -
linux 0.11 源码学习(九)
fork.cfork.c 是创建进程的功能实现,其核心函数式copy_process,被系统函数sys_fork(定义在System_call.s中)调用。因此源码学习从sys_fork开始,代码如下:sys_fork: call find_empty_process //是否还能够创建进程,0.11默认最大进程数为64 testl %eax,%eax js 1f...原创 2013-05-04 20:01:00 · 334 阅读 · 0 评论 -
linux 常用监控命令备注
1、top功能:查看系统各进程资源占用情况备注:输入P后按照CPU占用排序显示;输入M后安装内存消耗排序2、free功能:查看内存占用情况备注:无3、df功能:查看硬盘使用情况备注:增加 -T 参数 显示文件类型;也可指定针对某一个文件目录查看挂载情况4、du功能:查看某个路径下各个文件夹占硬盘的大小备注:下例中给出显示一级目录情况5...原创 2017-09-25 10:59:00 · 397 阅读 · 0 评论