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

丹灶网站设计中国wix网站制作公司

丹灶网站设计,中国wix网站制作公司,wordpress 转dedecms,潍坊建设网站的公司电话文章目录 一、程序存储空间1.1 C语言程序存储空间1.2 用户空间和内核空间1.3 用户模式和内核模式 二、内核调用-系统调用-C语言库函数2.1 系统调用和内核调用2.2 C语言库函数 三、Linux如何执行一个程序 一、程序存储空间 本节说的空间主要是指内存空间#xff0c;即程序如何分… 文章目录 一、程序存储空间1.1 C语言程序存储空间1.2 用户空间和内核空间1.3 用户模式和内核模式 二、内核调用-系统调用-C语言库函数2.1 系统调用和内核调用2.2 C语言库函数 三、Linux如何执行一个程序 一、程序存储空间 本节说的空间主要是指内存空间即程序如何分配和使用内存。 1.1 C语言程序存储空间 可执行程序而不是源代码。 C语言程序的存储空间包括以下几个主要部分 代码段Text Segment 也称正文段 代码段是存储C程序的机器代码的区域。它包含了程序的指令集这些指令由编译器生成并且在程序执行时按照顺序执行。代码段通常是只读的这意味着程序在运行时不能修改它。 数据段Data Segment 数据段用于存储全局变量、静态变量和常量数据。这些数据在程序运行期间存在并且可以被程序的不同函数访问。数据段通常分为初始化数据段.data和未初始化数据段.bss。初始化数据段存储已初始化的全局变量和常量数据而未初始化数据段存储未初始化的全局变量(被自动初始化为0或空指针)。 堆Heap 堆是动态分配的内存区域用于存储程序在运行时动态分配的内存块。堆内存由程序员显式分配和释放通常使用标准库函数如malloc()和free()来进行管理。堆内存的分配和释放可以在程序运行时动态发生因此它的大小和生存期不容易预测。 栈Stack 栈用于存储函数的局部变量、函数参数和函数调用的返回地址。每当函数被调用时一个新的栈帧stack frame会被创建用于存储函数的上下文信息。当函数返回时栈帧会被销毁。栈是一个后进先出LIFO的数据结构通常由操作系统管理。 每个部分还有更加细致的划分比如常量区和全局区。前面列举的是程序运行的时候会被加载到内存中的部分。还有一些其他的段在程序开发和调试期间很有用比如 符号表段Symbol Table Section 符号表是一个数据结构它包含了程序中定义的符号如变量名、函数名等与其在可执行文件中的地址之间的映射关系。符号表通常位于可执行文件的一个独立段中以便在调试和分析期间进行访问。它有助于调试器查找变量或函数的地址以及生成堆栈跟踪信息。调试信息段Debug Information Section 调试信息段包含了程序的调试信息如源代码位置、变量名、数据结构的布局等。这些信息用于生成符号化的错误消息、断点设置和源代码级别的调试。调试信息通常位于可执行文件的一个单独段中例如DWARF格式或COFF格式。字符串表段String Table Section 字符串表段包含了可执行文件中使用的所有字符串包括符号表中的符号名称、调试信息中的源代码文件路径等。这有助于减小可执行文件的大小并提高效率因为它可以避免重复存储相同的字符串。重定位表段Relocation Table Section 重定位表段包含了程序中需要在加载时进行动态链接的地址重定位信息。这些信息指示了在可执行文件中的哪些位置需要进行符号解析和地址重定位。重定位表在动态链接期间使用以确保程序在不同的内存位置上正确运行。 查看各部分大小的命令 rootCQUPTLEI:~/LinuxC/CLanguage# size timetext data bss dec hex filename1603 600 8 2211 8a3 timetext 表示代码段的大小。data 表示数据段的大小。bss 表示未初始化的数据段BSS段的大小。dec 表示十进制总大小。hex 表示十六进制总大小。filename 是程序的文件名。 另外对于运行的程序可以使用pmap查看内存映射情况即各个部分位于内存地址的哪个位置大小如何。 解释 000055d0e02d2000 到 000055d0e02d6000 是程序的代码段和数据段可执行和可读写。000055d0e1b0d000 是程序的堆可读写。00007f852513c000 到 00007f852532a000 是共享的动态链接库libc-2.31.so 和 ld-2.31.so的内存映射具有不同的权限和大小。00007fff3f8dd000 到 00007fff3f9d7000 是进程的栈可读写。ffffffffff600000 是内核的虚拟内存地址范围通常不可执行。 通过地址高低、权限、占用内存大小来判断。也可以使用其他命令。 1.2 用户空间和内核空间 用户空间User Space 和 内核空间Kernel Space 是指操作系统中的两个不同的内存区域用于存放不同类型的程序代码和数据并具有不同的特权级别和访问权限。这两个空间在操作系统中的分隔是为了提高系统的安全性和稳定性。 以下是关于用户空间和内核空间的主要特点和区别 用户空间User Space 应用程序执行区域 用户空间是用于存放用户级别的应用程序代码和数据的区域。大多数应用程序的执行发生在用户空间。 特权级别低 用户空间中的代码和数据运行在较低的特权级别下通常是用户模式User Mode或非特权模式。这意味着用户程序不能直接访问底层硬件资源或进行敏感的系统操作。 有限的权限 用户空间中的程序对于系统资源如硬件设备、内核数据结构等的访问受到限制。程序必须通过系统调用来请求内核执行特权操作例如文件操作、网络通信等。 错误隔离 用户空间的程序通常不能直接影响整个系统的稳定性。如果一个用户空间的应用程序崩溃或出现错误通常不会导致整个系统崩溃。 内核空间Kernel Space 操作系统核心区域 内核空间是操作系统核心内核的执行区域其中包含了操作系统的核心代码和数据结构。操作系统内核负责管理系统资源、进程调度、设备驱动程序等任务。 特权级别高 内核空间中的代码和数据运行在较高的特权级别下通常是内核模式Kernel Mode或特权模式。这使得内核可以直接访问系统的底层硬件资源和进行特权操作。 无限的权限 内核空间中的代码具有无限制的权限可以执行任何操作系统功能并且可以访问系统的所有资源。当然了并非所有硬件资源都可以无限访问需要芯片厂商开放给你才行 系统关键性 内核空间中的代码对于整个系统的稳定性至关重要。内核必须设计得稳定且不容易受到用户空间程序的恶意或错误行为的干扰。 用户空间和内核空间的分隔是为了提高系统的安全性和稳定性。用户空间用于存放应用程序代码和数据而内核空间包含操作系统内核的核心代码和数据。用户程序通过系统调用等接口来请求内核执行特权操作以访问底层资源。这种分隔使得操作系统能够保护系统资源并隔离用户程序的错误从而提高了系统的可靠性和安全性。 在传统的操作系统设计中主要有两个关键的内存空间即用户空间和内核空间用于分离用户应用程序和操作系统内核的执行环境和权限。然而一些特殊的操作系统或安全机制可能引入其他内存区域或权限级别。 以下是一些可能存在的其他内存区域或权限级别 中断上下文Interrupt Context 中断上下文是操作系统内核在响应硬件中断时运行的上下文。这个上下文通常具有比用户空间更高的特权级别因为内核需要能够处理硬件中断并采取适当的措施。中断上下文不同于用户空间和内核空间因为它是由硬件事件触发的。 超级用户/特权级别Supervisor/Privileged Mode 一些操作系统或处理器体系结构可能支持多个特权级别例如用户模式、内核模式和超级用户模式。超级用户模式通常具有更高的权限可以执行特权操作如修改页表或直接访问硬件寄存器。这种多级特权级别的设计可以增强操作系统的安全性和隔离性。 用户模式切换User Mode Switch 在多任务操作系统中内核可能会在不同任务之间进行用户模式切换。这涉及到保存和恢复任务的上下文以便在任务之间切换时能够保持执行状态。这种切换可能涉及到额外的内存区域来存储任务上下文。 内核模块Kernel Module 一些操作系统允许动态加载内核模块这些模块是在内核空间中运行的但它们的加载和卸载过程可能涉及到特殊的内存区域。 1.3 用户模式和内核模式 用户模式User Mode和内核模式Kernel Mode是操作系统和处理器体系结构中的两种不同特权级别或特权模式它们用于控制程序对系统资源的访问和执行权限。 用户模式User Mode 较低特权级别 用户模式是处理器的一种较低特权级别通常用于执行普通用户应用程序。在用户模式中应用程序的执行受到限制不能直接访问底层硬件资源或执行特权操作。 受限制的系统资源访问 应用程序在用户模式下运行时其访问系统资源如文件、设备、内存受到操作系统的控制和限制。应用程序必须通过系统调用等接口来请求内核执行特权操作以访问受保护的资源。 异常处理 如果应用程序执行了非法或无效的操作例如访问受保护的内存区域处理器会生成异常将控制权转移到内核模式下的操作系统内核由内核处理异常。 内核模式Kernel Mode 较高特权级别 内核模式是处理器的一种较高特权级别通常用于执行操作系统内核的代码。在内核模式中内核拥有最高的特权可以直接访问和控制系统的底层硬件资源。 无限制的系统资源访问 内核模式下的操作系统内核可以无限制地访问系统的各种资源包括硬件设备、内存管理、中断处理等。内核模式允许执行特权指令以完成各种系统管理任务。 异常处理和系统调用 内核模式下的操作系统内核负责处理异常情况如硬件故障、非法指令执行等。此外内核模式下的操作系统内核还响应并执行系统调用以满足用户程序的特权操作请求。 拿个微软的图看把 二、内核调用-系统调用-C语言库函数 2.1 系统调用和内核调用 系统调用System Call和内核调用Kernel Call都是操作系统内核提供给用户空间程序的接口用于访问操作系统核心功能的方法。它们允许应用程序执行需要特权级别或操作系统提供的服务如文件操作、网络通信、进程管理等。 虽然它们有相似之处但它们在一些方面有所不同。 系统调用System Call 用户空间和内核空间分离 系统调用是用户空间和内核空间之间的接口。用户空间程序通过系统调用请求内核执行某些任务。 高层接口 系统调用通常是高层次的接口提供了相对较简单的、面向应用程序的方式来访问内核功能。例如C库libc提供了许多系统调用的包装函数以便程序员更容易地使用它们。 通常使用函数调用的方式 系统调用通常通过函数调用的方式来触发例如C语言中的read()、write()、fork()等函数就是系统调用的例子。 具有安全性和权限控制 系统调用是操作系统对用户空间的安全性和权限控制的重要门户。内核会验证用户是否有执行特定系统调用的权限并确保用户程序不能直接访问内核的数据结构。 内核调用Kernel Call 更低级别的接口 内核调用通常是更低级别的接口允许用户程序直接调用内核的功能。这种调用可能涉及到内核内部数据结构和功能因此需要更谨慎的使用。 通常使用汇编或特定编程语言 内核调用通常不是以高级语言函数的形式提供而是以底层的方式实现可能需要使用汇编语言或特定的编程语言来进行调用。 较少的安全性和权限控制 内核调用通常不提供像系统调用那样的安全性和权限控制层。用户程序可以更自由地调用内核的功能但这也使得它们更容易破坏系统稳定性。 通常用于开发操作系统或内核模块 内核调用通常被用于开发操作系统内核本身或内核模块。它们不是一般用户程序的主要接口。 总结系统调用是用户空间程序与内核之间的标准接口提供了高级别的、安全的方式来访问内核功能而内核调用更低级别通常用于开发操作系统或内核模块直接调用内核功能但需要更谨慎的处理。用户程序在编写时通常使用系统调用而操作系统内核的开发者可能需要使用内核调用来开发操作系统本身的部分。 2.2 C语言库函数 系统调用、库函数和内核调用之间存在密切的关系它们共同构成了操作系统和用户程序之间的接口和交互方式 系统调用与库函数的关系 系统调用是操作系统提供给用户程序的接口之一它允许用户程序请求操作系统执行特权级别的任务如文件操作、进程管理、网络通信等。库函数是在用户空间中实现的高级别接口它们通常封装了系统调用提供更方便、更抽象的方式来使用操作系统功能。库函数通常包括对系统调用的封装以及其他一些常用功能的实现。例如C语言的标准库libc包含了许多库函数它们实际上是建立在系统调用之上的。用户程序通常首先调用库函数而库函数可能在需要时调用系统调用来完成具体的操作。这种嵌套关系使得用户程序可以更轻松地访问和使用操作系统功能而不必直接与系统调用交互。 一般来说用户程序调用系统调用接口时会产生一个中断或异常处理器特权级别从用户模式切换到内核模式一个系统调用对应一个系统调用号内核通过特定的号码来调用相应的服务例程。一些列操作完成后内核会将调用结果返回给用户程序特权模式也会切回到用户模式。 三、Linux如何执行一个程序 简要图示 运行一个程序 ./ xxx命令解析首先Shell会解析你输入的命令。在这里./xxx表示在当前目录下运行名为xxx的程序。 程序查找然后Shell会在文件系统中查找你指定的程序。这里它会在当前目录下查找名为xxx的文件。 权限检查接着Shell会检查你是否有执行该程序的权限。如果你没有执行权限Shell将不会启动该程序。 创建进程如果你有执行权限Shell会通过调用fork()函数创建一个新的进程来运行该程序。 加载和执行新创建的进程会加载程序的代码和数据到内存中并开始执行。如果程序是动态链接的那么在这个阶段动态链接器由程序头中的PT_INTERP指定也会被加载到内存中并负责处理如符号解析和重定位等任务。 执行main()函数最后新创建的进程开始执行程序的main函数。当main函数返回时进程结束资源被操作系统回收。 其中创建一个新进程的过程主要涉及以下步骤 调用fork()函数fork()函数会复制当前进程称为父进程创建一个新的进程称为子进程。子进程几乎是父进程在这里指的是shell进程的完全复制包括程序计数器、CPU寄存器、打开文件描述符、信号控制设置等。 分配PID每个进程在系统中都有一个唯一的进程标识符PID。新创建的子进程会被分配一个新的PID。 复制父进程的资源子进程会继承父进程的资源如打开文件、挂起信号等。这些资源是被复制的而不是共享的。也就是说父子进程并不共享这些资源。 返回PID在父进程中fork()函数返回新创建子进程的PID。在子进程中fork()函数返回0。这样程序可以区分父进程和子进程。 执行子进程如果调用fork()后紧接着调用exec()函数子进程就会替换成一个全新的程序开始执行新程序的main函数。 在Linux中一个进程有8种方式可以终止 正常终止有5种方式 从 main 函数返回。调用 exit 函数。调用 _exit 或 _Exit 函数。最后一个线程从其启动例程返回。最后一个线程调用 pthread_exit。 异常终止有3种方式 调用 abort 函数。接收到一个信号并终止。最后一个线程对取消请求做出响应。 拓展说明 exit()函数 exit()函数是C语言的标准库函数定义在stdlib.h头文件中。这个函数用于立即终止调用进程。任何属于该进程的打开的文件描述符都会被关闭该进程的子进程由进程1继承。与return不同exit是系统调用级别的它表示了一个进程的结束。 在C语言程序中exit()函数可以由任何需要终止程序的函数调用 在main函数中当main函数执行完毕并准备返回时会隐式地调用exit()函数。 在其他函数中如果在主函数main()或WinMain()之外的其他函数体内需要退出程序也可以调用exit()函数。 错误处理当程序遇到无法处理的错误情况时可能会调用exit()来立即终止程序。 _exit 和 _Exit _exit()函数是在unistd.h头文件中定义的。它是POSIX.1标准的一部分因此在POSIX兼容的系统如Linux上可用。 _Exit()函数是在stdlib.h头文件中定义的。它是ISO C99标准的一部分因此在支持C99或更高版本的系统上可用。 这两个函数都用于立即终止程序不执行任何清理操作或刷新缓冲区。 abort函数 abort()函数是C语言的一个标准库函数定义在stdlib.h头文件中。这个函数的功能是以非正常的方式终止当前执行的程序。它不接受任何参数也没有返回值。 与exit()函数不同abort()函数会使程序立即终止不会进行常规的清理工作比如清理堆栈、释放内存等。当程序遇到无法恢复的错误条件时可以调用abort()函数来立即终止程序。 以下是一个使用abort()函数的示例代码 #include stdio.h #include stdlib.hint main() {int value 0;printf(Enter an integer greater than zero: );scanf(%d, value);if (value 0) {fprintf(stderr, Invalid input. Program will terminate.\n);abort();}printf(You entered: %d\n, value);return 0; }在上述示例中如果用户输入小于或等于零的整数程序将打印一条错误消息并调用abort()函数来终止程序²。希望这个答案对你有所帮助 程序异常退出的问题 不做清理和不刷新缓冲区 数据丢失如果缓冲区中的数据没有被写入到文件或设备中那么这些数据可能会丢失。例如如果你的程序在崩溃时没有刷新缓冲区那么缓冲区中的数据将无法输出。 资源泄露如果程序在终止时没有进行适当的清理工作可能会导致资源泄露。例如如果你的程序打开了一个文件但没有关闭它那么这个文件描述符就会一直被占用直到系统重启。 性能下降不刷新缓冲区可能会影响程序的性能。例如如果缓冲区满了但没有被刷新那么程序可能需要等待直到有足够的空间来存储新的数据。 数据混乱不刷新缓冲区可能会导致数据混乱。比如发一个数据666还没有被读又发一个数据999这时如果再读就是666999了。 常见的例子是端口被占用。 进程1 在Unix和类Unix系统如Linux中进程1通常是init进程systemd。init进程是系统启动后的第一个进程由内核自动启动。它在系统启动后执行许多重要的任务包括 初始化系统init进程负责启动和配置系统的各个部分。 创建其他进程init进程可以启动其他的系统进程。 收养孤儿进程当一个父进程结束而它的子进程还在运行这些子进程就成为了“孤儿”进程。这些孤儿进程将被init进程“收养”也就是说它们的父进程将变为init。 系统关机或重启当你想要关机或重启系统时这个请求会被发送给init进程由它来完成关机或重启的操作。
http://www.huolong8.cn/news/114707/

