Linux系统编程:进程管理、内存对比与树莓派应用

打印 上一主题 下一主题

主题 1649|帖子 1649|积分 4947

一、认识进程和线程,在Linux系统下检察系统中各进程的编号pid并终止一个进程pid

1.进程和线程

​进程​​:操纵系统分配资源(如内存、CPU时间片)的基本单位。每个进程有独立的内存空间,进程间通信须要较复杂的机制(如管道、信号、共享内存等)。
线程​​:进程内的执行单元,共享同一进程的资源(如内存、文件句柄)。线程间通信更高效,但需注意同步问题(如竞态条件)。
2.用 ps -a 命令检察系统中各进程的编号pid且用 kill 命令终止一个进程pid

命令如下
  1. #在后台运行一个 sleep 120 秒的进程
  2. sleep 120 &
  3. #查看进程的PID
  4. ps -a
  5. 输出示例​​:
  6.   PID TTY          TIME CMD
  7.   1234 pts/0    00:00:00 bash
  8.   5678 pts/1    00:00:00 ps
  9. 终止进程
  10. kill PID(如kill 1234)
复制代码
操纵结果:

二、Linux的“虚拟内存管理”与stm32中的 真实物理内存(内存映射)的区别

1.Linux虚拟内存管理​

虚拟内存是操纵系统对物理内存的抽象层,通过 ​​硬件(MMU)​​ 和 ​​软件(内核页表)​​ 协作实现。
​特性​​​​阐明​​​​虚拟地址空间​​每个进程拥有独立的虚拟地址空间(如0x0000~0xFFFF),与物理内存解耦。​​分页机制​​内存按固定大小(如4KB)分页,通过页表(Page Table)映射虚拟页到物理页或磁盘(Swap)。​​内存掩护​​页表项标志内存权限(读/写/执行),防止非法访问(如代码区只读)。​​按需分配​​物理内存仅在实际访问时分配(触发缺页中断),克制浪费。​​共享内存​​多个进程可共享同一物理页(如动态库代码)。​​Swap机制​​将不活跃的内存页换出到磁盘,缓解物理内存不足。 示例​​:


  • 进程A访问虚拟地址0x1234 → MMU查页表 → 映射到物理地址0x5678。
  • 若目的页不在物理内存中,触发缺页中断 → 内核从磁盘加载该页。
2.STM32物理内存映射​ 

TM32等微控制器无MMU,直接通过​​物理地址访问内存和外设,其设计目的是实时性确定性​​:
​特性​​​​阐明​​​​物理地址直接访问​​全部代码直接操纵物理地址(如0x20000000为SRAM起始地址)。​​内存与外设同一编址​​外设寄存器通过特定地址访问(如0x40000000为GPIOA寄存器地址)。​​静态内存分配​​内存布局在编译时确定(通过链接脚本),无动态分页或互换机制。​​无内存掩护​​全部代码均可访问任意物理地址,易因错误操纵导致系统崩溃。​​确定性耽误​​无地址转换开销,访问外设和内存的时间可准确盘算,适合实时系统。 ​​示例​​:
操纵STM32的GPIO:
  1. volatile uint32_t *GPIOA = (uint32_t*)0x40020000;  // 直接访问GPIOA寄存器地址
  2. *GPIOA |= 0x01;  // 设置PA0引脚为高电平
复制代码
3. 关键区别对比​​

​维度​​​​Linux虚拟内存​​​​STM32物理内存​​​​地址空间​​虚拟地址隔离(进程安全)直接物理地址(无隔离)​​硬件依赖​​依赖MMU实现地址转换无MMU,直接访问物理地址​​内存分配​​动态分页,按需分配静态分配,编译时固定​​内存掩护​​通过页表权限实现(读/写/执行)无掩护,代码可任意修改内存或外设​​实时性​​因地址转换和缺页中断导致耽误不确定访问耽误确定,适合实时控制​​应用场景​​通用多任务系统(如服务器、PC)资源受限的嵌入式实时系统(如电机控制、传感器) 4. 注意事项​



  • ​在Linux中​​:

    • 用户程序通过malloc申请的是虚拟内存,实际物理内存分配由内核管理。
    • 直接访问物理地址需通过/dev/mem或内存映射(mmap),且须要root权限。

  • ​在STM32中​​:

    • 需手动管理内存,克制溢出(如栈、堆大小需在链接脚本中明确定义)。
    • 操纵外设时需严酷遵循寄存器地址和时序,错误写入可能导致硬件故障。

