当前位置: 首页 > news >正文

一个网站多个域名 seo做网站用phpcms还是

一个网站多个域名 seo,做网站用phpcms还是,网站没收录可以做推广吗,个人手机网站针对于嵌入式软件杂乱的知识点总结起来#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.内核镜像格式有几种#xff1f;分别有什么区别#xff1f; 2.内核中申请内存有哪几个函数#xff1f;有什么区别#xff1f; 3.什么是内核空间#xff0c;用户空间… 针对于嵌入式软件杂乱的知识点总结起来提供给读者学习复习对下述内容的强化。 目录 1.内核镜像格式有几种分别有什么区别 2.内核中申请内存有哪几个函数有什么区别 3.什么是内核空间用户空间 4.为什么需要区分内核空间与用户空间 5.什么是内核态和用户态 6.用户空间与内核通信方式有哪些 7.内核链表为什么具有通用性 8.应用程序中open()在linux中执行过程中是如何从用户空间到内核空间 9.怎么申请大块内核内存 1.内核镜像格式有几种分别有什么区别 1. zImage 描述 zImage 是一种压缩的内核镜像格式适用于大多数嵌入式系统和x86架构。 它是通过将内核镜像压缩后加上解压缩代码生成的。 特点 压缩格式体积较小。 适用于内存有限的嵌入式系统。 通常用于传统的BIOS引导方式。 适用场景 嵌入式Linux系统。 旧版x86系统。 2. bzImage 描述 bzImage 是 zImage 的升级版主要用于x86架构。 名称中的 b 代表 big表示它支持更大的内核镜像。 特点 支持更大的内核镜像超过512KB。 压缩格式体积较小。 适用于现代x86系统如UEFI引导。 适用场景 现代x86架构的Linux系统。 3. uImage 描述 uImage 是U-Boot引导加载程序专用的内核镜像格式。 它在 zImage 或 bzImage 的基础上添加了一个U-Boot头部包含加载地址、入口地址等信息。 特点 专为U-Boot设计。 包含额外的元数据便于U-Boot加载和引导。 适用场景 使用U-Boot引导的嵌入式系统如ARM架构。 4. Image 描述 Image 是未经压缩的内核镜像格式。 它是内核编译后直接生成的原始二进制文件。 特点 未压缩体积较大。 加载速度快无需解压缩。 适用场景 内存充足且对启动速度要求较高的系统。 5. FIT ImageFlattened Image Tree 描述 FIT Image 是一种灵活的镜像格式支持将内核、设备树、RAM磁盘等多个组件打包到一个镜像中。 它基于设备树Device Tree的概念适用于复杂的嵌入式系统。 特点 支持多组件打包。 灵活性高适合复杂的引导需求。 适用场景 现代嵌入式系统如ARM架构。 需要同时加载内核、设备树和初始RAM磁盘的系统。 6. vmlinux 描述 vmlinux 是内核编译后生成的ELFExecutable and Linkable Format文件。 它是未经压缩和处理的原始内核镜像。 特点 未压缩体积最大。 包含调试信息适合调试和分析。 适用场景 内核开发和调试。 7. vmlinuz 描述 vmlinuz 是 vmlinux 的压缩版本通常用于x86架构的Linux发行版。 它是 zImage 或 bzImage 的另一种形式。 特点 压缩格式体积较小。 适用于x86架构的Linux系统。 适用场景 桌面和服务器Linux系统。 8. XIP KernelExecute In Place 描述 XIP Kernel 是一种可以直接在存储设备上执行的内核镜像格式。 它不需要将内核加载到内存中直接从存储设备如NOR Flash执行。 特点 节省内存空间。 执行速度较慢受存储设备速度限制。 适用场景 内存非常有限的嵌入式系统。 嵌入式Linux中常用的镜像格式 在嵌入式Linux开发中最常见的镜像格式是 uImage 和 FIT Image因为它们专为嵌入式系统设计支持U-Boot引导加载程序并且可以灵活地处理内核、设备树和初始RAM磁盘。 uImage 示例 # 使用 mkimage 工具生成 uImage mkimage -A arm -T kernel -C none -a 0x80008000 -e 0x80008000 -n Linux Kernel -d zImage uImage FIT Image 示例 # 使用 mkimage 工具生成 FIT Image mkimage -f kernel.its kernel.itb 2.内核中申请内存有哪几个函数有什么区别 1. kmalloc() 作用用于分配小块内存通常小于 4 KB一般用于 SLAB/SLUB 分配器。 返回值返回一个指向物理连续内存的指针。 优点 速度快适用于小块内存分配。 分配的内存是物理连续的适用于 DMA 等场景。 缺点 不能保证分配大块内存超过单个页面时可能失败 void *ptr kmalloc(1024, GFP_KERNEL); // 分配 1024 字节内存 if (!ptr) printk(kmalloc failed!\n);2. kzalloc() 作用类似 kmalloc()但会自动清零分配的内存等价于 kmalloc() memset(0)。 void *ptr kzalloc(1024, GFP_KERNEL);3. vmalloc() 作用用于分配大块内存超过单个页面但是分配的内存是虚拟地址连续的物理地址不一定连续。 适用于 需要大块内存但不需要物理连续性的场景如驱动的缓冲区。 缺点 由于页表映射访问速度比 kmalloc() 分配的内存慢。 不能用于 DMA因为物理地址不连续 void *ptr vmalloc(1024 * 1024); // 分配 1MB 内存4. vzalloc() 作用类似 vmalloc()但会自动清零分配的内存。 void *ptr vzalloc(1024 * 1024);函数物理连续虚拟地址连续适用场景kmalloc()✅✅小块内存物理连续可用于 DMAkzalloc()✅✅kmalloc() 清零vmalloc()❌✅大块内存物理不连续不能用于 DMAvzalloc()❌✅vmalloc() 清零alloc_pages()✅✅以页为单位分配适用于页级管理get_free_pages()✅✅类似 alloc_pages()但返回虚拟地址dma_alloc_coherent()✅✅专用于 DMA返回设备可访问的地址 ioremap() 在内核中的作用 在 Linux 内核驱动开发中ioremap() 主要用于将物理地址映射到内核的虚拟地址空间使 CPU 可以访问设备寄存器或外部存储器。 ioremap() 相关函数 函数作用适用场景ioremap()将物理地址映射为不可缓存的虚拟地址访问 MMIO内存映射 I/O如外设寄存器ioremap_nocache()ioremap() 的别名确保不使用 CPU 缓存旧版 API现已废弃等同于 ioremap()ioremap_wc()写合并Write Combining提高写入速度适用于帧缓冲等高速写操作ioremap_cache()允许使用 CPU 缓存适用于 RAM 访问提高访问效率iounmap()解除 ioremap() 映射释放内存映射资源 3.什么是内核空间用户空间 4.为什么需要区分内核空间与用户空间 在 CPU 的所有指令中,有些指令是非常危险的如果错用,将导致系统崩溃比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令那么系统崩溃的概率将大大增加。 所以CPU 将指令分为特权指令和非特权指令对于那些危险的指令只允许操作系统及其相关模块使用普通应用程序只能使用那些不会造成灾难的指令。比如 Intel 的 CPU 将特权等级分为4个级别:Ring0~Ring3. 其实 Linux 系统只使用了 Ring0 和 Ring3 两个运行级别(Windows 系统也是一样的)。当进程运行在Ring3 级别时被称为运行在用户态而运行在 Ring0 级别时被称为运行在内核态。 5.什么是内核态和用户态 当进程运行在内核空间时就处于内核态而进程运行在用户空间时则处于用户态。 在内核态下进程运行在内核地址空间中此时CPU可以执行任何指令。运行的代码也不受任何的限制可以自由地访问任何有效地址也可以直接进行端口的访问。 在用户态下进程运行在用户地址空间中被执行的代码要受到 CPU 的诸多检查它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址且只能对任务状态段(TSS)中 I/0 许可位图(IO Permission Bitmap)中规定的可访问端口进行直接访问。 对于以前的 DOS 操作系统来说是没有内核空间、用户空间以及内核态、用户态这些概念的。可以认为所有的代码都是运行在内核态的因而用户编写的应用程序代码可以很容易的让操作系统崩溃掉。 对于 Linux 来说通过区分内核空间和用户空间的设计,隔离了操作系统代码(操作系统的代码要比应用程序的代码健壮很多)与应用程序代码。即便是单个应用程序出现错误也不会影响到操作系统的稳定性这样其它的程序还可以正常的运行(Linux 可是个多任务系统啊!)。所以区分内核空间和用户空间本质上是要提高操作系统的稳定性及可用性。 在 Linux 及其他现代操作系统中内核态Kernel Mode 和 用户态User Mode 是 CPU 运行的两种模式主要用于隔离用户进程和操作系统核心代码确保系统稳定性和安全性。 特性内核态Kernel Mode用户态User Mode权限级别高Ring 0低Ring 3可访问资源访问所有 CPU 指令和硬件资源只能访问进程自己的虚拟地址空间内存访问访问整个物理内存只能访问自身进程的虚拟内存I/O 访问允许直接访问 I/O 设备不能直接访问 I/O 设备CPU 指令可执行特权指令如 cli、sti只能执行非特权指令切换方式通过 系统调用syscall 进入通过 系统调用返回 或 sigreturn 退出 6.用户空间与内核通信方式有哪些 1. 系统调用System Call 原理 用户空间调用 glibc 提供的 API如 open()、read()最终进入内核态执行对应的 sys_xxx() 函数。 通过 syscall 指令x86_64或 int 0x80x86切换到内核态。 适用场景 文件操作open()、read()、write() 进程管理fork()、execve() 设备驱动访问ioctl() #include stdio.h #include unistd.hint main() {char buffer[128];int n read(0, buffer, sizeof(buffer)); // 调用系统调用 sys_read()write(1, buffer, n); // 调用系统调用 sys_write()return 0; }2.ioctlI/O 控制 原理 ioctl()I/O Control是 系统调用用于对设备驱动进行特殊操作如配置 GPIO、电机控制、传感器读取等。 设备驱动程序通过 unlocked_ioctl 处理 ioctl 请求。 适用场景 设备驱动程序的参数设置如波特率、模式 发送命令到内核 #include stdio.h #include fcntl.h #include sys/ioctl.h#define LED_ON _IOW(L, 1, int) #define LED_OFF _IOW(L, 2, int)int main() {int fd open(/dev/my_led, O_RDWR);if (fd 0) {perror(open);return -1;}ioctl(fd, LED_ON); // 控制 LED 亮ioctl(fd, LED_OFF); // 控制 LED 灭close(fd);return 0; }3. procfs/proc 文件系统 原理 /proc 是一个虚拟文件系统用于访问内核状态信息。 通过 cat /proc/my_proc可以获取内核数据。 适用场景 进程信息/proc/PID 内核参数/proc/sys/ 设备信息/proc/devices static struct proc_dir_entry *proc_entry;ssize_t my_proc_read(struct file *file, char __user *buf, size_t count, loff_t *pos) {char message[] Hello from Kernel!\n;return simple_read_from_buffer(buf, count, pos, message, sizeof(message)); }static int __init my_init(void) {proc_entry proc_create(my_proc, 0444, NULL, (struct proc_ops){ .proc_read my_proc_read });return 0; } static void __exit my_exit(void) { remove_proc_entry(my_proc, NULL); }用户程序访问 cat /proc/my_proc4. sysfs/sys 文件系统 原理 /sys 是一个 比 /proc 更结构化 的文件系统主要用于设备和驱动信息的交互。 可以用 echo 和 cat 直接修改或获取设备信息。 适用场景 设备驱动的参数调节如 LED 亮度、风扇转速 设备状态监测 static struct kobject *kobj; static int my_value 0;static ssize_t show_value(struct kobject *kobj, struct kobj_attribute *attr, char *buf) {return sprintf(buf, %d\n, my_value); } static ssize_t store_value(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count) {sscanf(buf, %d, my_value);return count; }static struct kobj_attribute my_attr __ATTR(my_value, 0660, show_value, store_value);static int __init my_init(void) {kobj kobject_create_and_add(my_kobj, kernel_kobj);sysfs_create_file(kobj, my_attr.attr);return 0; }用户访问 echo 10 /sys/kernel/my_kobj/my_value # 写入 cat /sys/kernel/my_kobj/my_value # 读取方式适用场景适合数据量复杂度System Call通用小⭐ioctl设备控制小⭐⭐procfs状态查询小⭐sysfs设备参数小⭐Netlink事件通知中等⭐⭐⭐mmap大数据大⭐⭐⭐ 7.内核链表为什么具有通用性 内核中由于要管理大量的设备但是各种设备各不相同必须将他们统一起来管理于是内核设计者就想到了使用通用链表来处理通用链表看似神秘实际上就是双向循环链表这个链表的每个节点都是只有指针域没有任何数据域。 使用通用链表的好处是 1.通用链表中每个节点中没有数据域也就是说无论数据结构有多复杂在链表中只有前后级指针。2.如果一个数据结构(即是描述设备的设备结构体)想要用通用链表管理只需要在结构体中包含节 点的字段即可。 3.双向链表可以从任意一个节点的前后遍历整个链表遍历非常方便。 4.使用循环链表使得可以不断地循环遍历管理节点,像进程的调度:操作系统会把就绪的进程放在一个管理进程的就绪队列的通用链表中管理起来循环不断地为他们分配时间片获得cpu进行周而复始的进程调度。 注意在RTOS操作系统中每个task的执行顺序不同状态队列信号量互斥锁等等底层都是使用链表的。 特性传统链表Linux 内核链表是否绑定数据类型是只能存 int 或特定结构体否适用于任何结构体是否循环否是是否双向可能是单链表是是否支持统一 API否不同数据类型需要不同的操作是统一 API是否易扩展扩展困难易扩展 8.应用程序中open()在linux中执行过程中是如何从用户空间到内核空间 open() 是 Linux 系统调用System Call之一用于打开文件或设备。它涉及从用户空间User Space切换到内核空间Kernel Space的过程具体涉及系统调用、中断、文件系统、VFS虚拟文件系统等机制。 如下是流程 open() 先通过 glibc 触发系统调用。 进入内核后先由 VFS 解析路径。 如果是普通文件调用 ext4 等文件系统的 open。 如果是设备文件调用设备驱动 file_operations-open()。 最终返回文件描述符 fd用户进程可以使用 read()、write() 操作。 open() 在 glibcC 标准库 中的实现 int open(const char *pathname, int flags, mode_t mode) {return syscall(SYS_openat, AT_FDCWD, pathname, flags, mode); }syscall(SYS_openat, ...) 通过 syscall 指令 进入 内核空间。 这个过程发生在 arch/x86/entry/entry_64.S主要步骤 syscall 指令CPU 从用户模式Ring 3切换到内核模式Ring 0。 sys_openat() 被调用定义在 fs/open.c。 在 fs/open.c 中 long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode) {struct open_how how build_open_how(flags, mode);return do_filp_open(dfd, filename, how); }在 fs/namei.c struct file *do_filp_open(int dfd, const char __user *filename, struct open_how *how) {struct nameidata nd;struct file *filp;filp path_openat(nd, how, LOOKUP_FOLLOW);return filp; }假设 open() 操作的是 ext4 文件 VFS 通过 inode_operations-lookup() 找到 ext4_lookup()。调用 file_operations-open()如 ext4_file_open()。 ext4_file_open()位于 fs/ext4/file.c int ext4_file_open(struct inode *inode, struct file *file) {// 执行特定文件系统的打开操作return generic_file_open(inode, file); }步骤主要操作1. 用户空间调用glibc 调用 syscall(SYS_openat)2. 进入内核空间syscall 指令触发 sys_openat()3. VFS 处理do_filp_open() 解析路径查找文件4. 文件系统层ext4_file_open() 或 device-fops-open()5. 生成文件描述符fd 存入 task_struct-files 并返回 9.怎么申请大块内核内存 vmalloc
http://www.w-s-a.com/news/364202/

