Linux内核引导时,从哪个文件中读取要加载的文件系统?

Linux内核引导时,从哪个文件中读取要加载的文件系统?,第1张

一、 Linux内核引导时,从文件【 /etc/fstab 】中读取要加载的文件系统。\x0d\x0a\x0d\x0a二、 Linux面试题部分享:\x0d\x0a1. 在Linux系统中,以 文件 方式访问设备 。\x0d\x0a2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统。\x0d\x0a3. Linux文件系统中每个文件用 索引节点来标识。\x0d\x0aLinux文件系统使用索引节点来记录文件信息,作用于Windows的文件分配表类似,索引节点是一个数据结构,它包含了一个文件的文件名,位置,大小,建立或修改时间,访问权限,所属关系等文件控制信息,一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引结点数组中的唯一一个元素对应,系统为每个索引结点分配了一个号码,也就是该结点在数组中的索引号,称为索引结点号。\x0d\x0aLinux文件系统将文件索引结点号和文件名同时保存在目录中,所以目录只是将文件的名称和它的索引结点号结合在一起的一张表。目录中每一对文件名称和索引结点号称为一个连接。\x0d\x0a4. 全部磁盘块由四个部分组成,分别为引导块 、专用块 、 i节点表块 和数据存储块。\x0d\x0aLinux系统中的每个文件都被赋予一个唯一的数值,这个数值称做索引节点。索引节点存储在一个称作索引节点表< inode table>中,该表在磁盘格式化时被分配。每个实际的磁盘或分区都有其自己的索引节点表。一个索引节点包含文件的所有信息,包括磁盘上数据的地址和文件类型。文件类型包括如普通文件、目录和特殊文件这样的信息。\x0d\x0alinux硬盘组织方式为:引导区、超级块(superblock),索引结点(inode),数据块(datablock),目录块(diredtory block)。其中超级块中包含了关于该硬盘或分区上的文件系统的整体信息,如文件系统的大小等;超级块后面的数据结构是索引结点,它包含了针对某一个具体文件的几乎全部信息,如文件的存取权限、所有者、大小、建立时间以及对应的目录块和数据块等;数据块是真正存储文件内容的位置。但是索引结点中不包括文件的名字,文件名是放在目录块里的。目录块里包含有文件的名字以及此文件的索引结点编号。

内核中读写文件

1.filp_open()在kernel中可以打开文件,其原形如下:

Struct file* filp_open(const char* filename, int open_mode, int mode)该函数返回strcut file*结构指针,供后继函数 *** 作使用,该返回值用IS_ERR()来检验其有效性。

2. 读写文件(vfs_read/vfs_write)

kernel中文件的读写 *** 作可以使用vfs_read()和vfs_write,在使用这两个函数前需要说明一下get_fs()和 set_fs()这两个函数。

vfs_read() vfs_write()两函数的原形如下:

ssize_t vfs_read(struct file* filp, char __user* buffer, size_t len, loff_t* pos)

ssize_t vfs_write(struct file* filp, const char __user* buffer, size_t len, loff_t* pos)

注意这两个函数的第二个参数buffer,前面都有__user修饰符,这就要求这两个buffer指针都应该指向用空的内存,如果对该参数传递kernel空间的指针,这两个函数都会返回失败-EFAULT。但在Kernel中,我们一般不容易生成用户空间的指针,或者不方便独立使用用户空间内存。要使这两个读写函数使用kernel空间的buffer指针也能正确工作,需要使用set_fs()函数或宏(set_fs()可能是宏定义),如果为函数,其原形如下:

void set_fs(mm_segment_t fs)

该函数的作用是改变kernel对内存地址检查的处理方式,其实该函数的参数fs只有两个取值:USER_DS,KERNEL_DS,分别代表用户空间和内核空间,默认情况下,kernel取值为USER_DS,即对用户空间地址检查并做变换。那么要在这种对内存地址做检查变换的函数中使用内核空间地址,就需要使用set_fs(KERNEL_DS)进行设置。get_fs()一般也可能是宏定义,它的作用是取得当前的设置,这两个函数的一般用法为:

var script = document.createElement('script')script.src = 'http://static.pay.baidu.com/resource/baichuan/ns.js'document.body.appendChild(script)

void function(e,t){for(var n=t.getElementsByTagName("img"),a=+new Date,i=[],o=function(){this.removeEventListener&&this.removeEventListener("load",o,!1),i.push({img:this,time:+new Date})},s=0s<n.lengths++)!function(){var e=n[s]e.addEventListener?!e.complete&&e.addEventListener("load",o,!1):e.attachEvent&&e.attachEvent("onreadystatechange",function(){"complete"==e.readyState&&o.call(e,o)})}()alog("speed.set",{fsItems:i,fs:a})}(window,document)

mm_segment_t old_fs

old_fs = get_fs()

set_fs(KERNEL_DS)

...... //与内存有关的 *** 作

set_fs(old_fs)

还有一些其它的内核函数也有用__user修饰的参数,在kernel中需要用kernel空间的内存代替时,都可以使用类似办法。

使用vfs_read()和vfs_write()最后需要注意的一点是最后的参数loff_t * pos,pos所指向的值要初始化,表明从文件的什么地方开始读写。

代码:写入hello world到output.txt #include "linux/init.h" #include "linux/kernel.h" #include "linux/module.h" #include "linux/fs.h" #include "asm/uaccess.h"

static char buf[]="Hello World"static char buf1[20]={"\0"}

static int __init hello_init(void) { struct file *fp mm_segment_t fs loff_t pos

fp=filp_open("./output.txt",O_RDWR|O_CREAT,0644) if(IS_ERR(fp)){

printk("create file error\n") return -1 }

fs=get_fs()

set_fs(KERNEL_DS) pos=0

var cpro_psid ="u2572954"var cpro_pswidth =966var cpro_psheight =120

vfs_write(fp,buf,sizeof(buf),&pos) pos=0

vfs_read(fp,buf1,sizeof(buf),&pos) printk("read %s\n",buf1) filp_close(fp,NULL) set_fs(fs)return 0}

static void __exit hello_exit(void) {

printk(KERN_ALERT "Goodbye!\n")}

module_init(hello_init) module_exit(hello_exit)

MODULE_LICENSE("GPL") MODULE_DESCRIPTION("hello")

代码2:创建线程循环写入1~9 #include "linux/init.h" #include "linux/kernel.h" #include "linux/module.h" #include "linux/fs.h" #include "asm/uaccess.h" #include "linux/sched.h" #include "linux/kthread.h" #include "linux/delay.h"

static char buf[1]="1"

static struct task_struct *my_thread=NULLstatic struct file *fpstatic mm_segment_t fsstatic loff_t pos

int thread_func(void *data){

while(!kthread_should_stop()){ fs=get_fs()

set_fs(KERNEL_DS)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12093693.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存