总结:Linux虚拟内存是抽象层​​,解决多任务安全与资源扩展问题;STM32物理内存映射是直接控制​​,满足实时性和硬件服从需求。两者适用于截然不同的场景,明白其差异是开发跨平台系统的关键。
三、Linux系统调用函数 fork()、wait()、exec() 等的寄义和调用方法 

1.用xterminal(大概putty等)远程登录自己阿里云服务器Ubuntu系统的账号,在home目次下创建一个子目次,然后使用vi编辑一个c代码,gcc编译,实现一个系统调用函数的例子

下图为整个命令流程:

c文件起名为fork_exec_wait.c,代码如下(此代码是deepseek写的):
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/wait.h>
  4. int main() {
  5.     pid_t pid = fork();  // 创建子进程
  6.     if (pid < 0) {
  7.         fprintf(stderr, "Fork failed\n");
  8.         return 1;
  9.     } else if (pid == 0) {
  10.         // 子进程执行ls -l命令
  11.         execlp("ls", "ls", "-l", NULL);
  12.         perror("exec failed");  // 若exec失败,输出错误
  13.         return 1;
  14.     } else {
  15.         // 父进程等待子进程结束
  16.         wait(NULL);
  17.         printf("子进程执行完毕。\n");
  18.     }
  19.     return 0;
  20. }
复制代码
 编辑好代码后在下方命令行输入:wq+Enter(一定要Enter!),然后点击发送就退出去了

2.在树莓派中创建账号,在该账号+home目次下,完成同样的操纵

PS:一定要让树莓派跟你的电脑都连你的手机热门!!!
打开putty毗连树莓派(关于树莓派可以看我另一个博客)无表现器安装访问树莓派3B+_如何在没用表现器的情况下给树莓派安装系统-CSDN博客
(1)创建账号(过程如下,详细看上面链接的博客)

(2)授权新账号使用sudo(方便进行安装一些工具等操纵)
指令表明如下: 
  1. //添加
  2. sudo usermod -aG sudo cq   # -a表示追加,-G指定组
  3. //检查
  4. groups cq   # 输出应包含 "sudo"
复制代码

(3)切换账号并安装gcc(编译工具)
指令表明如下:
  1. //切换用户
  2. pi@raspberrypi:~ $ su - cq
  3. //sudo whoami  # 测试sudo权限,返回 "root"
  4. cq@raspberrypi:~ $ sudo whoami
  5. //安装gcc
  6. cq@raspberrypi:~ $ sudo apt install gcc
复制代码
结果如下: 

(4)创建作业目次并编写代码​
  1. //创建目录
  2. mkdir -p ~/work6      
  3. //进入目录
  4. cd ~/syscall_practice   
  5. # 使用nano编辑器(xterminal中用的vi)
  6. nano fork_exec_wait.c     
复制代码
 c文件代码(同xterminal中):
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/wait.h>
  4. int main() {
  5.     pid_t pid = fork();
  6.     if (pid < 0) {
  7.         fprintf(stderr, "Fork失败\n");
  8.         return 1;
  9.     } else if (pid == 0) {
  10.         execlp("ls", "ls", "-l", NULL);
  11.         perror("exec失败");
  12.         return 1;
  13.     } else {
  14.         wait(NULL);
  15.         printf("子进程执行完毕。\n");
  16.     }
  17.     return 0;
  18. }
复制代码
保存退出:Ctrl+O → 回车 → Ctrl+X(nano编辑器操纵)
(5)编译并运行
指令:
  1. //编译
  2. gcc fork_exec_wait.c -o demo
  3. //运行
  4. ./demo                 
复制代码
结果:

四、总结

本次实验我了解了进程和线程,通过查找资料了解了Linux虚拟内存​和​STM32物理内存的区别,还通过Xterminal在阿里云服务器以及通过Putty在树莓派上完成了​系统调用实践。学到了许多,偷偷吐槽一下,putty不能复制粘贴代码,挺难受的。​​

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表