操作系统
枯萎的海风
向来缘浅, 奈何情深, 彼此豆蔻,谁许谁地老天荒, 敌不过似水流年, 逃不过此间少年
展开
-
Linux 内核源代码情景分析 chap 2 存储管理 (三)
1. 越界访问1.1 页面异常页式存储机制通过页面目录和页面表将每个线性地址(或者虚拟地址), 转化成物理地址。 然而, 如果在这个过程中遇到某种阻碍的话, 就会产生一次页面异常, 也称缺页异常。 主要有下面 3 中障碍: 1. 相应的页面目录项或者页面表项为空, ie, 线性地址到物理地址的映射关系并未建立或者已经被撤销。 2. 相应的物理页面不在内存中, 有页面描述项 vma 结构 3.原创 2016-03-29 19:16:12 · 1279 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day4 C语言与画面显示的练习
1. 用C语言实现内存写入 1. 需要注意的是, 函数的参数列表中, 第一个数字存放地址 【ESP + 4】, 第二个 为 【ESP + 8】。。。 2. ESP 实际上是栈寄存器的指针, AX 默认用来作为函数返回的寄存器 3. 可以自由使用的寄存器主要有 EAX, ECX, EDX,其他寄存器只能使用它的值, 不能随意改变 4. naskfunc.nas 中 INSTRSET 指令告诉n原创 2016-11-29 10:00:43 · 661 阅读 · 0 评论 -
[读书笔记]程序员的自我修养 chp11
11.1 入口函数和程序初始化11.1.1 程序从main 开始吗程序有一个入口函数 entry point, 实际上是 程序的初始化和结束部分, 他往往是运行库的一个部分一个典型的程序运行步骤: 操作系统创建进程, 把控制权交给程序的入口,这个入口, 往往是运行库中的某个入口函数入口函数对运行库和程序运行环境进行初始化, 包括堆, IO, 线程, 全局变量构造 etc入口函数在完成初始化原创 2016-12-11 21:43:39 · 413 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day5 结构体, 文字显示与GDT/IDT初始化
1. 接收启动信息采用结构体, 将各个独立的变量联系起来, 让程序有更好的可读性 原始未使用 结构体的代码:void HariMain(void){ char *vram; int xsize, ysize; short *binfo_scrnx, *binfo_scrny; int *binfo_vram; init_palette(); bi原创 2016-12-03 13:16:14 · 501 阅读 · 0 评论 -
[读书笔记]程序员的自我修养 chp9
9.1 DLL 简介dll 文件的扩展名不一定是 dll, 也可以是 ocxdll 文件相比于linux 的共享对象, 更加强调模块化9.1.1 进程地址空间和内存管理一个dll 在不同的进程中拥有不同的私有数据的副本, 这个类似 ELF 共享对象, 不过由于ELF 中代码段是地址无关的, 可以实现多个进程共享一份代码, 但是dll 代码却并不是地址无关的, 因而只能在某些情况下被多个进程间原创 2016-12-04 11:41:43 · 418 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day1 从计算机结构到汇编程序入门
1. 前言我们参考书籍为: http://download.csdn.net/detail/zhyh1435589631/9689118 http://download.csdn.net/detail/zhyh1435589631/9689127 附带光盘: http://download.csdn.net/detail/zhyh1435589631/96891052. 实现2.1 二进制文原创 2016-11-21 19:16:35 · 859 阅读 · 0 评论 -
[读书笔记]程序员的自我修养 chp10
10.1 程序的内存布局一个32bit 指针的寻址空间是 4GB, 其中一部分空间会被分配给内核空间, 剩余部分给用户 可以很容易看到栈是向低地址增长, 堆是向高地址增长10.2 栈和调用惯例10.2.1 什么是栈经典的 i386 系统中, 栈总是向下增长的, 栈顶通过 esp 寄存器定位, 压栈操作使得栈顶的地址减少, 弹出操作使得栈顶地址增大 栈通常用来维护 一个函数调用所需要的信息原创 2016-12-04 21:07:52 · 394 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day6 分割编译与中断处理
1. 分割源文件由于原先的bootpack.c 太过冗长, 将他分割成几个部分 同时为了节省声明所占空间, 使用 头文件2. 整理Makefile将多个类似的编译规则, 使用一般规则进行合并, 简化书写一般而言, 普通规则的优先级比一般规则要高 (类似于 C++ 模板 和 偏特化情形)4. 意犹未尽4.1 load_gdtr_load_gdtr: ; void load_gdtr(原创 2016-12-06 12:44:07 · 687 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day2 汇编语言学习与Makefile入门
阅读相应的启动代码 ; hello-os; TAB=4 ORG 0x7c00 ; このプログラムがどこに読み込まれるのか; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 JMP entry DB 0x90 DB "HELLOIPL" ; ブートセクタ原创 2016-11-25 16:53:08 · 647 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day7 FIFO与鼠标控制
1. 获取按键编码这里需要特别注意的是,需要采用io_out8(PIC0_OCW2, 0x61);来通知cpu IRQ-01上面的中断已经处理完毕。如果不写这句话的话, cpu会忽略后续IRQ-01 上传递过来的中断信号。其他 IRQ-n 对应的编码应该为: 0x60 + n#define PORT_KEYDAT 0x0060void inthandler21(int *esp){原创 2016-12-08 21:16:10 · 493 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day3 进入32bit模式并导入C语言
1. 制作真正的IPLIPL 启动程序装载器, 用来装载程序分析代码; haribote-ipl; TAB=4 ORG 0x7c00 ; このプログラムがどこに読み込まれるのか; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 JMP entry DB 0x90 DB原创 2016-11-26 22:28:37 · 972 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day9 内存管理
1. 内存容量检查由于内存和CPU的距离比CPU内部元件之间的距离要远很多, 因此,在寄存器内部使用 mov 要比 从寄存器MOV 到内存快很多另外, 由于寄存器的速度快, 但是存储的容量非常有限, 所以不得不频繁的使用内存为了解决这个问题, IBM 引入了 高速缓存存储器 (cache memory), 但是成本非常高本质上呢, 我们可以讲这个高速缓存器件理解成是一个类似缓冲区的概念 2.原创 2016-12-17 16:45:49 · 620 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day8 鼠标控制与32位模式切换
1. 鼠标解读一个鼠标事件实际上会产生 3 个byte 的数据, 可以借助缓冲区 unsigned char mouse_dbuf[3], 对其数据进行输出显示同时为了提高代码可读性, 采用 MOUSE_DEC 结构体对其进行封装鼠标的三个字节数据保存在 buf[3] 中, 其中 buf[0] 的 低3 bit 表征鼠标的按键状态, buf[1], buf[2] 表征鼠标 x, y 的相对移动原创 2016-12-15 11:43:54 · 961 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day11 制作窗口
1. 显示窗口本质上, 这个有点类似于鼠标的显示, 在VRAM 的相应位置写入相应的数据即可显示效果: void make_window8(unsigned char *buf, int xsize, int ysize, char *title){ static char closebtn[14][16] = { "OOOOOOOOOOOOOOO@",原创 2016-12-23 15:35:41 · 591 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day10 叠加处理
1. 内存管理虽然我们采用列表式管理, 但是由于我们的列表的条目是非常有限的,如果不经约束的进行内存的分配和释放的话, 可能会造成在内存中出现有很多不连续的小段的未使用空间, 这样就容易会把内存空间耗尽我们采用的方式是通过以 0x1000 字节(4KB) 作为单位进行管理 3.内存管理相关代码: 内存分配的时候, 从前向后遍历, 找到第一块满足需要的内存块进行操作即可通过4KB 为单位进行原创 2016-12-19 10:51:41 · 546 阅读 · 0 评论 -
程序员的自我修养 读书笔记 chp5,chp6
5.1 windows的二进制文件格式PE/COFFwindows 平台, 引入一种称为PE的可执行格式,他有着跟ELF一样良好的平台扩展性,和ELF一样都是从COFF发展而来的6.1 进程虚拟地址空间进程: 是一个动态概念, 程序是一个静态概念linux 中原则上 进程可以有 3GB的进程空间(剩下 1GB 给操作系统), windows 中原则上只有2G(2G给操作系统)PAE: 32原创 2016-11-04 22:53:27 · 544 阅读 · 0 评论 -
多线程模拟实现生产者/消费者模型
点我进入原文 题目如下: 在生产者/消费者模型中,生产者Producer负责生产数据,而消费者Consumer负责使用数据。多个生产者线程会在同一时间运行,生产数据,并放到内存中一个共享的区域。期间,多个消费者线程读取内存共享区,消费里面的数据。 分析在下面Java应用程序中,生产者线程向一个线程安全的堆栈缓冲区中写(PUSH)数据,消费者从该堆栈缓冲区中转载 2016-09-11 19:57:47 · 1832 阅读 · 0 评论 -
进程间通信机制IPC
点我进入原文地址IPC通信的几种方式, 备份一下, 方便自己查阅1、管道管道主要用于具有亲缘关系的进程间通信,允许一个进程和另一个与它有共同祖先的进程通信。比如fork或exec创建的新进程。在使用exec创建新进程时,需要将管道的文件描述符作为参数传递给exec创建的新进程。pipe函数原型:#include int pipe(int file转载 2016-03-18 22:46:33 · 466 阅读 · 0 评论 -
同步和异步的理解
点我进入原文地址个人感觉: 同步和异步的概念有点像 阻塞 和 非阻塞 的概念。同步和异步的概念对于很多人来说是一个模糊的概念,是一种似乎只能意会不能言传的东西。其实我们的生活中存在着很多同步异步的例子。比如:你叫我去吃饭,我听到了就立刻和你去吃饭,如果我们有听到,你就会一直叫我,直到我听见和你一起去吃饭,这个过程叫同步;异步过程指你叫我去吃饭,然后你就去吃饭了,而不管我是否和你一起转载 2016-03-18 23:00:44 · 1490 阅读 · 0 评论 -
Centos 7 安装过程中的一些坑
1. 前言由于昨天配置 PHP + nginx 的时候, 需要用到 php-fpm 的东西, 而这个软件虽然说已经集成到了 PHP 7 中去了, 可是我们一开始编译 PHP 的时候, 并没有添加这个选项, 等到添加了这个选项 再 configure 的时候, 就编译不了, 在网上找了好多资料无果之后, 决定更换系统, 换成 Centos。2. 制作U盘启动项由于我们之前在 虚拟机中安装过 cento原创 2016-03-31 17:04:39 · 3176 阅读 · 0 评论 -
Linux 内核源代码情景分析 chap 2 存储管理 (四)
物理页面的使用和周转1. 几个术语1.1 虚存页面指虚拟地址空间中一个固定大小, 边界与页面大小 4KB 对齐的区间及其内容1.2 物理页面与虚存页面相对的, 需要映射到某种物理存储介质上面的页面。 根据他是否在内存中, 我们可以分为 内存页面 和 盘上页面。 另外, 通常说物理内存页面的分配和释放是指 物理介质, 而谈及页面的换入和换出的时候, 是指他的内容。1.3 交换技术当系统内存不够用的时原创 2016-04-02 17:20:27 · 1519 阅读 · 0 评论 -
Linux 内核源代码情景分析 chap 1 预备知识
最近一段时间面试了一些公司后发现, 自己对操作系统的一些概念还是理解的不够深刻, 之前看的是《操作系统概念 第六版》, 这次觉得应该加点难度, 正好就开始看这本《Linux 内核源代码情景分析》好了。1.1 Linux内核简介1. 微内核和宏内核的区别内核中提供各种服务的成分和使用这些服务的进程之间形成了一种典型的Client/Server 关系, 由于有些服务提供者并不是一定非得留在内核中, 他们原创 2016-03-25 17:24:24 · 542 阅读 · 0 评论 -
C++11 中的线程、锁和条件变量
点我进入原文C++11 中的线程、锁和条件变量线程类std::thread代表一个可执行线程,使用时必须包含头文件。std::thread可以和普通函数,匿名函数和仿函数(一个实现了operator()函数的类)一同使用。另外,它允许向线程函数传递任意数量的参数。12345678转载 2016-03-25 20:13:06 · 895 阅读 · 0 评论 -
Ubuntu默认防火墙安装、启用、配置、端口、查看状态相关信息
点我进入原文Ubuntu11.04默认的是UFW(ufw 即uncomplicated firewall的简称,不复杂的防火墙,繁琐部分的设置还是需要去到iptables)防火墙,已经支持界面操作了。在命令行运行ufw命令就可以看到提示的一系列可进行的操作最简单的一个操作:sudo ufw status(如果你是root,则去掉sudo,ufw转载 2016-03-26 22:38:00 · 1786 阅读 · 0 评论 -
Linux 内核源代码情景分析 chap 2 存储管理(一)
2.1 Linux 内存管理的基本框架1. i386 CPU 中的内存管理的基本思路通过页面目录和页面表分为两个层次, 实现从线性地址到物理地址的映射。 这种模式在大多数的情况下面可以节省页面表所占用的空间, 因为很多时候, 我们的进程是用不到整个虚存空间的。但是Linux 内核设计需要考虑在不同CPU上面的实现, 既要兼容 i386 又要兼容 64 bit的 CPU。因此, Linux 内核的映射原创 2016-03-26 23:28:14 · 963 阅读 · 0 评论 -
Linux 内核源代码情景分析 chap2 存储管理(二)
几个重要的数据结构和函数1. 物理地址管理1.1 pgd_t, pmd_t, pte_t页面目录PGD, 中间目录PMD 和 页面表PT 分别是由 pgd_t, pmd_t, pte_t 构成的数组, 下面给出他们的定义:==================== include/asm-i386/page.h 36 50 ====================36 /*37 * Thes原创 2016-03-28 20:39:15 · 1049 阅读 · 0 评论 -
互斥对象、事件对象、关键代码段的应用和比较
原文地址1原文地址2互斥对象、事件对象、关键代码段的应用和比较 线程同步的方式主要有三种:互斥对象、事件对象和关键代码段。一. 互斥对象 互斥对象(mutex)属于内核对象,它能够确保线程拥有对单个资源的互斥访问权。互斥对象包含一个使用数量,一个线程ID和一个计数器。其中线程ID用于标识系统中的哪个线程当前拥有互斥转载 2016-05-15 22:39:33 · 2196 阅读 · 0 评论 -
深入理解Linux 内核 chp 2 内存寻址
1. 内存寻址逻辑地址: 通过一个段(segment) 和 一个偏移量(offset)来表示线性地址: 也称虚拟地址, 是一个32bit的无符号整数, 可以用来表征4G的地址空间物理地址: 用于内存芯片级的内存单元的寻址, 由32bit ~ 36bit 无符号整数来表示逻辑地址转换示意图: 2. 硬件中的分段intel 8086系列主要有两种工作模式:实模式 和 保护模式2.1 段选择器和段原创 2016-06-02 11:26:40 · 570 阅读 · 0 评论 -
线程池的介绍及简单实现
点我进入原文线程池的介绍及简单实现服务器程序利用线程技术响应客户请求已经司空见惯,可能您认为这样做效率已经很高,但您有没有想过优化一下使用线程的方法。该文章将向您介绍服务器程序如何利用线程池来优化性能并提供一个简单的线程池实现。在 IBM Bluemix 云平台上开发并部署您的下一个应用。转载 2016-06-06 09:21:04 · 569 阅读 · 0 评论 -
[C++]_[线程池的简单实现]
点我进入原文写一点个人对代码的理解:1. 创建一个线程池子 new2. 激活线程池 (activate)- a, 创建各个空线程, start。 这个步骤中, start 会同时启动子线程 dotask, 这是一个while 循环, 他的业务逻辑是这样的, 当有任务的时候, 执行任务, 当没有任务的时候, 将线程放到空闲队列中, 同时调用 wait 等待,信号过来, 相转载 2016-06-06 12:00:30 · 648 阅读 · 0 评论 -
ubuntu 15.04 配置mysql 5.7.11 linux generic
最近突然想回顾一下数据库的相关内容, 于是开始倒腾了, 一路磕磕绊绊终于在我的ubuntu 15.04 上面把 mysql 5.7.11 给配置成功了。 这里记录一下配置的过程遇到的一些坑。1. 下载相应的mysql版本的文件首先, 我们本来是打算使用源码来编译安装的, 可惜我们在这个页面选择了 linux generic 于是导致我们解压完毕之后, 死活提示没有cmakelist, +_+!原创 2016-03-26 17:00:16 · 1717 阅读 · 0 评论 -
windows 查看DLL导出函数的方法
windows 查看DLL导出函数的方法点我查看原文在window下查看动态库的导出函数可以用vs自带的Dependenc工具;对于VC6.0,VC所带的Depends软件,在VC6安装目录下的tools文件夹里面,可以直接运行。 VS2010中没有了Depends工具,如何查看DLL文件的导出接口呢? VS2010的操作方法如下:1. 打开转载 2017-05-09 21:57:00 · 49979 阅读 · 0 评论