嵌入式学习——硬件(Linux内核编程)——day58

1. linux内核

1.1 定义

        Linux内核本质上是一个复杂的程序。它是操作系统中最核心的部分,直接与计算机硬件交互并管理系统资源。尽管内核是一个程序,但它不同于一般的应用程序。它运行在系统的最高权限级别,直接控制硬件并为其他软件提供基础服务。Linux内核是开源的,意味着任何人都可以查看、修改和分发其源代码。

1. 2 作用

  1. 进程管理:创建、调度和终止进程。
  2. 内存管理:分配和回收内存,管理虚拟内存。
  3. 文件系统管理:提供文件系统的接口,管理文件的读写操作。
  4. 设备驱动:控制和管理硬件设备。
  5. 网络管理:处理网络通信和数据传输。
  6. 系统安全和权限管理:管理用户和进程的权限,确保系统安全。

2. NFS

2.1 定义

        NFS(Network File System,网络文件系统)是一种分布式文件系统协议,最早由Sun Microsystems在1984年开发。它允许不同计算机系统之间通过网络共享文件,并使得客户端计算机能够像访问本地文件系统一样访问远程文件系统。

2.2 作用

  1. 文件共享

    • 跨平台共享:NFS允许不同操作系统(如Unix、Linux、Windows)之间共享文件,使得不同平台的用户可以访问相同的文件资源。
    • 集中化管理:通过NFS,企业可以集中管理文件和数据,减少数据冗余,提升数据一致性。
  2. 简化数据访问

    • 透明访问:用户可以像访问本地文件一样访问NFS共享的文件,无需关心文件实际存储在哪台服务器上。
    • 灵活性:NFS支持动态挂载和卸载文件系统,使得数据访问更加灵活和便捷。
  3. 资源利用优化

    • 存储整合:通过NFS,多个客户端可以共享同一个存储资源,提高存储利用率,减少存储浪费。
    • 负载分担:NFS服务器可以分散多个客户端的访问请求,减轻单个服务器的负载压力,提高系统整体性能。
  4. 支持异构网络

    • 跨网络访问:NFS支持局域网(LAN)和广域网(WAN),用户可以在不同地理位置的网络环境下访问共享文件。
  5. 高可用性和容错性

    • 数据备份:NFS服务器可以配置数据备份策略,确保数据安全和高可用性。
    • 容错机制:通过配置冗余服务器,NFS可以提供容错能力,当一个服务器发生故障时,客户端可以切换到备用服务器继续工作。
  6. 安全性

    • 访问控制:NFS支持基于用户和组的访问控制列表(ACL),可以精细化管理文件和目录的访问权限。
    • 数据加密:在传输过程中可以通过加密协议(如Kerberos)保护数据安全,防止未经授权的访问和数据窃取。

3. Icache和Dcache

        ICACHE(Instruction Cache)和DCACHE(Data Cache)是计算机体系结构中的两种缓存类型,它们分别用于存储指令和数据,旨在提高处理器访问存储器的效率。

  1. ICACHE(指令缓存)

    • 作用:ICACHE用于存储处理器执行的指令(代码段)。
    • 优势:由于程序的执行通常会重复执行某些指令,将这些指令存储在ICACHE中可以减少处理器访问主存的频率,从而加快程序的执行速度。
    • 结构:ICACHE通常由高速的SRAM(Static Random Access Memory)构成,它与处理器的速度相匹配,能够快速响应处理器的访问请求。
  2. DCACHE(数据缓存)

    • 作用:DCACHE用于存储处理器需要访问的数据。
    • 优势:与ICACHE类似,DCACHE可以存储最常用的数据,减少处理器访问主存的时间,提高程序的执行效率。
    • 结构:DCACHE也通常采用SRAM构建,速度较快,但其大小可能比ICACHE更大,因为数据通常比指令占用更多的内存空间。

在现代计算机系统中,ICACHE和DCACHE通常是处理器内部的一部分,它们通过缓存预取(cache prefetching)和替换策略(cache replacement policies)来优化缓存的命中率,以最大限度地提高系统的性能和响应速度。

4. TFTP

4.1 定义

        TFTP(Trivial File Transfer Protocol)是一种简单的文件传输协议,主要用于在网络设备之间传输文件。

4.2 功能

        通过TFTP将文件从服务器下载到客户端

5. makefile

5.1 普通文件

target = app
OBJS = main.o fun.o

%.c:%.o
    gcc -c $^ -o $@

$(target):$(OBJS)
    gcc -o$@ $^

clean:
    rm $(target) $(OBJS)

5.2 产生驱动

KERNELDIR := /home/linux/s3c2440/linux-2.6.32.2/
CURRENT_PATH := $(shell pwd)
obj-m := first_driver.o

build: kernel_modules

kernel_modules:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

6. 

7. linux系统驱动程序

        分为三大类,字符设备驱动,块设备驱动和网络设备驱动。其中字符设备驱动是使用最多的一种,从点灯到IIC,SPI,音频设备等的驱动都是字符设备驱动

        字符设备一般使用文件IO进行操作

        文件IO常用函数接口:open、close、write、read、lseek

8. linux下的应用程序调用驱动程序的流程

        应用程序必须使用一个叫做“系统调用”的方法来实现从用户空间“陷入”到内核空间,这样才能实现对底层驱动的操作

        1. 应用程序(使用open等API函数)

        2. 应用程序调用C库函数

        3. C库函数通过系统进入内核

        4. 内核调用驱动程序中的open等函数完成对硬件的操作

8. 字符驱动程序(open、close、write、read)

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>

int first_driver_open(struct inode *p_node, struct file *fp)
{
	printk("open\n");
	return 0;
}

ssize_t first_driver_read(struct file *fp, char __user *user_buffer, size_t n, loff_t * offset)
{
	printk("read\n");
	return 0;
}

ssize_t first_driver_write(struct file *fp, const char __user *user_buffer, size_t n, loff_t *offset)
{
	printk("write\n");
	return 0;
}

int first_driver_close(struct inode *p_node, struct file *fp)
{
	printk("close\n");
	return 0;
}

struct file_operations fops =
{	
	.owner = THIS_MODULE,		//注册函数中的结构体变量
	.release = first_driver_close,
	.open = first_driver_open,
	.read = first_driver_read,
	.write = first_driver_write,
};

static int __init first_driver_init(void)//初始化
{	
	int ret;
	printk("init\n");
	ret = register_chrdev(200, "first driver", &fops);//注册
	if(ret != 0)
	{
		return ret;
	}
	return 0;
}

static void __exit first_driver_exit(void)//销毁
{
	unregister_chrdev(200, "first driver");//销毁
	printk("exot\n");
}

module_init(first_driver_init);
module_exit(first_driver_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("PuTe");


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值