相关文章:

  • 湖南岳阳网站开发网络公司石家庄做网站的公司哪个好
  • 西安市做网站的公司门户网站对应序号是什么
  • 太原网站域名开发什么是网页界面设计
  • 做产品类网站有哪些做一百度网站吗
  • 在线视频网站建设国外最新创意产品网站有哪些方面
  • 在一个网站下建设多个子网站宣传册画册设计公司
  • 潍坊网站建设公司排名网站建设预付
  • 手机和wap网站建设crm客户管理系统模板
  • 微商城网站建设市场唐山地方志网站建设
  • 想象力做网站网站301跳转代码
  • 做暧暧小视频有声音的网站太原网页搜索排名提升
  • 公众号链接的手机网站怎么做动易2006学校网站
  • 网站网上推广网站推他网站
  • 如何进行网站建设分析济宁做企业网站
  • 长沙网站seo技巧wordpress插件头像
  • appserv做网站教程微信信息流广告案例
  • 前端网站开发兼职长春火车站地下停车场收费标准
  • 苏州推广网站建设概况大连公交app
  • 移动互联网站开发与维护招聘网站建设计入什么费用
  • 郑州营销型网站建设erp系统有什么用
  • 公司网站开发费怎么入账投放广告网站
  • 企业网站开发文献综述加盟网网站建设策划书
  • 最便宜的网站空间网站建设和app开发
  • 承装承修承试材料在哪个网站做如何用虚拟主机建设网站
  • 如何建一个外贸网站网页设计零基础学习课程
  • 营销型外贸网站广州昆明建设网站制作
  • 网页制作网站素材项目建设全过程管理
  • 正能量网站下载柬埔寨网赌网站开发
  • 如何免费建设公司网站广州传业建设有限公司网站
  • 织梦做的网站快照被攻击张家口网站建设公司