#疑惑
可是说上大学以来读了不少的书,可是有多少留下印象了呢,借了还,还了借,如此循环。只不过今晚同学把CSAP借出来了,使我很吃惊,因为我找这本书好久了,一直没有找到,现在想想,这本书的电子版还在文件夹下放着呢,我的时间都去哪儿了? #计划 也许世界上最不靠谱的就是计划了,更何况是我的计划,但是今晚把自己的读书计划放在这,也没有什么害处,还能时不时更新读书笔记,多好的事情!(时时更新) ##Linux Kernel D
之前重新编译了好多次,可惜没有一次成功的,说实话,借助Debian强大的dpkg软件包管理,使得重新编译内核仅仅像安装软件一样简单,我都觉得这不是正宗的编译内核,好了,废话不多说,马上进入主题。
我没有使用最新的内核源代码,用的 3.2.64,我们可以在http://www.lkml.org下载,注意这里我们下载的是.xz文件,需要解压两次。至于源代码放在哪里,完全取决于你自己,你想放在哪里就放在哪里,我直接放在在用户主目录都可以啊。
xz -d linux-xx
(xx就是你下载的内核源代码的版本),这时生成.tar文件,然后
tar -xvf linux-xx
sudo apt-get install kernel-package libncurses5-dev fakeroot build-essential bc
利用git得到linus的最新 kernel,然后执行 make clean
,接下来执行
make menuconfig
如果你想单独编译某个模块,可以单独地编译那个模块(不建立镜像)
make drivers/usb/serial
下面可以建立镜像
make M=drivers/usb/serial
如果你想把内核镜像编译在别处,那么则可以使用
make O=~/linux-kernel-image-dir
看了这么多关于内核的东西,这两天终于上手实现了基于内核的编程——模块编程。 这里,简单的记录一下,因为还是有些东西需要牢记的。 先说点题外话,看到资料上说模块机制、设备机制、驱动机制是在linux上很重要的三种机制之一,所以,看起来,这真是万里长征的第一步。
简单解释一下,一个模块源程序的
1.头文件(必有)
2.模块参数(可选)
3.模块功能函数(optional)
4.模块加载函数(必有)
5.模块卸载函数(必有)
6.模块许可声明(必有)。
关于Makefile文件的知识不是这篇文章的内容,但我们会努力讲解的简单明了一些。其中使用了shell中的选择判断语句,先取得当前系统的版本号,模块源文件所在的目录、内核文件的目录、然后就是目标依赖关系,当然这部分我自己也是不很明白,还需要彻底了解一下相关知识。看上去先产生模块,然后安装modules,这些都是make命令执行后运行的东西。如果我们执行 make clean 紧接着就是清除所在目录产生的中间文件文件,当然,你可以添加自己的规则。
上面的 Makefile是针对于你的发行版的,找到你的镜像(kernel)头文件包,下面是 linux kernel tree编译内核模块的方法
obj-m += module.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
使用这个 Makefile 就可以在自己编译的内核中编译自己的模块,记住一点,你正在运行的内核与 linux kernel tree必须一致,不然会有错误报出。
好,我们将所有的准备工作做好后,执行一下,(sudo 模式)
make
我们会看到如下信息:
紧接着执行
insmod module.ko
,我们打开另一个终端,执行命令
tail -f /var/log/message
我们回到原来的窗口再执行
rmmod module.ko
这两条命令执行后在另一个窗口我们会看到如下信息:
回到原来的窗口,我们执行 make clean,就只剩下了原来的文件。
Linux为用户提供了modutils工具,用来操作模块,包括以下命令
这个命令是加载模块,使用 insmod module.ko可以加载module.ko模块,执行该命令后如果终端没有消息,则可以使用命令 demsg | tail 命令查看文件的最后几行. |
rmmod module.ko就是将module.ko模块卸载。
比较高级的加载和卸载模块的命令,可以解决模块之间的依赖性。
用于查询模块的相关信息,如作者、版权等。
#问题阐述 最近安装了很多的软件,总是为了折腾linux而为的,今天晚上不小心把Bochs安装完毕,在此发文纪念一下了。
由于安装这个这个bochs中间因为网站的问题而搁置了好几天,但在linux系统下安装bochs总不能少了那几个软件包的支持,具体是哪几个我忘了。 #步骤
1.首先到bochs.sourceforge.net下载bochs源代码包并解压缩。
2.然后要安装五个软件,否则make,make install时会失败。
apt-get nstall build-essential xorg-dev bison libgtk2.0-dev libtool libx11-dev xserver-xorg-dev
3.进入所在目录,开始配置
./configure –enable-debugger –enable-disasm
两个enable分别表示启用bochs调试和反汇编。
4.make
5.make install
这只是把软件安装上了,最重要的一步还没做:配置bochs的文件。 由于我把bochs文件解压到用户目录下,所以该配置文件.bochsrc就可以放在用户目录下
##tips 网上有教程说配置liunx0.11内核,关键是我不知道这有什么作用,下面是linux0.11网址 linux 0.11
6.配置bochs启动文件
#how much memory the emulated will have
megs: 32
#filename of ROM images
romimage: file=/home/yubo/bochs/bios/BIOS-bochs-latest
vgaromimage: file=/home/yubo/bochs/bios/VGABIOS-lgpl-latest
#vga: extension=vbe
#what disk image will be used
floppya: 1_44=/home/yubo/a.img,status=inserted #注意路径一定要写全,我这里把镜像文件放在了用户目录下的中,下同
#floppyb: 1_44=/home/yubo/bochs/linux0.11/rootimage-0.11-20040305,status=inserted #注意路径一定要写全
#choose the boot disk
boot: floppy
log: bochsout.txt
#disable mouse
mouse: enabled=0
看到没,我们对Bochs的控制全在这里,包括映像文件的路径和启动顺序,至于a.img是在怎么来的,请看下面的东东,我们将配置文件写好以后,使用命令
bochs
会出来选项,直接回车(就是选择6),然后弹出一个窗口,在原来窗口的提示内键入
c
这时你再看模拟器窗口,啊,整个世界开朗了。 #Bochs的使用 其实在上面的安装过程中,我可能遗漏了很多组建,默认安装Bochs及其组件可以使用以下命令:
sudo apt-get install vgabios bochs bochs-x bximage
当然,首先推荐使用源码安装这样可以设置一些自己想要的功能,比如调试。
“计算机”安装好了,我们接下来应该怎么办呢?对了,安装硬盘或者软盘,你总得让计算机启动吧,就是使用__bximage__命令。
bximage:
出现以下界面,
yubo@debian:~$ bximage ======================================================================== bximage Disk Image Creation / Conversion / Resize and Commit Tool for Bochs $Id: bximage.cc 12364 2014-06-07 07:32:06Z vruppert $ ======================================================================== 1. Create new floppy or hard disk image 2. Convert hard disk image to other format (mode) 3. Resize hard disk image 4. Commit 'undoable' redolog to base image 5. Disk image info 0. Quit Please choose one [0] 1 Create image Do you want to create a floppy disk image or a hard disk image? Please type hd or fd. [hd] fd Choose the size of floppy disk image to create, in megabytes. Please type 160k, 180k, 320k, 360k, 720k, 1.2M, 1.44M, 1.68M, 1.72M, or 2.88M. [1.44M] What should be the name of the image? [a.img] Creating floppy image 'a.img' with 2880 sectors The following line should appear in your bochsrc: floppya: image="a.img", status=inserted
这时在当前目录下产生了一个 a.img,这就是我们需要的软盘映像(自己想把img文件的格式学习一下,结果网上的资料不是很多),书上说映像文件是按字节复制,记住,a .img只是一个软盘,没有任何东西,我们接下来要把编译的二进制文件(引导扇区)写进软盘里
yubo@debian:~$ dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc 记录了1+0 的读入 记录了1+0 的写出 512字节(512 B)已复制,9.3823e-05 秒,5.5 MB/秒
稍微解释一下这个命令,if是input file的缩写,of是out file的缩写,也就是目标文件,bs是文件的大小,count不是很清楚,conv=notrune是不要截断. 注意路径问题就行
nasm boot.asm -o boot.bin
org 07c00h ;load first instructor notify compile
mov ax,cs
mov ds,ax
mov es,ax
call DispStr ;call char functions
jmp $; loop
DispStr:
mov ax,BootMessage
mov bp,ax
mov cx,16
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
ret
BootMessage: db "hello,OS world!"
times 510-($-$$) db 0
dw 0xaa55
简单介绍下这个文件的意思,引导扇区,是从0面0磁道1扇区到0xAA55,之间应包含少于512字节的执行码,一旦BIOS发现了引导扇区,就会将这512字节的内容装载到内存地址0000:7c00处,然后跳转到0000:7c00处将控制权交给这段引导代码。
近来在专业课的学习中,时不时碰到周期的字眼,借用这个时间将这几个概念整理一下。
在计算机中为了便于管理,常把一条指令的执行过程划分为若干个阶段,每个阶段完成一项工作。比如,与微机系统有关指令命令,如取指令,读、写存储器等,每一项操作称为一个基本操作,完成一个基本操作所需要的时间称为机器周期,通常一个机器周期由若干S周期(状态周期)组成。
通常用内存中读取一个指令字的最短时间来规定CPU周期。
取出并执行一条指令的时间,一个指令周期由若干CPU周期构成。
又称为振荡周期,是处理操作的最基本的单位。
把振荡脉冲的周期定义为节拍(用p表示),振荡周期经过二分频后定义为状态,一个状态就包含两个节拍。
两个振荡周期(时钟周期)组成一个状态周期。
也就是一次通过总线访问存储器或I/O端口的时间,一般一个总线周期包括4个时钟周期,这4个时钟周期又分别称为T1状态、T2状态、T3状态、T4状态
layout: post category: network title: “虚拟机与主机的连接方式” —
主机与虚拟机的连接方式有 bridged(桥连),NAT(网络地址转换模式)和host-only(主机模式),不同的连接方式对应不同的网卡。
在Linux下面ifconfig显示的eth0是第一个网卡ip(eth就是ethenet以太网,这里指网络接口)
1. 桥连方式(bridged)
在桥连方式下你可以把虚拟出来的操作系统看成一部独立的主机,你需要手工为虚拟系统配合ip地址、子网掩码、而且还要和宿主机器处于同一网段,这样虚拟机才能和宿主机器进行通行。从名字上讲,我们可以把宿主系统看作一座桥,连接的就是虚拟机器,利用这种方式连接的机器,就像连接在同一 hub的两台机器。如果你想利用虚拟机的机器提供网络服务,就应该选择 bridged方式。这种方式最简单,直接将虚拟网卡接到一个物理网卡上,和linux下一个网卡绑定两个不同的地址类似,实际上是将网卡设置为混杂模式,从而达到侦听多个ip的能力。
2. 网络地址转换(NAT)
说的简单一点,这种方式就是利用虚拟机给虚拟系统(DHCP服务器)给虚拟系统分配一个可上网的ip,简单明了,还可以实现 Host Os和Guest Os的双向访问(这句话明显有错误),但与Host Os同一网段的其他机器无法像桥连方式那样轻松访问Guest Os。
你可以简单的认为虚拟机中的数据都是由宿主系统提供的,虚拟机可以通过网络访问主机,主机无法通过网络访问虚拟机。
ip:10.0.2.15
网关: 10.0.2.2
DNS: 10.0.2.3