相关文章:

  • 学校做网站青羊区建设和交通网站
  • 珠海网站设计如何做输入密码进入网站
  • 可以做系统同步时间的网站网站建设需要考虑什么因素
  • 做五金有哪些网站推广网站包括哪些内容
  • 怎样才能做好网站优化全国十大计算机培训机构
  • python可以做网站后台吗如何做网站淘宝客
  • 新乡营销网站建设中小企业网络规划与设计论文
  • 免费学设计的网站网站模板上传工具
  • 做视频网站用哪个软件好做交易网站需要办什么证
  • 做网站和APP需要多少钱wordpress 主题版权
  • 我想建个自己的网站做国际网站怎么能快速打开
  • 医院网站建设多少钱中国城乡建设部官网
  • 网站做引流外贸求购信息网
  • 网站链接锚文字怎么做做兼职上什么网站
  • 手机单页网站模板jsp网站开发教程
  • 嘉兴网站制作网站建设商城建站系统多少钱
  • 站长工具域名查询社区网站关键词符号
  • 贵州两学一做专题网站个人网站做博客还是做论坛
  • 北京天津网站建设公司网页制作的价格
  • 如何选择网站域名深圳网上办事大厅官网
  • 哈尔滨网站建设论坛河池公司做网站
  • 平台建设网站公司爱网站推广优化
  • 建设服装网站目的和作用做网站工作怀孕
  • 网站怎么赚钱的app定制开发哪个公司好
  • 免备案php网站空间优化设计官方电子版
  • 如何使用腾讯云建网站WordPress瀑布流图片站
  • 网页站点规划网站建设需要什么内容
  • 优质的设计网站有哪些县局网站建设招标
  • 手绘风格的网站代发关键词排名包收录
  • 外贸 网站推广陕西省建设教育培训中心网站