编译后在
/usr/src/linux/arch/i386/boot/
成功后你应该
cp /usr/src/linux/arch/i386/boot/ /boot/bzImage-2.4.18
也就是在
/boot/下
B. Linux - 用户态内存映射 和 内核态内存映射
操作系统的内存管理,主要分为三个方面。
第一,物理内存的管理,相当于会议室管理员管理会议室。
第二,虚拟地址的管理,也即在项目组的视角,会议室的虚拟地址应该如何组织。
第三,虚拟地址和物理地址如何映射,也即会议室管理员如果管理映射表。
那么虚拟地址和物理地址如何映射呢?
每一个进程都有一个列表vm_area_struct,指向虚拟地址空间的不同的内存块,这个变量的名字叫mmap。
其实内存映射不仅仅是物理内存和虚拟内存之间的映射,还包括将文件中的内容映射到虚拟内存空间。这个时候,访问内存空间就能够访问到文件里面的数据。而仅有物理内存和虚拟内存的映射,是一种特殊情况。
如果我们要申请小块内存,就用brk。brk函数之前已经解析过了,这里就不多说了。如果申请一大块内存,就要用mmap。对于堆的申请来讲,mmap是映射内存空间到物理内存。
另外,如果一个进程想映射一个文件到自己的虚拟内存空间,也要通过mmap系统调用。这个时候mmap是映射内存空间到物理内存再到文件。可见mmap这个系统调用是核心,我们现在来看mmap这个系统调用。
用户态的内存映射机制包含以下几个部分。
物理内存根据NUMA架构分节点。每个节点里面再分区域。每个区域里面再分页。
物理页面通过伙伴系统进行分配。分配的物理页面要变成虚拟地址让上层可以访问,kswapd可以根据物理页面的使用情况对页面进行换入换出。
对于内存的分配需求,可能来自内核态,也可能来自用户态。
对于内核态,kmalloc在分配大内存的时候,以及vmalloc分配不连续物理页的时候,直接使用伙伴系统,分配后转换为虚拟地址,访问的时候需要通过内核页表进行映射。
对于kmem_cache以及kmalloc分配小内存,则使用slub分配器,将伙伴系统分配出来的大块内存切成一小块一小块进行分配。
kmem_cache和kmalloc的部分不会被换出,因为用这两个函数分配的内存多用于保持内核关键的数据结构。内核态中vmalloc分配的部分会被换出,因而当访问的时候,发现不在,就会调用do_page_fault。
对于用户态的内存分配,或者直接调用mmap系统调用分配,或者调用malloc。调用malloc的时候,如果分配小的内存,就用sys_brk系统调用;如果分配大的内存,还是用sys_mmap系统调用。正常情况下,用户态的内存都是可以换出的,因而一旦发现内存中不存在,就会调用do_page_fault。
C. Linux中的配置文件是什么
一般在用户/root 文件下面,.config
linux中的配置文件一般都是这种格式的,前面有个.
类似windows中的隐藏文件。
D. linux中虚拟地址和物理地址怎样映射
虚拟就是虚拟的,不是实际真是的物理地址。你可以认为,这两个地址之间没关系。
这个虚拟是通过系统和硬件的双重工作,做的一种点对点的映射(当然实际内存分配是按照页来处理)。
也就是软件不需要考虑内存数据的物理地址,只需要用虚拟地址做数据存储处理就行了。
这样一个好处是,软件不需要自己做内存分配,也不需要考虑别的软件的内存占用问题。操作系统会根据当前的内存使用情况,动态的分配内存空间。虚拟内存地址还一个好处是因为是虚拟的,所以内存并不一定非要在物理内存中。可以存放在任何位置,比如把暂时不用的数据放进硬盘上的虚拟内存,腾出真实的物理内存交给程序运行而提高多程序时运行的效率。而且因为每个软件的虚拟内存地址都是从 0 开始,每个软件的寻址都是独立而且顺序的。程序编写和运行时,都好像是机器里面只有自己一个程序在运行,程序开发起来也很容易。软件不需要考虑内存分配的问题,也不需要担心内存不足和两个程序抢同一片内存导致系统整个崩溃的情况。
E. Linux将设备地址映射到用户空间内存映射与VMA
一般情况下,用户空间是不可能也不应该直接访问设备的,但是,设备驱动程序中可实现mmap ()函数,这个函数可使得用户空间能直接访问设备的物理地址。实际上,mmap ()实现了这样的一个映射过程:它将用户空间的一段内存与设备内存关联,当用户访问用户空间的这段地址范围时,实际上会转化为对设备的访问。
这种能力对于显示适配器一类的设备非常有意义,如果用户空间可直接通过内存映射访问显存的话,屏幕帧的各点像素将不再需要一个从用户空间到内核空间的复制的过程。
mmap ()必须以PAGE_SIZE为单位进行映射,实际上,内存只能以页为单位进行映射,若要映射非PAGE_SIZE整数倍的地址范围,要先进行页对齐,强行以PAGE_SIZE的倍数大小进行映射。
从file_operations文件操作结构体可以看出,驱动中mmap ()函数的原型如下:
int ( *mmap)(struct file *, struct vm_area_struct* ) ;
驱动中的mmap () 函数将在用户进行mmap ()系统调用时最终被调用,mmap ()系统调用的原型与file_operations中mmap ()的原型区别很大,如下所示:
caddr_t mmap (caddr_t addr,size_t len,int prot,int flags,int fd,off_t offset);
参数fd为文件描述符,一般由open ()返回,fd也可以指定为-1,此时需指定flags参数中的MAP_ANON,表明进行的是匿名映射。
len是映射到调用用户空间的字节数,它从被映射文件开头offset个字节开始算起,offset参数一般设为0,表示从文件头开始映射。
prot参数指定访问权限,可取如下几个值的“或”:PROT_READ(可读)、PROT_WRITE(可写)、PROT_EXEC(可执行)和PROT_NONE(不可访问)。
参数addr指定文件应被映射到用户空间的起始地址,一般被指定为NULL,这样,选择起始地址的任务将由内核完成,而函数的返回值就是映射到用户空间的地址。其类型caddr_t实际上就是void*。
当用户调用mmap ())的时候,内核会进行如下处理。
1)在进程的虚拟空间查找一块VMA。
2)将这块VMA进行映射。
3)如果设备驱动程序或者文件系统的file_operations定义了mmap ()操作,则调用它。
4)将这个VMA插入进程的VMA链表中。
file_operations中mmap ()函数的第一个参数就是步骤1)找到的VMA。
由mmap ()系统调用映射的内存可由munmap ()解除映射,这个函数的原型如下:
int munmap(caddr_t addr, size_t len ) ;
驱动程序中mmap ()的实现机制是建立页表,并填充VMA结构体中vm_operations_struct指针。
F. 如何在linux下用mmap映射超大文件,并读取其内容
manpage里面的东西:
void *mmap(void *start, size_t length, int prot, int flags,
int fd, off_t offset);
The mmap() function asks to map length bytes starting at offset offset from the file (or other object) specified by the file descriptor fd into memory,
就是说,从offset位置开始,把文件fd的length字节映射到地址start上。
如果是64位的应用,4G是没有问题的,32位的应用不能。
G. linux系统主要配置文件目录及说明
1. bin目录
binary(二进制的):许多“指令”对应的可“执行程序文件”目录
2. sbin目录
说明:super binary 超级的 二进制 许多“指令”对应的可“执行程序文件”目录,该目录文件对应指令都是"root"用户可以执行的指令普通用户不能使用该目录里的命令:
普通用户:用$开头
root用户:用#开头
3. usr目录
说明:unxi system resource
unix system resource (unix系统资源文件目录)
该目录类似win系统的 C:/Program files 目录
该目录经常用于安装各种软件
4. dev目录
说明:device 系统硬件设备目录(linux系统所有的硬件都通过文件表示)
例如:/dev/cdrom是光驱 /dev/sda 是第一块scsi硬盘
5. home目录
说明:普通用户的“家目录”
系统每增加一个普通用户的同时,都会在该目录为该目录设置一个文件目录代表该用户的“家目录”用户后期使用系统的时候首先会首先进入其目录家目录名字默认与当前用户名字一致用户对家目录拥有绝对最高的权限
6. proc目录
内存映射目录,该目录可以查看系统的相关信息
7. var目录
variable 可变的、易变的
该目录存储的文件经常会发生变化(增加、修改、删除)
经常用于部署项目程序(php)文件
/var/www/shop
/var/www/book
8. boot目录
说明:系统启动核心目录,用于储存系统启动文件
9. etc目录
系统主要配置文件目录
例如:
/etc/passwd 用于存储用户信息的文件
/etc/group 用于存储组别信息的文件
10. lib目录
library:系统资源文件类库目录
11. selinux目录
说明:安全增强型的linux对系统形成保护
在安装软件时会有一定的影响
12. mnt目录
说明:存放临时的映射文件系统,我们常把软驱和光驱挂装在这里的floppy和cdrom子目录下。
13. tmp目录
说明:存放临时文件的目录
H. linux服务器IP地址映射问题
首先你要确认你的linux系统防火墙有没有开放22端口(默认是开放的),第二个就是你的ip地址了,你linux的ip地址是局域网的ip地址,第三就是你的端口映射是否做的正确,你的linux防火墙是否允许你外网的映射的那个地址进入 第四就是你访问的时候是否是通过外网地址访问的